【问题标题】:How do I provide the _NET_WM_STATE_FULLSCREEN hint with xcb?如何为 xcb 提供 _NET_WM_STATE_FULLSCREEN 提示?
【发布时间】:2012-10-29 11:20:16
【问题描述】:

我正在尝试使用 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等结构内部的原子。

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

【问题讨论】:

    标签: fullscreen xcb ewmh


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 啊,谢谢!我敢肯定,在要求原子后得到原子会有所帮助。 :P 很抱歉成为 xcb 菜鸟,但我在更改属性本身时遇到了一些问题。我是否错误地使用了此功能? xcb_change_property(Connection, XCB_PROP_MODE_REPLACE, WindowID, EWMH._NET_WM_STATE, XCB_ATOM, 32, 1, &(EWMH._NET_WM_STATE_FULLSCREEN));
    • 我想通了!对于那个很抱歉。通过对类型使用 XCB_ATOM_ATOM 而不是 XCB_ATOM 它可以按预期工作。
    • 感谢您的 cmets @cdbfoster 我遇到了同样的问题!
    【解决方案2】:

    我不确定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 只是我在查询原子值后存储原子的结构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-22
      • 2021-12-01
      • 2021-06-14
      • 1970-01-01
      • 2014-03-19
      • 2020-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多