我想通过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创建一个无边框的窗口而不会出现按键事件bug?
发布于 2019-09-20 21:54:21
如果您希望覆盖-重定向窗口具有输入焦点,则必须显式xcb_set_input_focus(connection, window);。由于输入焦点只能提供给可视窗口,因此必须在映射窗口后完成。
在X11中,键盘事件(基本上)被发送到当前具有输入焦点的窗口。通常,输入焦点由窗口管理器管理。由于您正在创建覆盖-重定向窗口,因此窗口管理器看不到您的窗口,也不能将焦点放在该窗口上。因此,你必须自己聚焦你的窗口。请注意,WM仍然可以将焦点提供给其他窗口,从而使您的窗口失去焦点。
实际上,我不确定根据ICCCM聚焦窗口的正确/正确方式是什么。我没有找到快速搜索"override-redirect“或"focus”的相关部分。
我的直觉是,处理这个问题的正确方法是不使用覆盖-重定向窗口。
发布于 2019-09-23 09:00:15
xcb_map_window(connection, window);
xcb_set_input_focus(connection,XCB_INPUT_FOCUS_POINTER_ROOT,window,XCB_CURRENT_TIME);https://stackoverflow.com/questions/58004335
复制相似问题