From de49054d75aea8754fcedd2d9710d633cebce584 Mon Sep 17 00:00:00 2001 From: tokyo4j Date: Wed, 19 Mar 2025 09:54:20 +0900 Subject: [PATCH] view: remove server->last_raised_view We were skipping in view_move_to_front() if the raised view is already cached as server->last_raised_view. But this was prone to bugs that windows cannot be raised even though they are actually not placed at the top in the scene. This happened when a window is mapped but view_move_to_front() is not called in view_impl_map() for some reason. Example cases were: - a window is minimized before being mapped (#2627) - a window is mapped while window switcher is active (#2629) Also, this problem was the root cause of #1640 and #2582, though they are already fixed. Therefore, this commit removes server->last_raised_view. In order to eliminate unnecessary communications between labwc and xwayland (ref: db591d1), I'll introduce another caching mechanism in the next commit. --- include/labwc.h | 5 ----- src/view-impl-common.c | 3 --- src/view.c | 18 ------------------ 3 files changed, 26 deletions(-) diff --git a/include/labwc.h b/include/labwc.h index 16df6adf..6fe53fb6 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -292,11 +292,6 @@ struct server { * Note that active_view is synced with foreign-toplevel clients. */ struct view *active_view; - /* - * Most recently raised view. Used to avoid unnecessarily - * raising the same view over and over. - */ - struct view *last_raised_view; struct ssd_hover_state *ssd_hover_state; diff --git a/src/view-impl-common.c b/src/view-impl-common.c index 0731122f..79502f91 100644 --- a/src/view-impl-common.c +++ b/src/view-impl-common.c @@ -66,9 +66,6 @@ view_impl_unmap(struct view *view) if (view == server->active_view) { desktop_focus_topmost_view(server); } - if (view == server->last_raised_view) { - server->last_raised_view = NULL; - } } static bool diff --git a/src/view.c b/src/view.c index f5041262..ca3397fb 100644 --- a/src/view.c +++ b/src/view.c @@ -2251,7 +2251,6 @@ move_to_front(struct view *view) if (view->impl->move_to_front) { view->impl->move_to_front(view); } - view->server->last_raised_view = view; } static void @@ -2260,9 +2259,6 @@ move_to_back(struct view *view) if (view->impl->move_to_back) { view->impl->move_to_back(view); } - if (view == view->server->last_raised_view) { - view->server->last_raised_view = NULL; - } } /* @@ -2275,16 +2271,6 @@ void view_move_to_front(struct view *view) { assert(view); - /* - * This function is called often, generally on every mouse - * button press (more often for focus-follows-mouse). Avoid - * unnecessarily raising the same view over and over, or - * attempting to raise a root view above its own sub-view. - */ - struct view *last = view->server->last_raised_view; - if (view == last || (last && view == view_get_root(last))) { - return; - } struct view *root = view_get_root(view); assert(root); @@ -2539,10 +2525,6 @@ view_destroy(struct view *view) server->session_lock_manager->last_active_view = NULL; } - if (server->last_raised_view == view) { - server->last_raised_view = NULL; - } - if (server->seat.pressed.view == view) { seat_reset_pressed(&server->seat); } -- 2.52.0