Создать безрамное окно Linux XCB

Я хочу создать безрамное окно с помощью 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 без ошибок при нажатии клавиш?


person engineer1109    schedule 19.09.2019    source источник
comment
Если вы действительно просто хотите избавиться от украшения окна WM, вы должны использовать подсказки мотива, чтобы запросить это. OverrideRedirect делает что-то другое (и делает намного больше).   -  person Uli Schlachter    schedule 20.09.2019


Ответы (2)


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

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

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

Я чувствую, что правильный способ справиться с этой проблемой — не использовать окно переопределения-перенаправления.

person Uli Schlachter    schedule 20.09.2019
comment
В GTK и Qt контекстные меню, которые являются окнами переопределения-перенаправления, просто получают свой ввод, захватывая клавиатуру и мышь. Таким образом, если ваше приложение попадает в точку останова, когда его меню видно, у вас проблема... (Существуют различные способы, чтобы разблокировать, но вам все равно нужно что-то сделать, чтобы выбраться из этого.) - person Ruslan; 20.09.2019
comment
xcb_map_window (соединение, окно); xcb_set_input_focus (соединение, XCB_INPUT_FOCUS_POINTER_ROOT, окно, XCB_CURRENT_TIME); Решите эту проблему. Спасибо!!!! - person engineer1109; 22.09.2019

person    schedule
comment
Привет и добро пожаловать в Stack Overflow. Обычно, когда ответы публикуются, требуется немного больше подробностей, связанных с ответом. В этом случае: как опубликованный код делает то, что хотел вопрошающий? Здорово иметь решение, но еще лучше знать, как и почему оно работает. Это может быть полезно: Как ответить - person Jim Hayes; 23.09.2019