No error on xcb_grab_key but event loop not catching (Global Hotkey)

后端 未结 1 730
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-19 23:16

I am trying to set up a global hotkey on Linux.

I had initially used x11 (libX11.so) however I had to do this from a thread. I tried it but the XP

相关标签:
1条回答
  • 2020-12-19 23:40

    Figured it out at long last!! Ah figured this one out! I was using XCB_MOD_MASK_ANY and this constant works on Debian but not on Ubuntu, which is what I was using to test. I switched that up to use num lock, caps lock etc and now it works! :)

    ostypes.API('xcb_grab_key')(conn, 1, screens.data.contents.root, ostypes.CONST.XCB_MOD_MASK_LOCK, keycodesArr[j], ostypes.CONST.XCB_GRAB_MODE_ASYNC, ostypes.CONST.XCB_GRAB_MODE_ASYNC); // caps lock
    ostypes.API('xcb_grab_key')(conn, 1, screens.data.contents.root, ostypes.CONST.XCB_MOD_MASK_2, keycodesArr[j], ostypes.CONST.XCB_GRAB_MODE_ASYNC, ostypes.CONST.XCB_GRAB_MODE_ASYNC); // num lock
    ostypes.API('xcb_grab_key')(conn, 1, screens.data.contents.root, ostypes.CONST.XCB_MOD_MASK_LOCK | ostypes.CONST.XCB_MOD_MASK_2, keycodesArr[j], ostypes.CONST.XCB_GRAB_MODE_ASYNC, ostypes.CONST.XCB_GRAB_MODE_ASYNC); // caps lock AND num lock
    

    that was very very crazy i had no idea the XCB_MOD_MASK_ANY constant didnt work on Ubuntu -

    var rez_grab = ostypes.API('xcb_grab_key')(conn, 1, screens.data.contents.root, ostypes.CONST.XCB_MOD_MASK_ANY, keycodesArr[j], ostypes.CONST.XCB_GRAB_MODE_ASYNC, ostypes.CONST.XCB_GRAB_MODE_ASYNC);
    

    I also tried @n.m's code. On ubuntu it didnt work, but worked on debian -

    #include <xcb/xcb.h>
    #define XK_LATIN1
    #include <xcb/xcb_keysyms.h>
    #include <X11/keysymdef.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int
    main ()
    {
      xcb_connection_t *conn;
    
      conn = xcb_connect (NULL, NULL);
    
      xcb_key_symbols_t * keysyms = xcb_key_symbols_alloc(conn);
    
      xcb_keycode_t * keycodesPtr = xcb_key_symbols_get_keycode(keysyms, XK_space);
    
      const xcb_setup_t* setup = xcb_get_setup(conn);
    
      xcb_screen_iterator_t screens = xcb_setup_roots_iterator(setup);
      int screensCnt = screens.rem;
    
      for (int i=0; i<screensCnt; i++) {
    
          xcb_void_cookie_t rez_grab = xcb_grab_key(conn, 1, screens.data->root, XCB_MOD_MASK_ANY, keycodesPtr[0], XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
    
          const static uint32_t values[] = { XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_BUTTON_PRESS };
    
          xcb_change_window_attributes (conn, screens.data->root, XCB_CW_EVENT_MASK, values);
    
          xcb_screen_next(&screens);
      }
    
      xcb_flush(conn);
    
      // start event loop
      while (1) {
          xcb_generic_event_t *ev = xcb_wait_for_event(conn);
    
          if (ev && ((ev->response_type & ~0x80) == XCB_KEY_PRESS))
          {
              xcb_key_press_event_t *kp = (xcb_key_press_event_t *)ev;
              printf ("Got key press %d\n", (int)kp->event);
          }
    
          if (ev != NULL) {
              free(ev);
          }
      }
    
      return 0;
    }
    
    0 讨论(0)
提交回复
热议问题