view: avoid raising same view over and over

Since view_move_to_front() now does more work than it used to
(updating XWayland server stacking order), try to avoid doing that
work unnecessarily.
This commit is contained in:
John Lindgren 2023-10-21 11:28:00 -04:00 committed by Johan Malm
parent 0ddf3c43ad
commit db591d1400
3 changed files with 31 additions and 4 deletions

View file

@ -55,9 +55,12 @@ view_impl_map(struct view *view)
void
view_impl_unmap(struct view *view)
{
struct seat *seat = &view->server->seat;
if (seat->seat->keyboard_state.focused_surface == view->surface) {
desktop_focus_topmost_view(view->server);
struct server *server = view->server;
if (view == server->focused_view) {
desktop_focus_topmost_view(server);
}
if (view == server->last_raised_view) {
server->last_raised_view = NULL;
}
}

View file

@ -1345,6 +1345,7 @@ 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
@ -1353,6 +1354,9 @@ 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;
}
}
/*
@ -1365,6 +1369,17 @@ 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);
@ -1517,6 +1532,10 @@ view_destroy(struct view *view)
need_cursor_update = true;
}
if (server->last_raised_view == view) {
server->last_raised_view = NULL;
}
if (server->seat.pressed.view == view) {
seat_reset_pressed(&server->seat);
}