如何使用xcb提供_NET_WM_STATE_FULLSCREEN提示?

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 等原子来实现。

2个回答

3

查看 xcb_ewmh.h 文件,我认为您还需要调用以下代码:

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

一旦你完成了这些步骤,_NET_WM_STATE文档应该有助于了解如何使用此特定属性。
请参阅ICCCM部分的客户端属性,以了解使用属性与窗口管理器通信的技术背景。
请参阅ChangeProperty请求,了解如何设置一般属性。按照通常的协议存根规则,它对应于xcb_change_property函数。
希望这些参考资料足够帮助你开始!

1
啊,谢谢!我相信在请求后实际获取原子将会有所帮助。:P 抱歉我是一个 xcb 新手,但我在更改属性本身方面遇到了一些问题。我是否错误地使用了这个函数? xcb_change_property(Connection, XCB_PROP_MODE_REPLACE, WindowID, EWMH._NET_WM_STATE, XCB_ATOM, 32, 1, &(EWMH._NET_WM_STATE_FULLSCREEN)); - cdbfoster
3
我明白了!对此抱歉。通过将类型更改为XCB_ATOM_ATOM而不是XCB_ATOM,它可以按预期工作。 - cdbfoster
感谢您的评论 @cdbfoster,我也遇到了同样的问题! - Noitidart

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只是一个结构体,用于在查询其值后存储原子。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接