From 0e07ba135b4ac4585bbc4afe4f0c1d88b5742439 Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Wed, 4 Feb 2026 12:13:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E7=AA=97=E5=8F=A3=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E5=8C=96=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/action.c | 6 ++++++ src/action.h | 1 + src/atoms-list.txt | 2 ++ src/client.c | 27 +++++++++++++++++++++++++++ src/default_config.h | 1 + 5 files changed, 37 insertions(+) diff --git a/src/action.c b/src/action.c index b44695e..621b59f 100644 --- a/src/action.c +++ b/src/action.c @@ -87,3 +87,9 @@ void toggle_client_fullscreen(const user_action_arg_t *arg) { 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); +} diff --git a/src/action.h b/src/action.h index 80670dd..1b4adb3 100644 --- a/src/action.h +++ b/src/action.h @@ -57,3 +57,4 @@ void quit(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_fullscreen(const user_action_arg_t *arg); +void toggle_client_maximize(const user_action_arg_t *arg); diff --git a/src/atoms-list.txt b/src/atoms-list.txt index 31b1a53..1875eb9 100644 --- a/src/atoms-list.txt +++ b/src/atoms-list.txt @@ -14,6 +14,8 @@ _NET_WM_DESKTOP _NET_WM_NAME _NET_WM_STATE _NET_WM_STATE_FULLSCREEN +_NET_WM_STATE_MAXIMIZED_HORZ +_NET_WM_STATE_MAXIMIZED_VERT _NET_WM_WINDOW_TYPE _NET_WM_WINDOW_TYPE_DIALOG _NET_SUPPORTED diff --git a/src/client.c b/src/client.c index 7abb8ff..d45b24d 100644 --- a/src/client.c +++ b/src/client.c @@ -434,6 +434,33 @@ void client_set_fullscreen(client_t *client, bool fullscreen) { 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) { xcb_connection_t *conn = wm.xcb_conn; xcb_window_t root = wm.screen->root; diff --git a/src/default_config.h b/src/default_config.h index 711850a..a2230d7 100644 --- a/src/default_config.h +++ b/src/default_config.h @@ -89,6 +89,7 @@ static const keyboard_t key_list[] = { {modifier_super | modifier_control, XK_space, toggle_client_floating, {0}}, {modifier_super, XK_f, toggle_client_fullscreen, {0}}, + {modifier_super, XK_m, toggle_client_maximize, {0}}, }; static const layout_t layout_list[] = {