From 3899d2c4cdd902623592aab7839c8da91fbce86c Mon Sep 17 00:00:00 2001 From: Yuxuan Shui Date: Fri, 13 Sep 2024 16:23:54 +0100 Subject: [PATCH] event: don't complain if an orphaned window's sibling isn't found Orphaned windows aren't expected to have all of their siblings in the tree, so this is normal. And we aren't going to move orphaned windows in the stack anyway, so this is harmless. Signed-off-by: Yuxuan Shui --- src/event.c | 13 +------------ src/wm/wm.c | 22 +++++++++++++++++++--- src/wm/wm.h | 2 +- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/event.c b/src/event.c index 065e75b76e..be9df40a48 100644 --- a/src/event.c +++ b/src/event.c @@ -352,7 +352,6 @@ static inline void ev_create_notify(session_t *ps, xcb_create_notify_event_t *ev /// Handle configure event of a regular window static void configure_win(session_t *ps, xcb_configure_notify_event_t *ce) { auto cursor = wm_find(ps->wm, ce->window); - auto below = wm_find(ps->wm, ce->above_sibling); if (!cursor) { if (wm_is_consistent(ps->wm)) { @@ -363,17 +362,7 @@ static void configure_win(session_t *ps, xcb_configure_notify_event_t *ce) { return; } - if (below == NULL && ce->above_sibling != XCB_NONE) { - log_error("Configure event received for window %#010x, but its sibling " - "window %#010x is not in our tree. Expect malfunction.", - ce->window, ce->above_sibling); - assert(false); - } else if (below != NULL) { - wm_stack_move_to_above(ps->wm, cursor, below); - } else { - // above_sibling being XCB_NONE means the window is put at the bottom. - wm_stack_move_to_end(ps->wm, cursor, true); - } + wm_stack_move_to_above(ps->wm, cursor, ce->above_sibling); auto w = wm_ref_deref(cursor); if (!w) { diff --git a/src/wm/wm.c b/src/wm/wm.c index f0b3536044..2b3eecad56 100644 --- a/src/wm/wm.c +++ b/src/wm/wm.c @@ -266,16 +266,32 @@ void wm_refresh_leaders(struct wm *wm) { } } -/// Move window `w` so it's right above `below`, if `below` is 0, `w` is moved +/// Move window `w` so it's right above `below`, if `below` is XCB_NONE, `w` is moved /// to the bottom of the stack -void wm_stack_move_to_above(struct wm *wm, struct wm_ref *cursor, struct wm_ref *below) { +void wm_stack_move_to_above(struct wm *wm, struct wm_ref *cursor, xcb_window_t below) { + BUG_ON_NULL(cursor); auto node = to_tree_node_mut(cursor); if (node->parent == &wm->orphan_root) { // If this window is orphaned, moving it around its siblings is // meaningless. Same below. + log_debug("Ignoring restack request for orphaned window %#010x", node->id.x); return; } - wm_tree_move_to_above(&wm->tree, node, to_tree_node_mut(below)); + if (below == XCB_NONE) { + // `below` being XCB_NONE means the window is put at the bottom. + wm_tree_move_to_end(&wm->tree, node, /*to_bottom=*/true); + return; + } + + auto below_node = wm_tree_find(&wm->tree, below); + if (below_node == NULL) { + log_error("Trying to restack window %#010x, but its sibling window " + "%#010x is not in our tree. Expect malfunction.", + node->id.x, below); + assert(false); + return; + } + wm_tree_move_to_above(&wm->tree, node, below_node); } void wm_stack_move_to_end(struct wm *wm, struct wm_ref *cursor, bool to_bottom) { diff --git a/src/wm/wm.h b/src/wm/wm.h index 7bb0facc32..421cd7a7b9 100644 --- a/src/wm/wm.h +++ b/src/wm/wm.h @@ -137,7 +137,7 @@ struct wm_ref *attr_pure wm_ref_bottommost_child(const struct wm_ref *cursor); /// Move window `w` so it's right above `below`, if `below` is 0, `w` is moved /// to the bottom of the stack -void wm_stack_move_to_above(struct wm *wm, struct wm_ref *cursor, struct wm_ref *below); +void wm_stack_move_to_above(struct wm *wm, struct wm_ref *cursor, xcb_window_t below); /// Move window `w` to the top of the stack. void wm_stack_move_to_end(struct wm *wm, struct wm_ref *cursor, bool to_bottom);