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)