实现 client 窗口自带最大化按钮功能
This commit is contained in:
37
src/event.c
37
src/event.c
@@ -132,6 +132,32 @@ static void map_request(xcb_map_request_event_t *ev) {
|
|||||||
p_delete(&wa_reply);
|
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) {
|
static void client_message(xcb_client_message_event_t *ev) {
|
||||||
client_t *c = client_get_by_window(ev->window);
|
client_t *c = client_get_by_window(ev->window);
|
||||||
if (c == nullptr) return;
|
if (c == nullptr) return;
|
||||||
@@ -172,11 +198,16 @@ static void client_message(xcb_client_message_event_t *ev) {
|
|||||||
* _NET_WM_STATE_REMOVE(0):移除全屏状态,窗口退出全屏模式
|
* _NET_WM_STATE_REMOVE(0):移除全屏状态,窗口退出全屏模式
|
||||||
* _NET_WM_STATE_TOGGLE(2):切换全屏状态(若当前全屏则退出,反之进入)
|
* _NET_WM_STATE_TOGGLE(2):切换全屏状态(若当前全屏则退出,反之进入)
|
||||||
*/
|
*/
|
||||||
|
_NET_WM_STATE_ACTION action = ev->data.data32[0];
|
||||||
|
|
||||||
if (ev->data.data32[1] == _NET_WM_STATE_FULLSCREEN ||
|
if (ev->data.data32[1] == _NET_WM_STATE_FULLSCREEN ||
|
||||||
ev->data.data32[2] == _NET_WM_STATE_FULLSCREEN) {
|
ev->data.data32[2] == _NET_WM_STATE_FULLSCREEN) {
|
||||||
bool fullscreen = ev->data.data32[0];
|
client_set_fullscreen(c, get_bool_property(c->fullscreen, action));
|
||||||
if (ev->data.data32[0] == 2) fullscreen = !c->fullscreen;
|
} else if (ev->data.data32[1] == _NET_WM_STATE_MAXIMIZED_HORZ ||
|
||||||
client_set_fullscreen(c, fullscreen);
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user