首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用xcb提供_NET_WM_STATE_FULLSCREEN提示?

如何使用xcb提供_NET_WM_STATE_FULLSCREEN提示?
EN

Stack Overflow用户
提问于 2012-11-09 14:07:30
回答 2查看 3.7K关注 0票数 5

我正在尝试用xcb编写一个全屏应用程序,用于我自己的启迪,但我在上面遇到了问题。我找到了几段使用Xlib完成此任务的代码,但没有一段使用xcb。我已经找到了xcb_ewmh_connection_t结构,并尝试使用它,如下所示:

代码语言:javascript
复制
xcb_connection_t *Connection = xcb_connect(NULL, NULL);
xcb_ewmh_connection_t EWMH;
xcb_intern_atom_cookie_t *EWMHCookie = xcb_ewmh_init_atoms(Connection, &EWMH);

然后将结构中的原子与EWMH._NET_WM_STATE等结合使用。

有了这个小背景,我该如何向窗口管理器提示窗口应该是全屏的呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-10 12:52:16

检查xcb_ewmh.h,在我看来,您还需要调用

代码语言:javascript
复制
if(!xcb_ewmh_init_atoms_replies(&EWMH, EWMHCookie, NULL))
    /* handle errors */;

完成此操作后,_NET_WM_STATE文档将帮助您了解如何使用此特定属性。

有关这种使用属性与窗口管理器通信的技术的背景,请参阅Client Properties上的ICCCM部分。

有关如何设置属性的一般信息,请参阅ChangeProperty请求。它通过通常的protocol stub rules映射到xcb_change_property函数。

我希望这些参考资料足以让你上手!

票数 3
EN

Stack Overflow用户

发布于 2021-06-19 00:49:27

我不确定,xcb_change_property是否像规范中所说的那样是正确的选择:

希望更改窗口状态的客户端必须向根窗口发送_NET_WM_STATE客户端消息。

到目前为止,我还没有看到任何WM忽略你使用xcb_change_property设置它。尽管如此,它可能在其他WMs上不起作用。

...必须发送...客户端消息

将转换为以下代码:

代码语言:javascript
复制
xcb_client_message_event_t  payload = 
{
    .response_type  = XCB_CLIENT_MESSAGE,
    .type           = atoms._NET_WM_STATE,
    .format         = 32,
    .window         = window_handle,
    .data           =
    {
        .data32[0]  = fullscreen
            ? atoms._NET_WM_STATE_ADD
            : atoms._NET_WM_STATE_REMOVE,
        .data32[1]  = atoms._NET_WM_STATE_FULLSCREEN,
        .data32[2]  = XCB_ATOM_NONE
    }
};

xcb_send_event(
    conn,
    1,
    window_handle,
    XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT
    | XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY,
    (const char*) &payload
);

xcb_flush(conn);

atoms只是一个结构,我在查询原子的值后将其存储在其中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13302982

复制
相关文章

相似问题

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