调整窗口堆叠顺序

This commit is contained in:
2025-08-25 16:45:23 +08:00
parent 9397e9e572
commit b645c4cf39
4 changed files with 52 additions and 1 deletions

View File

@@ -50,6 +50,14 @@ char *get_window_name(xcb_window_t window);
void set_window_event_mask(xcb_window_t window, bool clear);
void change_window_border_color(xcb_window_t window, uint32_t argb);
void focus_window(xcb_window_t window);
/**
* @brief 将 window 置于堆叠顺序的顶部
*/
void raise_window(xcb_window_t window);
/**
* @brief 在堆叠顺序中将 window 置于 sibling 之下
*/
void place_window_below_sibling(xcb_window_t window, xcb_window_t sibling);
typedef struct bar_cairo_params_t {
xcb_connection_t *conn;
@@ -122,3 +130,8 @@ void set_window_state(xcb_window_t window, wm_state_t state);
void set_window_list(xcb_window_t *list, uint32_t length);
bool get_pointer_position(int32_t *x, int32_t *y);
/**
* @brief 非阻塞检查特定事件掩码(模拟 XCheckMaskEvent
*/
bool xcb_check_mask_event(xcb_event_mask_t event_mask);

View File

@@ -829,7 +829,21 @@ void arrange(monitor_t *monitor) {
void restack(monitor_t *monitor) {
draw_monitor_bar(monitor);
/* TODO: */
if (!monitor->selected_client) return;
if (monitor->selected_client->floating || !monitor->layout->arrange) {
raise_window(monitor->selected_client->window);
}
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)) {
place_window_below_sibling(c->window, sibling);
sibling = c->window;
}
}
}
flush_xcb_connection();
while (xcb_check_mask_event(XCB_EVENT_MASK_ENTER_WINDOW));
}
void focus(client_t *client) {
if (!client || !CLIENT_VISIBLE(client)) {

View File

@@ -300,3 +300,18 @@ void focus_window(xcb_window_t window) {
send_event(window, atom_wm_take_focus);
}
}
void raise_window(xcb_window_t window) {
xcb_params_configure_window_t params = {.stack_mode = XCB_STACK_MODE_TOP_IF};
xcb_aux_configure_window(conn, window, XCB_CONFIG_WINDOW_STACK_MODE, &params);
xcb_flush(conn);
}
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 = {
.stack_mode = XCB_STACK_MODE_BELOW,
.sibling = sibling,
};
xcb_aux_configure_window(conn, window, mask, &params);
}

View File

@@ -331,3 +331,12 @@ bool get_pointer_position(int32_t *x, int32_t *y) {
return false;
}
bool xcb_check_mask_event(xcb_event_mask_t event_mask) {
xcb_generic_event_t *event = xcb_poll_for_event(conn);
if (!event) return false;
bool result = XCB_EVENT_RESPONSE_TYPE(event) == event_mask;
free(event);
return result;
}