创建 Linux XCB 无框 Window

Create Linux XCB Frameless Window

我想通过 XCB 创建一个无框 window。 我将 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 创建无框架 window 且没有按键事件错误吗?

如果您希望覆盖重定向 window 获得输入焦点,则必须明确 xcb_set_input_focus(connection, window);。由于输入焦点只能提供给可见 windows,因此必须在映射 window.

之后完成此操作

在 X11 中,键盘事件(基本上)发送到当前具有输入焦点的 window。通常,输入焦点由 window 管理器管理。由于您正在创建覆盖重定向 window,window 管理器看不到您的 window 并且无法聚焦它。因此,您必须自己 window 集中精力。请注意,WM 仍然可以将焦点放在其他 windows 上,因此您的 window 失去了焦点。

我实际上不确定 correct/right 根据 ICCCM 聚焦 window 的方法是什么。我没有通过快速搜索 "override-redirect" 或 "focus".

找到相关部分

我的直觉是处理这个问题的正确方法是不使用覆盖重定向 window。

xcb_map_window(connection, window); 
xcb_set_input_focus(connection,XCB_INPUT_FOCUS_POINTER_ROOT,window,XCB_CURRENT_TIME);