]> git.mdlowis.com Git - proto/labwc.git/commitdiff
decorations: add SetDecorations action
authorTobias Bengfort <tobias.bengfort@posteo.de>
Sat, 20 Apr 2024 04:29:51 +0000 (06:29 +0200)
committerJohan Malm <johanmalm@users.noreply.github.com>
Sun, 19 May 2024 18:03:42 +0000 (19:03 +0100)
docs/labwc-actions.5.scd
include/ssd.h
include/view.h
src/action.c
src/ssd/ssd.c
src/view.c

index 703236ef2f2f5d058954b0796fd43a3873e8d722..1c1fe7817155684a6711ea4b93934fbd78a8df94 100644 (file)
@@ -120,6 +120,17 @@ Actions are used in menus and keyboard/mouse bindings.
        upper-left corner of the window associated with the action. Default is
        yes.
 
+*<action name="SetDecorations" decorations="value" forceSSD="no" />*
+       Set decorations of focused window.
+
+       *decorations* [full|border|none] *full* enables the whole server side
+       decorations. With *border*. only the borders and invisible resize area
+       are enabled. *none* disables everything.
+
+       *forceSSD* [yes|no] If this is no, this action will be ignored for
+       windows that have client side decorations if it would increase the
+       amount of decoration. Default is no.
+
 *<action name="ToggleDecorations" />*
        Toggle decorations of focused window.
 
index 447694d217f8385c11325c1ba0bbf63ab375d40a..7ada9dba8324618839df4a2c54788e8910d9f23f 100644 (file)
@@ -98,6 +98,7 @@ enum ssd_part_type ssd_get_part_type(const struct ssd *ssd,
 uint32_t ssd_resize_edges(enum ssd_part_type type);
 bool ssd_is_button(enum ssd_part_type type);
 bool ssd_part_contains(enum ssd_part_type whole, enum ssd_part_type candidate);
+enum ssd_mode ssd_mode_parse(const char *mode);
 
 /* TODO: clean up / update */
 struct border ssd_thickness(struct view *view);
index a89e75d25c7d578c91cc788107a8bceccbb7bac4..e941915899f402fe6bc4e9c4644df52d126daac5 100644 (file)
@@ -486,6 +486,7 @@ bool view_is_floating(struct view *view);
 void view_move_to_workspace(struct view *view, struct workspace *workspace);
 enum ssd_mode view_get_ssd_mode(struct view *view);
 void view_set_ssd_mode(struct view *view, enum ssd_mode mode);
+void view_set_decorations(struct view *view, enum ssd_mode mode, bool force_ssd);
 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 3ed88d681baf871cf805a1f0a60a341cb301713e..3d14d5d0317d73ad3ff0d5b77549b17e47d0fbd1 100644 (file)
@@ -79,6 +79,7 @@ enum action_type {
        ACTION_TYPE_TOGGLE_MAXIMIZE,
        ACTION_TYPE_MAXIMIZE,
        ACTION_TYPE_TOGGLE_FULLSCREEN,
+       ACTION_TYPE_SET_DECORATIONS,
        ACTION_TYPE_TOGGLE_DECORATIONS,
        ACTION_TYPE_TOGGLE_ALWAYS_ON_TOP,
        ACTION_TYPE_TOGGLE_ALWAYS_ON_BOTTOM,
@@ -135,6 +136,7 @@ const char *action_names[] = {
        "ToggleMaximize",
        "Maximize",
        "ToggleFullscreen",
+       "SetDecorations",
        "ToggleDecorations",
        "ToggleAlwaysOnTop",
        "ToggleAlwaysOnBottom",
@@ -347,6 +349,17 @@ action_arg_from_xml_node(struct action *action, const char *nodename, const char
                        goto cleanup;
                }
                break;
+       case ACTION_TYPE_SET_DECORATIONS:
+               if (!strcmp(argument, "decorations")) {
+                       enum ssd_mode mode = ssd_mode_parse(content);
+                       action_arg_add_int(action, argument, mode);
+                       goto cleanup;
+               }
+               if (!strcasecmp(argument, "forceSSD")) {
+                       action_arg_add_bool(action, argument, parse_bool(content, false));
+                       goto cleanup;
+               }
+               break;
        case ACTION_TYPE_RESIZE_RELATIVE:
                if (!strcmp(argument, "left") || !strcmp(argument, "right") ||
                                !strcmp(argument, "top") || !strcmp(argument, "bottom")) {
@@ -806,6 +819,15 @@ actions_run(struct view *activator, struct server *server,
                                view_toggle_fullscreen(view);
                        }
                        break;
+               case ACTION_TYPE_SET_DECORATIONS:
+                       if (view) {
+                               enum ssd_mode mode = action_get_int(action,
+                                       "decorations", LAB_SSD_MODE_FULL);
+                               bool force_ssd = action_get_bool(action,
+                                       "forceSSD", false);
+                               view_set_decorations(view, mode, force_ssd);
+                       }
+                       break;
                case ACTION_TYPE_TOGGLE_DECORATIONS:
                        if (view) {
                                view_toggle_decorations(view);
index 9259022c3ee5eaa0f4f8d597111e65d96c3c1f48..724a8ba9ff16b2618bc5e933760ee2e00805ffba 100644 (file)
@@ -7,6 +7,7 @@
  */
 
 #include <assert.h>
+#include <strings.h>
 #include "common/mem.h"
 #include "common/scene-helpers.h"
 #include "labwc.h"
@@ -344,6 +345,21 @@ ssd_part_contains(enum ssd_part_type whole, enum ssd_part_type candidate)
        return false;
 }
 
+enum ssd_mode
+ssd_mode_parse(const char *mode)
+{
+       if (!mode) {
+               return LAB_SSD_MODE_FULL;
+       }
+       if (!strcasecmp(mode, "none")) {
+               return LAB_SSD_MODE_NONE;
+       } else if (!strcasecmp(mode, "border")) {
+               return LAB_SSD_MODE_BORDER;
+       } else {
+               return LAB_SSD_MODE_FULL;
+       }
+}
+
 void
 ssd_set_active(struct ssd *ssd, bool active)
 {
index d7e62646b9e08a9ad492375b27c8b2bb1a2951c8..103de9eeba53a8c4d7d6c6ef2b2f68c96e8ad688 100644 (file)
@@ -1249,6 +1249,17 @@ view_wants_decorations(struct view *view)
        }
 }
 
+void
+view_set_decorations(struct view *view, enum ssd_mode mode, bool force_ssd)
+{
+       assert(view);
+
+       if (force_ssd || !view_wants_decorations(view)
+                       || mode < view_get_ssd_mode(view)) {
+               view_set_ssd_mode(view, mode);
+       }
+}
+
 void
 view_toggle_decorations(struct view *view)
 {