From 83211759154c506fc79fc630f67755614782c066 Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Tue, 26 Aug 2025 02:02:31 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A0=86=E5=8F=A0=E9=A1=BA?= =?UTF-8?q?=E5=BA=8F=E5=AF=BC=E8=87=B4=E7=9A=84=E5=85=A8=E5=B1=8F=E8=A7=84?= =?UTF-8?q?=E5=88=99=E4=B8=8D=E7=94=9F=E6=95=88=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/include/xcb.h | 4 ++++ src/main.c | 5 ++++- src/xcb/window.c | 10 ++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/include/xcb.h b/src/include/xcb.h index cb5a2f2..ad26399 100644 --- a/src/include/xcb.h +++ b/src/include/xcb.h @@ -54,6 +54,10 @@ void focus_window(xcb_window_t window); * @brief 将 window 置于堆叠顺序的顶部 */ void raise_window(xcb_window_t window); +/** + * @brief 在堆叠顺序中将 window 置于 sibling 之上 + */ +void place_window_above_sibling(xcb_window_t window, xcb_window_t sibling); /** * @brief 在堆叠顺序中将 window 置于 sibling 之下 */ diff --git a/src/main.c b/src/main.c index 61a8210..3fdc70f 100644 --- a/src/main.c +++ b/src/main.c @@ -882,7 +882,10 @@ void restack(monitor_t *monitor) { if (monitor->layout->arrange) { xcb_window_t sibling = monitor->bar_window; for (client_t *c = monitor->clients_stack; c; c = c->stack_next) { - if (!c->floating && CLIENT_VISIBLE(c)) { + if (!CLIENT_VISIBLE(c)) continue; + if (c->fullscreen) { + place_window_above_sibling(c->window, monitor->bar_window); + } else if (!c->floating) { place_window_below_sibling(c->window, sibling); sibling = c->window; } diff --git a/src/xcb/window.c b/src/xcb/window.c index 0b8ad0b..e57b70b 100644 --- a/src/xcb/window.c +++ b/src/xcb/window.c @@ -307,6 +307,16 @@ void raise_window(xcb_window_t window) { xcb_flush(conn); } +void place_window_above_sibling(xcb_window_t window, xcb_window_t sibling) { + uint16_t mask = XCB_CONFIG_WINDOW_STACK_MODE | XCB_CONFIG_WINDOW_SIBLING; + xcb_params_configure_window_t params = { + .stack_mode = XCB_STACK_MODE_ABOVE, + .sibling = sibling, + }; + xcb_aux_configure_window(conn, window, mask, ¶ms); +} + + void place_window_below_sibling(xcb_window_t window, xcb_window_t sibling) { uint16_t mask = XCB_CONFIG_WINDOW_STACK_MODE | XCB_CONFIG_WINDOW_SIBLING; xcb_params_configure_window_t params = {