decorations: allow to set specific mode via Decorate action

This commit is contained in:
Tobias Bengfort 2024-04-19 13:24:18 +02:00
parent c9fc9e566a
commit 85e1b454ff
4 changed files with 63 additions and 6 deletions

View file

@ -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.
*<action name="Decorate" />*
*<action name="Decorate" mode="value" />*
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.
*<action name="Undecorate" />*
Disable decorations of focused window.
Alias for '<action name="Decorate" mode="no" />'
*<action name="ToggleFullscreen" />*
Toggle fullscreen state of focused window.

View file

@ -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);

View file

@ -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:

View file

@ -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)