【问题标题】:Create Linux XCB Frameless Window创建 Linux XCB 无框窗口
【发布时间】:2019-09-19 05:37:29
【问题描述】:

我想通过 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 创建无框窗口而不会出现按键事件错误吗?

【问题讨论】:

  • 如果你真的只是想摆脱WM的窗户装饰,你应该使用主题提示来请求。 OverrideRedirect 做了一些不同的事情(而且做得更多)。

标签: linux x11 xcb


【解决方案1】:

如果您希望覆盖重定向窗口具有输入焦点,则必须明确xcb_set_input_focus(connection, window);。由于输入焦点只能赋予可视窗口,因此必须在映射窗口后完成。

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

我实际上不确定每个 ICCCM 聚焦窗口的正确/正确方法是什么。我没有找到快速搜索“覆盖重定向”或“焦点”的相关部分。

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

【讨论】:

  • 在 GTK 和 Qt 中,上下文菜单是覆盖重定向窗口,只需抓住键盘和鼠标即可获取它们的输入。因此,如果您的应用程序在其菜单可见时碰巧遇到了断点,那么您就有问题了...(有 various ways 可以取消抓取,但您仍然需要做一些事情才能摆脱这种情况。)
  • xcb_map_window(连接,窗口); xcb_set_input_focus(连接,XCB_INPUT_FOCUS_POINTER_ROOT,窗口,XCB_CURRENT_TIME);解决这个问题。谢谢!!!!
【解决方案2】:
xcb_map_window(connection, window); 
xcb_set_input_focus(connection,XCB_INPUT_FOCUS_POINTER_ROOT,window,XCB_CURRENT_TIME);

【讨论】:

  • 嗨,欢迎来到 Stack Overflow。通常,当发布答案时,需要提供更多关于答案的细节。在这种情况下:发布的代码如何做提问者想要的?有一个解决方案很好,但最好知道它是如何工作的以及为什么工作。这可能会有所帮助:How to Answer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
相关资源
最近更新 更多