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 = {