From: John Lindgren Date: Fri, 26 Aug 2022 06:02:19 +0000 (-0400) Subject: view/ssd: Refactor and fix visual indication for active windows X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=b7c4ba825a5ba84fb4b2af674e76ea80bc2a6e6d;p=proto%2Flabwc.git view/ssd: Refactor and fix visual indication for active windows Partially fixes #494. Co-Authored-by: Consolatis --- diff --git a/include/labwc.h b/include/labwc.h index 490c7401..794b2671 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -188,7 +188,7 @@ struct server { uint32_t resize_edges; /* SSD state */ - struct view *ssd_focused_view; + struct view *focused_view; struct ssd_hover_state ssd_hover_state; /* Tree for all non-layer xdg/xwayland-shell surfaces */ @@ -408,7 +408,7 @@ struct xwayland_unmanaged *xwayland_unmanaged_create(struct server *server, void unmanaged_handle_map(struct wl_listener *listener, void *data); #endif -void view_set_activated(struct view *view, bool activated); +void view_set_activated(struct view *view); void view_close(struct view *view); /** diff --git a/include/ssd.h b/include/ssd.h index 524f3b68..12797cc5 100644 --- a/include/ssd.h +++ b/include/ssd.h @@ -134,7 +134,7 @@ struct ssd_hover_state { /* Public SSD API */ void ssd_create(struct view *view); -void ssd_set_active(struct view *view); +void ssd_set_active(struct view *view, bool active); void ssd_update_title(struct view *view); void ssd_update_geometry(struct view *view); void ssd_reload(struct view *view); diff --git a/src/desktop.c b/src/desktop.c index 5a3ad8bc..ab5e00ce 100644 --- a/src/desktop.c +++ b/src/desktop.c @@ -87,18 +87,6 @@ desktop_move_to_back(struct view *view) wl_list_insert_tail(&view->server->views, &view->link); } -static void -deactivate_all_views(struct server *server) -{ - struct view *view; - wl_list_for_each (view, &server->views, link) { - if (!view->mapped) { - continue; - } - view_set_activated(view, false); - } -} - void desktop_arrange_all_views(struct server *server) { @@ -151,8 +139,7 @@ desktop_focus_and_activate_view(struct seat *seat, struct view *view) return; } - deactivate_all_views(view->server); - view_set_activated(view, true); + view_set_activated(view); seat_focus_surface(seat, view->surface); } diff --git a/src/ssd/ssd.c b/src/ssd/ssd.c index 04c78575..e6362f34 100644 --- a/src/ssd/ssd.c +++ b/src/ssd/ssd.c @@ -140,21 +140,15 @@ ssd_resize_edges(enum ssd_part_type type) return 0; } -static void -_ssd_set_active(struct ssd *ssd, bool active) -{ - wlr_scene_node_set_enabled(&ssd->border.active.tree->node, active); - wlr_scene_node_set_enabled(&ssd->titlebar.active.tree->node, active); - wlr_scene_node_set_enabled(&ssd->border.inactive.tree->node, !active); - wlr_scene_node_set_enabled(&ssd->titlebar.inactive.tree->node, !active); -} - void ssd_create(struct view *view) { + bool is_active = view->server->focused_view == view; + if (view->ssd.tree) { /* SSD was hidden. Just enable it */ wlr_scene_node_set_enabled(&view->ssd.tree->node, true); + ssd_set_active(view, is_active); return; } @@ -164,6 +158,7 @@ ssd_create(struct view *view) ssd_border_create(view); ssd_titlebar_create(view); view->margin = ssd_thickness(view); + ssd_set_active(view, is_active); } void @@ -211,14 +206,8 @@ void ssd_reload(struct view *view) return; } - bool view_was_active = view->server->ssd_focused_view == view; ssd_destroy(view); ssd_create(view); - if (view_was_active) { - view->server->ssd_focused_view = view; - } else { - _ssd_set_active(&view->ssd, false); - } } void @@ -228,11 +217,6 @@ ssd_destroy(struct view *view) return; } - /* Maybe reset focused view */ - if (view->server->ssd_focused_view == view) { - view->server->ssd_focused_view = NULL; - } - /* Maybe reset hover view */ struct ssd_hover_state *hover_state; hover_state = &view->server->ssd_hover_state; @@ -283,19 +267,13 @@ ssd_part_contains(enum ssd_part_type whole, enum ssd_part_type candidate) } void -ssd_set_active(struct view *view) +ssd_set_active(struct view *view, bool active) { if (!view->ssd.tree) { return; } - - struct view *last = view->server->ssd_focused_view; - if (last == view) { - return; - } - if (last && last->ssd.tree) { - _ssd_set_active(&last->ssd, false); - } - _ssd_set_active(&view->ssd, true); - view->server->ssd_focused_view = view; + wlr_scene_node_set_enabled(&view->ssd.border.active.tree->node, active); + wlr_scene_node_set_enabled(&view->ssd.titlebar.active.tree->node, active); + wlr_scene_node_set_enabled(&view->ssd.border.inactive.tree->node, !active); + wlr_scene_node_set_enabled(&view->ssd.titlebar.inactive.tree->node, !active); } diff --git a/src/view.c b/src/view.c index a8c63b0e..843c5c98 100644 --- a/src/view.c +++ b/src/view.c @@ -95,11 +95,11 @@ view_get_edge_snap_box(struct view *view, struct output *output, return dst; } -void -view_set_activated(struct view *view, bool activated) +static void +_view_set_activated(struct view *view, bool activated) { - if (view->ssd.enabled) { - ssd_set_active(view); + if (view->ssd.tree) { + ssd_set_active(view, activated); } if (view->impl->set_activated) { view->impl->set_activated(view, activated); @@ -110,6 +110,22 @@ view_set_activated(struct view *view, bool activated) } } +void +view_set_activated(struct view *view) +{ + assert(view); + + struct view *last = view->server->focused_view; + if (last == view) { + return; + } + if (last) { + _view_set_activated(last, false); + } + _view_set_activated(view, true); + view->server->focused_view = view; +} + void view_close(struct view *view) { @@ -200,7 +216,6 @@ view_minimize(struct view *view, bool minimized) if (minimized) { view->impl->unmap(view); desktop_move_to_back(view); - view_set_activated(view, false); } else { view->impl->map(view); } @@ -789,6 +804,10 @@ view_destroy(struct view *view) server->seat.pressed.surface = NULL; } + if (server->focused_view == view) { + server->focused_view = NULL; + } + if (server->cycle_view == view) { /* * If we are the current OSD selected view, cycle