How to properly use XGrabKey to get a program hotkey

cheshirekow cheshirekow at
Wed Oct 27 11:56:13 PDT 2010


My goal is to have a program that sleeps in the background but can be 
activated by the user via some "hotkey". From digging around the Xlib 
manual and the Xlib O'reilly manual, I gather that the correct way to to 
this is with XGrabKey. However my understanding of the process is 
incorrect as a simple proof of concept does not work.

My understanding is that if I call XGrabKey with the root window as the 
grab_window, and owner_events false, then whenever my hotkey is pressed 
the event will be sent *only* to the root window. If I then select 
KeyPress events from the root window, and then listen for X events, I 
should get a key press event when the hotkey is pressed. I've pasted a 
minimal example below.

What I expect is that when the program is run, regardless of what window 
has focus, if Ctrl+Shift+K is pressed, my program should output "Hot key 
pressed!" in the console, and then terminate.

Furthermore, it is my understanding that if the XGrabKey fails, the 
default error handler will display a message, and since it does not I am 
assuming that the call succeeds.

Obviously, my understanding is flawed somehow. Can anyone point me in 
the right direction?



#include <iostream>
#include <X11/Xlib.h>
#include <X11/Xutil.h>

using namespace std;

int main()
     Display*    dpy     = XOpenDisplay(0);
     Window      root    = DefaultRootWindow(dpy);
     XEvent      ev;

     unsigned int    modifiers       = ControlMask | ShiftMask;
     int             keycode         = XKeysymToKeycode(dpy,XK_K);
     Window          grab_window     =  root;
     Bool            owner_events    = False;
     int             pointer_mode    = GrabModeAsync;
     int             keyboard_mode   = GrabModeAsync;

     XGrabKey(dpy, keycode, modifiers, grab_window, owner_events, 

     XSelectInput(dpy, root, KeyPressMask);
         bool shouldQuit = false;
         XNextEvent(dpy, &ev);
             case KeyPress:
                 cout << "Hot key pressed!" << endl;	
                 shouldQuit = true;



     return 0;

More information about the xorg mailing list