5

我正在尝试使用 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等。

鉴于这个小背景,我如何才能暗示窗口管理器窗口应该是全屏的?

4

2 回答 2

3

检查xcb_ewmh.h,在我看来你也需要打电话

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

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

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

有关如何设置属性的一般信息,请参阅ChangeProperty请求。xcb_change_property这通过通常的协议存根规则映射到函数。

我希望这足以让你继续前进!

于 2012-11-10T04:52:16.060 回答
0

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

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

到目前为止,我还没有看到任何 WM 如果您使用 设置它会忽略它xcb_change_property。不过,它可能不适用于其他 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只是我在查询原子值后存储原子的结构。

于 2021-06-18T16:49:26.850 回答