首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建Linux XCB无框架窗口

创建Linux XCB无框架窗口
EN

Stack Overflow用户
提问于 2019-09-19 13:37:30
回答 2查看 736关注 0票数 1

我想通过XCB创建一个无框架的窗口。我将XCB_CW_OVERRIDE_REDIRECT掩码设置为true。它可以工作,但键盘事件不能工作。

代码语言:javascript
复制
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?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-20 21:54:21

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

在X11中,键盘事件(基本上)被发送到当前具有输入焦点的窗口。通常,输入焦点由窗口管理器管理。由于您正在创建覆盖-重定向窗口,因此窗口管理器看不到您的窗口,也不能将焦点放在该窗口上。因此,你必须自己聚焦你的窗口。请注意,WM仍然可以将焦点提供给其他窗口,从而使您的窗口失去焦点。

实际上,我不确定根据ICCCM聚焦窗口的正确/正确方式是什么。我没有找到快速搜索"override-redirect“或"focus”的相关部分。

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

票数 1
EN

Stack Overflow用户

发布于 2019-09-23 09:00:15

代码语言:javascript
复制
xcb_map_window(connection, window); 
xcb_set_input_focus(connection,XCB_INPUT_FOCUS_POINTER_ROOT,window,XCB_CURRENT_TIME);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58004335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档