]> git.mdlowis.com Git - proto/labwc.git/commitdiff
decorations: refactor view_set_decorations
authorTobias Bengfort <tobias.bengfort@posteo.de>
Thu, 18 Apr 2024 07:46:36 +0000 (09:46 +0200)
committerJohan Malm <johanmalm@users.noreply.github.com>
Sun, 19 May 2024 18:03:42 +0000 (19:03 +0100)
include/ssd.h
include/view.h
src/decorations/kde-deco.c
src/decorations/xdg-deco.c
src/ssd/ssd.c
src/view.c
src/xdg.c
src/xwayland.c

index 757f9a211a454929ec4a4087d1d418548cb4f04f..447694d217f8385c11325c1ba0bbf63ab375d40a 100644 (file)
@@ -48,6 +48,12 @@ enum ssd_part_type {
        LAB_SSD_END_MARKER
 };
 
+enum ssd_mode {
+       LAB_SSD_MODE_NONE,
+       LAB_SSD_MODE_BORDER,
+       LAB_SSD_MODE_FULL
+};
+
 /* Forward declare arguments */
 struct ssd;
 struct ssd_button;
@@ -72,7 +78,7 @@ void ssd_set_active(struct ssd *ssd, bool active);
 void ssd_update_title(struct ssd *ssd);
 void ssd_update_geometry(struct ssd *ssd);
 void ssd_destroy(struct ssd *ssd);
-void ssd_titlebar_hide(struct ssd *ssd);
+void ssd_set_titlebar(struct ssd *ssd, bool enabled);
 
 void ssd_enable_keybind_inhibit_indicator(struct ssd *ssd, bool enable);
 void ssd_enable_shade(struct ssd *ssd, bool enable);
index b0e2a41e680ae17b74956cc5e7c476695788d9a7..6755037d1862b4803968d284626e9ca1dcd1141a 100644 (file)
@@ -483,7 +483,8 @@ void view_toggle_visible_on_all_workspaces(struct view *view);
 bool view_is_tiled(struct view *view);
 bool view_is_floating(struct view *view);
 void view_move_to_workspace(struct view *view, struct workspace *workspace);
-void view_set_decorations(struct view *view, bool decorations);
+enum ssd_mode view_get_ssd_mode(struct view *view);
+void view_set_ssd_mode(struct view *view, enum ssd_mode mode);
 void view_toggle_fullscreen(struct view *view);
 void view_invalidate_last_layout_geometry(struct view *view);
 void view_adjust_for_layout_change(struct view *view);
index b26f66213a8f2dc8e0ba66d9225fb9ec647a59ba..065f89fd562c3db5f3dc89bf61fc3c3ab1f7cc98 100644 (file)
@@ -52,8 +52,11 @@ handle_mode(struct wl_listener *listener, void *data)
                        "requested: %u", client_mode);
        }
 
-       view_set_decorations(kde_deco->view,
-               kde_deco->view->ssd_preference == LAB_SSD_PREF_SERVER);
+       if (kde_deco->view->ssd_preference == LAB_SSD_PREF_SERVER) {
+               view_set_ssd_mode(kde_deco->view, LAB_SSD_MODE_FULL);
+       } else {
+               view_set_ssd_mode(kde_deco->view, LAB_SSD_MODE_NONE);
+       }
 }
 
 static void
index 3fa1094012ff066e1da41dedf3a51117991ddc14..c79964dd4f0d2c524f26ded060d1cb344fabc3db 100644 (file)
@@ -48,8 +48,11 @@ xdg_deco_request_mode(struct wl_listener *listener, void *data)
 
        wlr_xdg_toplevel_decoration_v1_set_mode(xdg_deco->wlr_xdg_decoration,
                client_mode);
-       view_set_decorations(xdg_deco->view,
-               client_mode == WLR_XDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE);
+       if (client_mode == WLR_XDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE) {
+               view_set_ssd_mode(xdg_deco->view, LAB_SSD_MODE_FULL);
+       } else {
+               view_set_ssd_mode(xdg_deco->view, LAB_SSD_MODE_NONE);
+       }
 }
 
 static void
index 9c96ef7bcd63dc67d85de9e0cf75ff5805324dab..9259022c3ee5eaa0f4f8d597111e65d96c3c1f48 100644 (file)
@@ -191,7 +191,7 @@ ssd_create(struct view *view, bool active)
        ssd_titlebar_create(ssd);
        if (view->ssd_titlebar_hidden) {
                /* Ensure we keep the old state on Reconfigure or when exiting fullscreen */
-               ssd_titlebar_hide(ssd);
+               ssd_set_titlebar(ssd, false);
        }
        ssd->margin = ssd_thickness(view);
        ssd_set_active(ssd, active);
@@ -267,13 +267,13 @@ ssd_update_geometry(struct ssd *ssd)
 }
 
 void
-ssd_titlebar_hide(struct ssd *ssd)
+ssd_set_titlebar(struct ssd *ssd, bool enabled)
 {
-       if (!ssd || !ssd->titlebar.tree->node.enabled) {
+       if (!ssd || ssd->titlebar.tree->node.enabled == enabled) {
                return;
        }
-       wlr_scene_node_set_enabled(&ssd->titlebar.tree->node, false);
-       ssd->titlebar.height = 0;
+       wlr_scene_node_set_enabled(&ssd->titlebar.tree->node, enabled);
+       ssd->titlebar.height = enabled ? ssd->view->server->theme->title_height : 0;
        ssd_border_update(ssd);
        ssd_extents_update(ssd);
        ssd_shadow_update(ssd);
index ef44cbdb2ab69a050c2aeb6a47f9031652800278..09cc697d8ca8afe6f3e852f7799e639ac835b702 100644 (file)
@@ -1223,25 +1223,14 @@ view_toggle_decorations(struct view *view)
 {
        assert(view);
 
-       /* Reject decoration toggles when shaded */
-       if (view->shaded) {
-               return;
-       }
-
-       if (rc.ssd_keep_border && view->ssd_enabled && view->ssd
-                       && !view->ssd_titlebar_hidden) {
-               /*
-                * ssd_titlebar_hidden has to be set before calling
-                * ssd_titlebar_hide() to make ssd_thickness() happy.
-                */
-               view->ssd_titlebar_hidden = true;
-               ssd_titlebar_hide(view->ssd);
-               if (!view_is_floating(view)) {
-                       view_apply_special_geometry(view);
-               }
-               return;
+       enum ssd_mode mode = view_get_ssd_mode(view);
+       if (rc.ssd_keep_border && mode == LAB_SSD_MODE_FULL) {
+               view_set_ssd_mode(view, LAB_SSD_MODE_BORDER);
+       } else if (mode != LAB_SSD_MODE_NONE) {
+               view_set_ssd_mode(view, LAB_SSD_MODE_NONE);
+       } else {
+               view_set_ssd_mode(view, LAB_SSD_MODE_FULL);
        }
-       view_set_decorations(view, !view->ssd_enabled);
 }
 
 bool
@@ -1323,26 +1312,46 @@ undecorate(struct view *view)
        view->ssd = NULL;
 }
 
+enum ssd_mode
+view_get_ssd_mode(struct view *view)
+{
+       assert(view);
+
+       if (!view->ssd_enabled) {
+               return LAB_SSD_MODE_NONE;
+       } else if (view->ssd_titlebar_hidden) {
+               return LAB_SSD_MODE_BORDER;
+       } else {
+               return LAB_SSD_MODE_FULL;
+       }
+}
+
 void
-view_set_decorations(struct view *view, bool decorations)
+view_set_ssd_mode(struct view *view, enum ssd_mode mode)
 {
        assert(view);
 
-       if (view->ssd_enabled != decorations && !view->fullscreen) {
-               /*
-                * Set view->ssd_enabled first since it is referenced
-                * within the call tree of ssd_create()
-                */
-               view->ssd_enabled = decorations;
-               if (decorations) {
-                       decorate(view);
-               } else {
-                       undecorate(view);
-                       view->ssd_titlebar_hidden = false;
-               }
-               if (!view_is_floating(view)) {
-                       view_apply_special_geometry(view);
-               }
+       if (view->shaded || view->fullscreen
+                       || mode == view_get_ssd_mode(view)) {
+               return;
+       }
+
+       /*
+        * Set these first since they are referenced
+        * within the call tree of ssd_create() and ssd_thickness()
+        */
+       view->ssd_enabled = mode != LAB_SSD_MODE_NONE;
+       view->ssd_titlebar_hidden = mode != LAB_SSD_MODE_FULL;
+
+       if (view->ssd_enabled) {
+               decorate(view);
+               ssd_set_titlebar(view->ssd, !view->ssd_titlebar_hidden);
+       } else {
+               undecorate(view);
+       }
+
+       if (!view_is_floating(view)) {
+               view_apply_special_geometry(view);
        }
 }
 
index fd4e926f00a5297a33cb8ff14dce2669e54bc110..e9b5984faf67ab03c811bfb8125f0e9302e66475 100644 (file)
--- a/src/xdg.c
+++ b/src/xdg.c
@@ -599,7 +599,11 @@ xdg_toplevel_view_map(struct view *view)
 
                init_foreign_toplevel(view);
 
-               view_set_decorations(view, has_ssd(view));
+               if (has_ssd(view)) {
+                       view_set_ssd_mode(view, LAB_SSD_MODE_FULL);
+               } else {
+                       view_set_ssd_mode(view, LAB_SSD_MODE_NONE);
+               }
 
                /*
                 * Set initial "pending" dimensions (may be modified by
index 073a96974fadf28f169876d017a4264abccd7896..2e537038253646f6ad80483cfc07420e4b830b56 100644 (file)
@@ -435,8 +435,11 @@ handle_request_maximize(struct wl_listener *listener, void *data)
                 * Set decorations early to avoid changing geometry
                 * after maximize (reduces visual glitches).
                 */
-               view_set_decorations(view,
-                       want_deco(xwayland_surface_from_view(view)));
+               if (want_deco(xwayland_surface_from_view(view))) {
+                       view_set_ssd_mode(view, LAB_SSD_MODE_FULL);
+               } else {
+                       view_set_ssd_mode(view, LAB_SSD_MODE_NONE);
+               }
        }
        view_toggle_maximize(view, VIEW_AXIS_BOTH);
 }
@@ -508,7 +511,11 @@ handle_set_decorations(struct wl_listener *listener, void *data)
                wl_container_of(listener, xwayland_view, set_decorations);
        struct view *view = &xwayland_view->base;
 
-       view_set_decorations(view, want_deco(xwayland_view->xwayland_surface));
+       if (want_deco(xwayland_view->xwayland_surface)) {
+               view_set_ssd_mode(view, LAB_SSD_MODE_FULL);
+       } else {
+               view_set_ssd_mode(view, LAB_SSD_MODE_NONE);
+       }
 }
 
 static void
@@ -659,7 +666,11 @@ xwayland_view_map(struct view *view)
         */
        view_set_fullscreen(view, xwayland_surface->fullscreen);
        if (!view->been_mapped) {
-               view_set_decorations(view, want_deco(xwayland_surface));
+               if (want_deco(xwayland_surface)) {
+                       view_set_ssd_mode(view, LAB_SSD_MODE_FULL);
+               } else {
+                       view_set_ssd_mode(view, LAB_SSD_MODE_NONE);
+               }
        }
        enum view_axis axis = VIEW_AXIS_NONE;
        if (xwayland_surface->maximized_horz) {