Терминал в оконном менеджере XLIB не получает нажатий клавиш с «OnBoard» на экранной клавиатуре - PullRequest
1 голос
/ 09 февраля 2020

Рассмотрим следующий минимальный оконный менеджер, найденный в сети. Он компилируется и работает нормально.

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

int main()
{
    Display *display;
    Window window;
    XEvent event;
    int s;

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

    s = DefaultScreen(display);

    /* create window */
    window = XCreateSimpleWindow(display, RootWindow(display, s), 10, 10, 200, 200, 1,
                           BlackPixel(display, s), WhitePixel(display, s));

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

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

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

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

            /* exit on ESC key press */
            if ( event.xkey.keycode == 0x09 )
                break;
        }
        else if (event.type == KeyRelease)
        {
            printf( "KeyRelease: %x\n", event.xkey.keycode );
        }
    }

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

    return 0;
}

В этом оконном менеджере я могу загрузить терминал (например, xterm) и программу «onboard» на экранной клавиатуре с Ubuntu (дополнение сервера, с установленным xinit). Встроенная экранная клавиатура не отправляет ввод данных другим windows в этом минимальном оконном менеджере (встроенные нагрузки в нижней области экрана).

Обратите внимание, что минималистский оконный менеджер DWM работает должным образом (встроенный входные данные отправляются всем остальным windows). Я не могу найти в источнике DWM, где рассматриваются подобные вещи.

У меня такой вопрос: как заставить этот оконный менеджер минималистов разрешать встроенной экранной клавиатуре отправлять ввод другим windows?

1 Ответ

0 голосов
/ 10 февраля 2020

Нашел решение. Я должен был использовать XSetInputFocus на терминале, тогда ввод идет туда правильно.

//e.window is the program window for the program that should get the input.
XSetInputFocus(mDisplay, e.window, RevertToPointerRoot, CurrentTime);
...