История изменений
Исправление 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 вроде как умеет то, что нужно, но не совсем.