XGrabKeyboard () не работает вне цикла обработки событий - PullRequest
0 голосов
/ 06 января 2019

Я написал небольшой код, чтобы привязать клавиатуру к конкретному окну. Захват отлично работает при использовании цикла while (1). Но при использовании до / вне цикла while (1) захват не выполняется.

Я хотел знать причину этого странного поведения.

Вот код:

#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    Display *d;
    Window window;
    XEvent event, ev;
    int s;

    /* open connection with the server */
    d = XOpenDisplay(NULL);
    if (d == NULL)
    {
        fprintf(stderr, "Cannot open d\n");
        exit(1);
    }

    s = DefaultScreen(d);

    /* create window */
    window = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 400, 100, 1,
                           BlackPixel(d, s), BlackPixel(d, s));

    XSelectInput(d, window, StructureNotifyMask | ExposureMask | KeyPressMask | KeyReleaseMask | Button1Mask | Button2Mask | ButtonPressMask);

    /* map (show) the window */
    XMapWindow(d, window);


    // Error here !!!!
    if(XGrabKeyboard(d, window, True, GrabModeAsync, GrabModeAsync, CurrentTime) == GrabSuccess)
        printf("Black window grabbed before loop\n");
    else
        printf("Grab Unsuccessful\n");

    /* event loop */
    while (1)
    {
        XNextEvent(d, &event);
        printf("Here at start\n");  
        if(event.type == ButtonPress)
            printf("Button Clicked\n");     

        if(event.type == KeyPress)
        {
            printf("%x key pressed\n", event.xkey.keycode);

            // exit on ESC key press 
            if ( event.xkey.keycode == 0x09 )
                break;
            if(event.xkey.keycode == 37) //Just that if LeftCtrl is pressed, grabbing happens
            {
                if(XGrabKeyboard(d, window, True, GrabModeAsync, GrabModeAsync, CurrentTime) == GrabSuccess)
                    printf("Black window grabbed\n");

            }
        }
    }

    /* close connection to server */
    XCloseDisplay(d);

    return 0;
}
...