Я пытаюсь использовать XCB, чтобы получить все ключи с любыми модификаторами (глобально). В руководстве по функции xcb_grab_key сказано, что XCB_GRAB_ANY используется для всех ключей, а XCB_MOD_MASK_ANY - для любого модификатора, но когда я использую любой из них, он не работает: (
Вот пример программы:
#include <stdio.h>
#include <stdlib.h>
#define XK_LATIN1
#include <xcb/xcb.h>
#include <xcb/xcb_keysyms.h>
#include <X11/keysymdef.h>
int main () {
xcb_connection_t *connection = xcb_connect(NULL, NULL);
xcb_screen_t *screen = xcb_setup_roots_iterator(xcb_get_setup(connection)).data;
xcb_key_symbols_t * keysyms = xcb_key_symbols_alloc(connection);
xcb_keycode_t * keycodesPtr = xcb_key_symbols_get_keycode(keysyms, XK_space);
// grabbing a specific key (in this case space) with specific or no modifiers (in this case none) like this works
xcb_grab_key(connection, 1, screen->root, XCB_NONE, keycodesPtr[0], XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
// grabbing with XCB_MOD_MASK_ANY (any modifier) like this doesn't work
xcb_grab_key(connection, 1, screen->root, XCB_MOD_MASK_ANY, keycodesPtr[0], XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
// grabbing with XCB_GRAB_ANY (any key) like this doesn't work
xcb_grab_key(connection, 1, screen->root, XCB_NONE, XCB_GRAB_ANY, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
xcb_flush(connection);
xcb_generic_event_t *event;
while ( (event = xcb_wait_for_event(connection)) ) {
switch (event->response_type & ~0x80) {
case XCB_KEY_PRESS: {
puts("key press");
break;
}
case XCB_KEY_RELEASE: {
puts("key release");
break;
}
}
free(event);
}
return 0;
}
Если Я go просматриваю и комментирую другие "xcb_grab_key", только верхний из них работает.
Этот пост нашел то же самое, но как я могу исправить / обойти это, когда я хотите все ключи с любыми модификаторами?
Я нахожусь на Void Linux.