我正在尝试用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
等结构内部的原子
鉴于这个小背景,我怎样才能暗示窗口管理器窗口应该全屏?
答案 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
只是一个结构体,我在查询它们的值后存储原子。