]> git.mdlowis.com Git - proto/labwc.git/commitdiff
view/ssd: Refactor and fix visual indication for active windows
authorJohn Lindgren <john@jlindgren.net>
Fri, 26 Aug 2022 06:02:19 +0000 (02:02 -0400)
committerJohan Malm <johanmalm@users.noreply.github.com>
Sat, 27 Aug 2022 05:58:20 +0000 (06:58 +0100)
Partially fixes #494.

Co-Authored-by: Consolatis
include/labwc.h
include/ssd.h
src/desktop.c
src/ssd/ssd.c
src/view.c

index 490c7401f0d19e3b7c17151a546db2537ce9bf9d..794b2671b208a6b197d3e6eda4afa51a13db7fd6 100644 (file)
@@ -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);
 
 /**
index 524f3b685e1813dfabd0db4f6ced1b0f00824aee..12797cc5ab5facafe11beba7f717ad841ad429b0 100644 (file)
@@ -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);
index 5a3ad8bcf6570ec590194e583f080c8fabef3f7d..ab5e00ce02c5a5d302ee495a78c2f5c698d48ed2 100644 (file)
@@ -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);
 }
 
index 04c78575f6b50a95752887395c2b0e9314ea7653..e6362f34d0744509737d1e830d3df66be30dfd64 100644 (file)
@@ -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);
 }
index a8c63b0e6cefd612fba1ec8c510d040496554a5a..843c5c9821adfbd5201abd311b32948b2d5ba182 100644 (file)
@@ -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