支持窗口最小化功能

This commit is contained in:
2026-02-26 11:28:56 +08:00
parent 8c0b295115
commit 323a0f3711
6 changed files with 91 additions and 26 deletions

View File

@@ -140,7 +140,7 @@ static inline void client_update_names(client_t *c) {
}
static inline void client_init_geometry(client_t *c) {
if (c->maximize || c->fullscreen) return;
if (c->maximize || c->fullscreen || c->minimize) return;
area_t workarea = c->monitor->workarea;
if (c->geometry.x + client_width(c) > workarea.x + workarea.width) {
@@ -194,10 +194,10 @@ void client_manage(xcb_window_t window,
c->geometry = c->old_geometry;
c->old_border_width = geometry_reply->border_width;
{
set_window_event_mask(window, false);
xcb_map_window(wm.xcb_conn, window);
}
c->minimize = xwindow_get_state(window) == XCB_ICCCM_WM_STATE_ICONIC;
set_window_event_mask(window, false);
client_update_names(c);
xwindow_get_text_property(c->window, WM_WINDOW_ROLE, &c->role);
client_update_wm_hints(c);
@@ -242,7 +242,13 @@ void client_manage(xcb_window_t window,
xcb_change_property(wm.xcb_conn, XCB_PROP_MODE_APPEND, wm.screen->root,
_NET_CLIENT_LIST, XCB_ATOM_WINDOW, 32, 1, &window);
xwindow_set_state(window, XCB_ICCCM_WM_STATE_NORMAL);
if (c->minimize) {
xwindow_set_state(window, XCB_ICCCM_WM_STATE_ICONIC);
} else {
xwindow_set_state(window, XCB_ICCCM_WM_STATE_NORMAL);
xcb_map_window(wm.xcb_conn, window);
}
monitor_arrange(c->monitor);
monitor_draw_bar(c->monitor);
@@ -469,6 +475,26 @@ void client_set_maximize(client_t *client, bool maximize) {
client_focus(client);
}
void client_set_minimize(client_t *client, bool minimize) {
if (client->minimize == minimize) return;
client->minimize = minimize;
if (minimize) {
xwindow_set_state(client->window, XCB_ICCCM_WM_STATE_ICONIC);
xcb_grab_server(wm.xcb_conn);
set_window_event_mask(client->window, true);
xcb_unmap_window(wm.xcb_conn, client->window);
set_window_event_mask(client->window, false);
xcb_ungrab_server(wm.xcb_conn);
} else {
xwindow_set_state(client->window, XCB_ICCCM_WM_STATE_NORMAL);
xcb_map_window(wm.xcb_conn, client->window);
}
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;