diff --git a/docs/labwc-actions.5.scd b/docs/labwc-actions.5.scd
index 4e76407e..58892582 100644
--- a/docs/labwc-actions.5.scd
+++ b/docs/labwc-actions.5.scd
@@ -128,12 +128,19 @@ Actions are used in menus and keyboard/mouse bindings.
By disabling the theme configuration 'keepBorder' the first step
will be removed and the action only toggles between on and off.
-**
+**
Enable decorations of focused window.
+ *mode* [yes|no|full|border|none] "full", "border" and "none" are the
+ three modes described in 'ToggleDecorations'. "yes" and "no"
+ automatically select an appropriate mode based on 'keepBorder' and
+ whether the window has client side decorations. Default is yes.
+
**
Disable decorations of focused window.
+ Alias for ''
+
**
Toggle fullscreen state of focused window.
diff --git a/include/view.h b/include/view.h
index 3654fc68..38610e10 100644
--- a/include/view.h
+++ b/include/view.h
@@ -33,7 +33,9 @@ enum ssd_preference {
enum ssd_mode {
LAB_SSD_MODE_NONE,
LAB_SSD_MODE_BORDER,
- LAB_SSD_MODE_FULL
+ LAB_SSD_MODE_FULL,
+ LAB_SSD_MODE_YES,
+ LAB_SSD_MODE_NO
};
/**
@@ -503,6 +505,7 @@ struct output *view_get_adjacent_output(struct view *view, enum view_edge edge,
bool wrap);
enum view_axis view_axis_parse(const char *direction);
enum view_edge view_edge_parse(const char *direction);
+enum ssd_mode ssd_mode_parse(const char *mode);
/* xdg.c */
struct wlr_xdg_surface *xdg_surface_from_view(struct view *view);
diff --git a/src/action.c b/src/action.c
index 9195d930..4e76d2bf 100644
--- a/src/action.c
+++ b/src/action.c
@@ -344,6 +344,13 @@ action_arg_from_xml_node(struct action *action, const char *nodename, const char
goto cleanup;
}
break;
+ case ACTION_TYPE_DECORATE:
+ if (!strcmp(argument, "mode")) {
+ enum ssd_mode mode = ssd_mode_parse(content);
+ action_arg_add_int(action, argument, mode);
+ goto cleanup;
+ }
+ break;
case ACTION_TYPE_RESIZE_RELATIVE:
if (!strcmp(argument, "left") || !strcmp(argument, "right") ||
!strcmp(argument, "top") || !strcmp(argument, "bottom")) {
@@ -796,12 +803,14 @@ actions_run(struct view *activator, struct server *server,
break;
case ACTION_TYPE_DECORATE:
if (view) {
- view_set_decorations(view, LAB_SSD_MODE_FULL);
+ enum ssd_mode mode = action_get_int(action,
+ "mode", LAB_SSD_MODE_YES);
+ view_set_decorations(view, mode);
}
break;
case ACTION_TYPE_UNDECORATE:
if (view) {
- view_set_decorations(view, LAB_SSD_MODE_NONE);
+ view_set_decorations(view, LAB_SSD_MODE_NO);
}
break;
case ACTION_TYPE_TOGGLE_ALWAYS_ON_TOP:
diff --git a/src/view.c b/src/view.c
index 57842634..f1e6eb1f 100644
--- a/src/view.c
+++ b/src/view.c
@@ -1287,6 +1287,24 @@ undecorate(struct view *view)
view->ssd = NULL;
}
+static enum ssd_mode
+resolve_ssd_mode(struct view *view, enum ssd_mode mode)
+{
+ assert(view);
+
+ if (mode == LAB_SSD_MODE_YES) {
+ return LAB_SSD_MODE_FULL;
+ } else if (mode == LAB_SSD_MODE_NO) {
+ if (rc.ssd_keep_border && has_ssd(view)) {
+ return LAB_SSD_MODE_BORDER;
+ } else {
+ return LAB_SSD_MODE_NONE;
+ }
+ } else {
+ return mode;
+ }
+}
+
void
view_set_decorations(struct view *view, enum ssd_mode mode)
{
@@ -1296,8 +1314,9 @@ view_set_decorations(struct view *view, enum ssd_mode mode)
return;
}
- bool ssd_enabled = mode != LAB_SSD_MODE_NONE;
- bool titlebar_hidden = mode != LAB_SSD_MODE_FULL;
+ enum ssd_mode resolved = resolve_ssd_mode(view, mode);
+ bool ssd_enabled = resolved != LAB_SSD_MODE_NONE;
+ bool titlebar_hidden = resolved != LAB_SSD_MODE_FULL;
if (view->ssd_enabled == ssd_enabled
&& view->ssd_titlebar_hidden == titlebar_hidden) {
@@ -1844,6 +1863,25 @@ view_edge_parse(const char *direction)
}
}
+enum ssd_mode
+ssd_mode_parse(const char *mode)
+{
+ if (!mode) {
+ return LAB_SSD_MODE_NO;
+ }
+ if (!strcasecmp(mode, "full")) {
+ return LAB_SSD_MODE_FULL;
+ } else if (!strcasecmp(mode, "border")) {
+ return LAB_SSD_MODE_BORDER;
+ } else if (!strcasecmp(mode, "none")) {
+ return LAB_SSD_MODE_NONE;
+ } else if (!strcasecmp(mode, "yes")) {
+ return LAB_SSD_MODE_YES;
+ } else {
+ return LAB_SSD_MODE_NO;
+ }
+}
+
void
view_snap_to_edge(struct view *view, enum view_edge edge,
bool across_outputs, bool store_natural_geometry)