支持窗口最大化操作

This commit is contained in:
2026-02-04 12:13:19 +08:00
parent 4b6df52b41
commit 0e07ba135b
5 changed files with 37 additions and 0 deletions

View File

@@ -87,3 +87,9 @@ void toggle_client_fullscreen(const user_action_arg_t *arg) {
client_set_fullscreen(wm.client_focused, !wm.client_focused->fullscreen); client_set_fullscreen(wm.client_focused, !wm.client_focused->fullscreen);
} }
void toggle_client_maximize(const user_action_arg_t *arg) {
if (!wm.client_focused) return;
client_set_maximize(wm.client_focused, !wm.client_focused->maximize);
}

View File

@@ -57,3 +57,4 @@ void quit(const user_action_arg_t *arg);
void raise_or_run(const user_action_arg_t *arg); void raise_or_run(const user_action_arg_t *arg);
void toggle_client_floating(const user_action_arg_t *arg); void toggle_client_floating(const user_action_arg_t *arg);
void toggle_client_fullscreen(const user_action_arg_t *arg); void toggle_client_fullscreen(const user_action_arg_t *arg);
void toggle_client_maximize(const user_action_arg_t *arg);

View File

@@ -14,6 +14,8 @@ _NET_WM_DESKTOP
_NET_WM_NAME _NET_WM_NAME
_NET_WM_STATE _NET_WM_STATE
_NET_WM_STATE_FULLSCREEN _NET_WM_STATE_FULLSCREEN
_NET_WM_STATE_MAXIMIZED_HORZ
_NET_WM_STATE_MAXIMIZED_VERT
_NET_WM_WINDOW_TYPE _NET_WM_WINDOW_TYPE
_NET_WM_WINDOW_TYPE_DIALOG _NET_WM_WINDOW_TYPE_DIALOG
_NET_SUPPORTED _NET_SUPPORTED

View File

@@ -434,6 +434,33 @@ void client_set_fullscreen(client_t *client, bool fullscreen) {
client_focus(client); client_focus(client);
} }
void client_set_maximize(client_t *client, bool maximize) {
if (client->maximize == maximize) return;
client->maximize = maximize;
if (maximize) {
xcb_atom_t max_atoms[] = {
_NET_WM_STATE_MAXIMIZED_HORZ,
_NET_WM_STATE_MAXIMIZED_VERT,
};
xcb_change_property(wm.xcb_conn, XCB_PROP_MODE_REPLACE, client->window,
_NET_WM_STATE, XCB_ATOM_ATOM, 32, countof(max_atoms),
max_atoms);
client->old_border_width = client->border_width;
if (client->floating) client->old_geometry = client->geometry;
client_change_border_width(client, 0);
client_apply_geometry(client, client->monitor->workarea);
client_stack_raise(client);
} else {
xcb_change_property(wm.xcb_conn, XCB_PROP_MODE_REPLACE, client->window,
_NET_WM_STATE, XCB_ATOM_ATOM, 32, 0, 0);
client_change_border_width(client, client->old_border_width);
client_apply_geometry(client, client->old_geometry);
}
monitor_arrange(client->monitor);
client_focus(client);
}
static void update_client_list(void) { static void update_client_list(void) {
xcb_connection_t *conn = wm.xcb_conn; xcb_connection_t *conn = wm.xcb_conn;
xcb_window_t root = wm.screen->root; xcb_window_t root = wm.screen->root;

View File

@@ -89,6 +89,7 @@ static const keyboard_t key_list[] = {
{modifier_super | modifier_control, XK_space, toggle_client_floating, {0}}, {modifier_super | modifier_control, XK_space, toggle_client_floating, {0}},
{modifier_super, XK_f, toggle_client_fullscreen, {0}}, {modifier_super, XK_f, toggle_client_fullscreen, {0}},
{modifier_super, XK_m, toggle_client_maximize, {0}},
}; };
static const layout_t layout_list[] = { static const layout_t layout_list[] = {