Запись нескольких нажатий клавиш в x11 - PullRequest
0 голосов
/ 04 января 2019

Я хочу записывать одновременные нажатия клавиш и тестировать функцию в x11 с помощью C. Например, я смог установить что-то вроде: если нажать «Q», пусть размер окна изменится.

Но я не смог найти способ сделать то же самое с комбинацией клавиш, такой как Ctrl + Enter и т. Д., Чтобы при нажатии клавиши Ctrl + Enter размер окна изменялся.

Существует ли какой-либо тип события, маска или функция в x11 для записи этих одновременных ключевых событий?

Код ниже - это то, что я написал для записи отдельных клавиш и выполнения заданного действия.

// USES KEYBOARD KEY TO RESIZE A WINDOW

// Compile : gcc -o go key_and_win.c -lX11

#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, 200, 200, 1,
                           BlackPixel(d, s), BlackPixel(d, s));

    /* select kind of events we are interested in */
    XSelectInput(d, window, StructureNotifyMask | ExposureMask | KeyPressMask | KeyReleaseMask );

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

    /* event loop */
    while (1)
    {
        XNextEvent(d, &event);

        /* keyboard events */
        if (event.type == KeyPress)
        {
            printf( "KeyPress: %x\n", event.xkey.keycode );         

            if(event.xkey.keycode == 0x18)      // Resize on pressing Q as, key Q => 0x18
            {
                printf("Here in Q\n");

                int r = XResizeWindow(d, window, 100, 200);     // Resizing the window through Q keypress
                if(r==BadValue || r==BadWindow)
                    printf("Error in resizing\n");

                XNextEvent(d, &event);                          // To get ConfigureNotify event
                if(event.type == ConfigureNotify)
                    printf("Resized!\n");
                else
                    printf("Not resized\n");
                //XMapWindow(d, window);                            // Map the resized window   (not necessary)
            }
            /* exit on ESC key press */
            if ( event.xkey.keycode == 0x09 )
                break;
        }
    }

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

    return 0;
}

1 Ответ

0 голосов
/ 04 января 2019

Вы должны посмотреть на event.xkey.state

из 10.5.2 События клавиатуры и указателя : Элемент состояния устанавливается для указания логического состояния кнопок указателя и клавиш-модификаторов непосредственно перед событием, которое является побитовым включением ИЛИ одной или нескольких масок клавиш или клавиш-модификаторов: Button1Mask, Button2Mask, Button3Mask, Button4Mask, Button5Mask , ShiftMask , LockMask , ControlMask , Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask и Mod5Mask.

...