Mon but est d'avoir un programme qui dort en arrière-plan mais qui peut être activé par l'utilisateur via une "touche de raccourci". De creuser autour du manuel Xlib et le manuel Xlib O'reilly, je comprends que la bonne façon d'y parvenir est avec XGrabKey. Cependant, ma compréhension du processus est incorrecte, car une simple preuve de concept ne fonctionne pas.Hotkey global avec X11/Xlib
Ma compréhension est que si je l'appelle XGrabKey avec la fenêtre racine comme grab_window et owner_events false, chaque fois que mon raccourci clavier est enfoncé, l'événement sera envoyé seulement à la fenêtre racine. Si je sélectionne ensuite les événements KeyPress dans la fenêtre racine, puis que j'écoute des événements X, je devrais obtenir un événement de pression de touche lorsque la touche de raccourci est enfoncée. J'ai collé un exemple minimal ci-dessous. Ce que je m'attend à ce que lorsque le programme est exécuté, indépendamment de ce que la fenêtre a le focus, si Ctrl + Shift + K est pressé, mon programme devrait afficher "Hotkey pressé!" dans la console, puis se terminer. De plus, si je comprends bien, si XGrabKey échoue, le gestionnaire d'erreurs par défaut affichera un message, et comme ce n'est pas le cas, je suppose que l'appel réussit.
De toute évidence, ma compréhension est imparfaite en quelque sorte. Est-ce que quelqu'un peut-il me montrer la bonne 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_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;
}
Dans votre code que vous utilisez 'XK_Y', vous pouvez veux dire 'XK_K' à la place? –