LINUX.ORG.RU

История изменений

Исправление KivApple, (текущая версия) :

Попробовал такое:

XGrabKey(display, XKeysymToKeycode(display, XK_BackSpace), AnyModifier, DefaultRootWindow(display), True, GrabModeAsync, GrabModeAsync);

и такое:

XGrabKey(display, AnyKey, AnyModifier, DefaultRootWindow(display), True, GrabModeAsync, GrabModeAsync);

Первый вариант позволяет мне отлавливать Backspace как если бы эти события были адресованы моему приложению, однако в итоге я перехватываю нажатия - настоящему получателю они уже не доходят. А мне нужно лишь определять нажатые клавиши, но оставлять нормальное поведение.

Второй вариант ничего не делает, однако всё становится яснее, если сделать небольшую тестовую программу:

#include <X11/Xlib.h>
#include <X11/keysym.h>
#include <stdio.h>

int main() {
    Display *d = XOpenDisplay(0);
    Window root = DefaultRootWindow(d);

    int rv = XGrabKey(d, AnyKey, AnyModifier, root, 1, GrabModeAsync, GrabModeAsync);
    printf("XGrabKey returned %d\n", rv);

    XEvent evt;
    while(1) {
        XNextEvent(d, &evt);
        printf("Got event %d\n", evt.type);
    }
}

При запуске получаем ошибку:

XGrabKey returned 1
X Error of failed request:  BadAccess (attempt to access private resource denied)
  Major opcode of failed request:  33 (X_GrabKey)
  Serial number of failed request:  7
  Current serial number in output stream:  7

То есть XGrabKey вроде как умеет то, что нужно, но не совсем.

Исходная версия KivApple, :

Попробовал такое:

XGrabKey(display, XKeysymToKeycode(display, XK_BackSpace), AnyModifier, DefaultRootWindow(display), True, GrabModeAsync, GrabModeAsync);

и такое:

XGrabKey(display, AnyKey, AnyModifier, DefaultRootWindow(display), True, GrabModeAsync, GrabModeAsync);

Первый вариант позволяет мне отлавливать Backspace как если бы эти события были адресованы моему приложению, однако в итоге я перехватываю нажатия - настоящему получателю они уже не доходят. А мне нужно лишь определять нажатые клавиши, но не оставлять нормальное поведение.

Второй вариант ничего не делает, однако всё становится яснее, если сделать небольшую тестовую программу:

#include <X11/Xlib.h>
#include <X11/keysym.h>
#include <stdio.h>

int main() {
    Display *d = XOpenDisplay(0);
    Window root = DefaultRootWindow(d);

    int rv = XGrabKey(d, AnyKey, AnyModifier, root, 1, GrabModeAsync, GrabModeAsync);
    printf("XGrabKey returned %d\n", rv);

    XEvent evt;
    while(1) {
        XNextEvent(d, &evt);
        printf("Got event %d\n", evt.type);
    }
}

При запуске получаем ошибку:

XGrabKey returned 1
X Error of failed request:  BadAccess (attempt to access private resource denied)
  Major opcode of failed request:  33 (X_GrabKey)
  Serial number of failed request:  7
  Current serial number in output stream:  7

То есть XGrabKey вроде как умеет то, что нужно, но не совсем.