Warum gibt XGrabKey BadRequest zurück?

So arbeite ich an einem Gtk / X11 / Linux app bewirkt eine Bildschirmaufnahme in .gif und eine der Methoden zum Stoppen der Aufnahme ist ein Tastendruck (Esc, Leertaste oder Ende). Sie können auch eine Zeitüberschreitung verwenden. Um jedoch das Drücken der Taste zum Beenden der Erfassung zu implementieren, muss ich in der Lage sein, die Taste so zu greifen, dass ich ein Ereignis abrufen kann, obwohl mein Fenster nicht den Fokus hat (es ist während der Erfassung tatsächlich unsichtbar). Ich glaube XGrabKey ist die richtige X11-Funktion für diese Aufgabe:

Window w = Gtk::gdk_x11_drawable_get_xid(Gtk::gtk_widget_get_window(Handle()));
KeyCode kc = XKeysymToKeycode(Gtk::gdk_display, HotKeyCode);
int r = XGrabKey(   Gtk::gdk_display,
                    kc,
                    0               /* modifiers */,
                    w               /* grab_window */,
                    TRUE            /* owner_events */,
                    GrabModeAsync   /* pointer_mode */,
                    GrabModeAsync   /* keyboard_mode */);
printf("XGrabKey(%p, 0x%x/%x)=%i\n", w, HotKeyCode, kc, r);

Wo 'HotKeyCode' heißt zB XK_Escape oder so was wie

XGrabKey(0x3e00003, 0xff1b/9)=1

XGrabKey gibt "1" oder "BadRequest" zurück. Was mache ich hier falsch?

FYI der tatsächliche Xorg Xserver-Code scheint @ zu seHie.

Bearbeiten: Die neueste Inkarnation des Codes ist:

int x_err_callback(Display *d, XErrorEvent *e)
{
    char msg[256];

    XGetErrorText(d, e->error_code, msg, sizeof(msg));

    printf("X11Error %d (%s): request %d.%d\n",
        e->error_code, msg, e->request_code,
        e->minor_code);

    return 0;
}

Gtk::GdkFilterReturn key_filter(Gtk::GdkXEvent *gdk_xevent,
                                Gtk::GdkEvent *event,
                                Gtk::gpointer data)
{
    XKeyEvent *xevent = gdk_xevent;
    if (xevent->type == KeyPress)
    {
        int key = ((XKeyEvent *)gdk_xevent)->keycode;
        int keysym = XKeycodeToKeysym(Gtk::gdk_display, key, 0);

        printf("caught keysym %i\n", keysym);

        switch (keysym)
        {
            case 1: // your_keysym
                // your key handler code
                break;
        }
    }

    return Gtk::GDK_FILTER_CONTINUE;
}


Gtk::GdkWindow *Root = Gtk::gdk_get_default_root_window();
KeyCode kc = XKeysymToKeycode(Gtk::gdk_display, HotKeyCode);

XSetErrorHandler(x_err_callback);

int r = XGrabKey(   Gtk::gdk_display,
                    kc,
                    AnyModifier /* modifiers */,
                    GDK_WINDOW_XWINDOW(Root) /* grab_window */,
                    TRUE            /* owner_events */,
                    GrabModeAsync   /* pointer_mode */,
                    GrabModeSync    /* keyboard_mode */);

Gtk::gdk_window_set_events(Root,
    (Gtk::GdkEventMask)
    (Gtk::GDK_KEY_PRESS_MASK |
    Gtk::GDK_KEY_RELEASE_MASK));
Gtk::gdk_window_add_filter(NULL, key_filter, this);

AnyModifier führt tatsächlich zu einem Fehler. '0' nicht. Ich kenne das NumLock-Problem ...

Antworten auf die Frage(2)

Ihre Antwort auf die Frage