Создать Linux XCB Безрамное Окно - PullRequest
1 голос
/ 19 сентября 2019

Я хочу создать безрамное окно с помощью XCB.Я установил для маски XCB_CW_OVERRIDE_REDIRECT значение true.Это работает, но событие клавиатуры не может работать.

uint32_t value_mask, value_list[32];

window = xcb_generate_id(connection);

value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
value_list[0] = screen->black_pixel;
value_list[1] =
    XCB_EVENT_MASK_KEY_RELEASE |
    XCB_EVENT_MASK_KEY_PRESS |
    XCB_EVENT_MASK_EXPOSURE |
    XCB_EVENT_MASK_STRUCTURE_NOTIFY |
    XCB_EVENT_MASK_POINTER_MOTION |
    XCB_EVENT_MASK_BUTTON_PRESS |
    XCB_EVENT_MASK_BUTTON_RELEASE;

if (settings.fullscreen)
{
    width = destWidth = screen->width_in_pixels;
    height = destHeight = screen->height_in_pixels;
}

xcb_create_window(connection,
    XCB_COPY_FROM_PARENT,
    window, screen->root,
    0, 0, width, height, 0,
    XCB_WINDOW_CLASS_INPUT_OUTPUT,
    screen->root_visual,
    value_mask, value_list);


const uint32_t values[] ={true,};
xcb_change_window_attributes (connection, window, XCB_CW_OVERRIDE_REDIRECT, values);

Кто-нибудь знает, как создать безрамное окно с помощью xcb без ошибок события нажатия клавиши?

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Если вы хотите, чтобы у окна переопределения перенаправления был фокус ввода, вы должны явно xcb_set_input_focus(connection, window);.Поскольку фокус ввода может быть дан только видимым окнам, это необходимо сделать после того, как вы отобразили свое окно.

В X11 события клавиатуры (в основном) отправляются окну, которое в данный момент имеет фокус ввода.Обычно фокус ввода управляется диспетчером окон.Поскольку вы создаете окно переопределения перенаправления, оконный менеджер не видит ваше окно и не может сфокусировать его.Таким образом, вы должны сосредоточить свое окно самостоятельно.Обратите внимание, что WM все еще может фокусировать другие окна, и, таким образом, ваше окно теряет фокус.

Я не совсем уверен, каков правильный / правильный способ фокусировки вашего окна в соответствии с ICCCM.Я не нашел соответствующего раздела с быстрым поиском «override-redirect» или «focus».

Мне кажется, что правильный способ решить эту проблему - не использовать окно override-redirect.

0 голосов
/ 23 сентября 2019
xcb_map_window(connection, window); 
xcb_set_input_focus(connection,XCB_INPUT_FOCUS_POINTER_ROOT,window,XCB_CURRENT_TIME);
...