实现 client 窗口自带最大化按钮功能

This commit is contained in:
2026-02-26 00:23:27 +08:00
parent 89275d0643
commit 8c0b295115

View File

@@ -132,6 +132,32 @@ static void map_request(xcb_map_request_event_t *ev) {
p_delete(&wa_reply);
}
typedef enum _NET_WM_STATE_ACTION : uint32_t {
_NET_WM_STATE_ADD = 1,
_NET_WM_STATE_REMOVE = 0,
_NET_WM_STATE_TOGGLE = 2,
} _NET_WM_STATE_ACTION;
static inline bool get_bool_property(bool init_property,
_NET_WM_STATE_ACTION action) {
switch (action) {
case _NET_WM_STATE_ADD:
return true;
case _NET_WM_STATE_REMOVE:
return false;
case _NET_WM_STATE_TOGGLE:
return !init_property;
default:
fatal(
"Invalid _NET_WM_STATE_ACTION: %u\n"
"Only supported:"
"_NET_WM_STATE_ADD: %u"
"_NET_WM_STATE_REMOVE: %u"
"_NET_WM_STATE_TOGGLE: %u",
action, _NET_WM_STATE_ADD, _NET_WM_STATE_REMOVE, _NET_WM_STATE_TOGGLE);
}
}
static void client_message(xcb_client_message_event_t *ev) {
client_t *c = client_get_by_window(ev->window);
if (c == nullptr) return;
@@ -172,11 +198,16 @@ static void client_message(xcb_client_message_event_t *ev) {
* _NET_WM_STATE_REMOVE0移除全屏状态窗口退出全屏模式
* _NET_WM_STATE_TOGGLE2切换全屏状态若当前全屏则退出反之进入
*/
_NET_WM_STATE_ACTION action = ev->data.data32[0];
if (ev->data.data32[1] == _NET_WM_STATE_FULLSCREEN ||
ev->data.data32[2] == _NET_WM_STATE_FULLSCREEN) {
bool fullscreen = ev->data.data32[0];
if (ev->data.data32[0] == 2) fullscreen = !c->fullscreen;
client_set_fullscreen(c, fullscreen);
client_set_fullscreen(c, get_bool_property(c->fullscreen, action));
} else if (ev->data.data32[1] == _NET_WM_STATE_MAXIMIZED_HORZ ||
ev->data.data32[1] == _NET_WM_STATE_MAXIMIZED_VERT ||
ev->data.data32[2] == _NET_WM_STATE_MAXIMIZED_HORZ ||
ev->data.data32[2] == _NET_WM_STATE_MAXIMIZED_VERT) {
client_set_maximize(c, get_bool_property(c->maximize, action));
}
}
}