Mi objetivo es tener un programa que duerma en segundo plano pero que pueda ser activado por el usuario mediante una "tecla de acceso rápido". Después de excavar el manual de Xlib y el manual de Xlib O'reilly, veo que la forma correcta de hacerlo es con XGrabKey. Sin embargo, mi comprensión del proceso es incorrecta ya que una simple prueba de concepto no funciona.Global Hotkey con X11/Xlib
Mi opinión es que si llamo XGrabKey con la ventana raíz que la grab_window y owner_events falsa, entonces cada vez que se pulsa la tecla de acceso directo a mi evento será enviado solamente a la ventana raíz. Si a continuación, selecciono KeyPress events desde la ventana raíz, y luego escucho los eventos X, debería obtener un evento de pulsación de tecla cuando se presiona la tecla rápida. He pegado un ejemplo mínimo a continuación.
Lo que espero es que cuando se ejecuta el programa, independientemente de qué ventana tenga el foco, si se presionan Ctrl + Shift + K, mi programa debería generar "¡Tecla presionada!" en la consola, y luego terminar.
Además, tengo entendido que si falla la XGrabKey, el controlador de errores predeterminado mostrará un mensaje, y como no es así, supongo que la llamada tiene éxito.
Obviamente, mi comprensión es defectuosa de alguna manera. ¿Alguien puede señalarme en la dirección correcta?
#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_Y);
Window grab_window = root;
Bool owner_events = False;
int pointer_mode = GrabModeAsync;
int keyboard_mode = GrabModeAsync;
XGrabKey(dpy, keycode, modifiers, grab_window, owner_events, pointer_mode,
keyboard_mode);
XSelectInput(dpy, root, KeyPressMask);
while(true)
{
bool shouldQuit = false;
XNextEvent(dpy, &ev);
switch(ev.type)
{
case KeyPress:
cout << "Hot key pressed!" << endl;
XUngrabKey(dpy,keycode,modifiers,grab_window);
shouldQuit = true;
default:
break;
}
if(shouldQuit)
break;
}
XCloseDisplay(dpy);
return 0;
}
En su código que use 'XK_Y', es posible ¿Quieres decir 'XK_K' en su lugar? –