如何使用xcb提供_NET_WM_STATE_FULLSCREEN提示?

时间:2012-11-09 06:07:30

标签: fullscreen xcb ewmh

我正在尝试用xcb编写一个全屏应用程序,用于我自己的启发,我遇到了上述问题。我发现了一些使用Xlib执行此操作的代码,但没有使用xcb。我找到了xcb_ewmh_connection_t结构,我试探性地使用它:

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等结构内部的原子

鉴于这个小背景,我怎样才能暗示窗口管理器窗口应该全屏?

2 个答案:

答案 0 :(得分:3)

检查xcb_ewmh.h,我觉得你也需要打电话

if(!xcb_ewmh_init_atoms_replies(&EWMH, EWMHCookie, NULL))
    /* handle errors */;

完成后,_NET_WM_STATE文档应该有助于了解如何使用此特定属性。

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

请参阅ChangeProperty请求,了解如何设置属性。这通常会protocol stub rules映射到xcb_change_property函数。

我希望有足够的参考资料让你前进!

答案 1 :(得分:0)

我不确定 xcb_change_property 是否是规范所述的正确方法:

<块引用>

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

不过,到目前为止,如果您使用 xcb_change_property 设置它,我还没有看到任何 WM 会忽略它。不过,它可能不适用于其他 WM。


<块引用>

[...] 必须发送 [...] 一个客户端消息

将转换为以下代码:

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 只是一个结构体,我在查询它们的值后存储原子。