我正在尝试用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等结合使用。
有了这个小背景,我该如何向窗口管理器提示窗口应该是全屏的呢?
发布于 2012-11-10 12:52:16
检查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函数。
我希望这些参考资料足以让你上手!
发布于 2021-06-19 00:49:27
我不确定,xcb_change_property是否像规范中所说的那样是正确的选择:
希望更改窗口状态的客户端必须向根窗口发送_NET_WM_STATE客户端消息。
到目前为止,我还没有看到任何WM忽略你使用xcb_change_property设置它。尽管如此,它可能在其他WMs上不起作用。
...必须发送...客户端消息
将转换为以下代码:
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只是一个结构,我在查询原子的值后将其存储在其中。
https://stackoverflow.com/questions/13302982
复制相似问题