使用 XCB 以编程方式最小化窗口

问题描述 投票:0回答:1

我目前正在为我的游戏引擎编写 Linux 端窗口,我希望有一个选项可以以编程方式最小化/恢复窗口。

我决定使用 XCB 而不是 Xlib,因为我现在已经写了几乎全部内容,所以我不想回去。我尝试的(基于成功的最大化实现)是发送一个将 _NET_WM_STATE 设置为 _NET_WM_STATE_HIDDEN 的客户端事件。代码如下所示:

xcb_intern_atom_reply_t* _net_wm_state = xcb_intern_atom_reply(connection, xcb_intern_atom(connection, true, strlen("_NET_WM_STATE"), "_NET_WM_STATE"), nullptr);
xcb_intern_atom_reply_t* _net_wm_state_hidden = xcb_intern_atom_reply(connection, xcb_intern_atom(connection, true, strlen("_NET_WM_STATE_HIDDEN"), "_NET_WM_STATE_HIDDEN"), nullptr);

// Some code here...

xcb_client_message_data_t data{};
data.data32[0] = true; // yes, I want to minimise the window
data.data32[1] = _net_wm_state_hidden->atom;

xcb_client_message_event_t event{};
event.response_type = XCB_CLIENT_MESSAGE;
event.format = 32;
event.window = windowHandle;
event.type = _net_wm_state;
event.data = data;

xcb_send_event(connection, true, windowHandle, XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, (char*)&event);
xcb_flush(connection);

为了最大化和进入/退出全屏,我使用了基本相同的代码,只是原子不同。这些有效,但这个不行。

c++ x11 xcb
1个回答
0
投票

在 X11 中,最小化窗口与

_NET_WM_STATE_HIDDEN
无关。 相反,您需要发送
XCB_ICCCM_WM_STATE_ICONIC

应该是这样的:

xcb_intern_atom_reply_t* wm_change_state = xcb_intern_atom_reply(connection, xcb_intern_atom(connection, true, strlen("WM_CHANGE_STATE"), "WM_CHANGE_STATE"), nullptr);

xcb_client_message_data_t data{};
data.data32[0] = XCB_ICCCM_WM_STATE_ICONIC;

xcb_client_message_event_t event{};
event.response_type = XCB_CLIENT_MESSAGE;
event.format = 32;
event.window = windowHandle;
event.type = wm_change_state->atom;
event.data = data;

xcb_send_event(connection, false, windowHandle, XCB_EVENT_MASK_STRUCTURE_NOTIFY, (char*)&event);
xcb_flush(connection);

free(wm_change_state);
© www.soinside.com 2019 - 2024. All rights reserved.