query: added "decoration" option

This commit is contained in:
Orfeas 2024-10-25 23:05:45 +03:00
parent e0fa623d42
commit 9181ea1e6f
6 changed files with 38 additions and 9 deletions

View file

@ -62,9 +62,10 @@ enum ssd_part_type {
}; };
enum ssd_mode { enum ssd_mode {
LAB_SSD_MODE_INVALID,
LAB_SSD_MODE_NONE, LAB_SSD_MODE_NONE,
LAB_SSD_MODE_BORDER, LAB_SSD_MODE_BORDER,
LAB_SSD_MODE_FULL LAB_SSD_MODE_FULL,
}; };
/* Forward declare arguments */ /* Forward declare arguments */

View file

@ -300,6 +300,7 @@ struct view_query {
enum view_edge tiled; enum view_edge tiled;
char *tiled_region; char *tiled_region;
char *desktop; char *desktop;
enum ssd_mode decoration;
}; };
struct xdg_toplevel_view { struct xdg_toplevel_view {

View file

@ -378,7 +378,12 @@ action_arg_from_xml_node(struct action *action, const char *nodename, const char
case ACTION_TYPE_SET_DECORATIONS: case ACTION_TYPE_SET_DECORATIONS:
if (!strcmp(argument, "decorations")) { if (!strcmp(argument, "decorations")) {
enum ssd_mode mode = ssd_mode_parse(content); enum ssd_mode mode = ssd_mode_parse(content);
if (mode != LAB_SSD_MODE_INVALID) {
action_arg_add_int(action, argument, mode); action_arg_add_int(action, argument, mode);
} else {
wlr_log(WLR_ERROR, "Invalid argument for action %s: '%s' (%s)",
action_names[action->type], argument, content);
}
goto cleanup; goto cleanup;
} }
if (!strcasecmp(argument, "forceSSD")) { if (!strcasecmp(argument, "forceSSD")) {

View file

@ -493,6 +493,8 @@ fill_action_query(char *nodename, char *content, struct action *action)
current_view_query->tiled_region = xstrdup(content); current_view_query->tiled_region = xstrdup(content);
} else if (!strcasecmp(nodename, "desktop")) { } else if (!strcasecmp(nodename, "desktop")) {
current_view_query->desktop = xstrdup(content); current_view_query->desktop = xstrdup(content);
} else if (!strcasecmp(nodename, "decoration")) {
current_view_query->decoration = ssd_mode_parse(content);
} }
} }

View file

@ -350,14 +350,16 @@ enum ssd_mode
ssd_mode_parse(const char *mode) ssd_mode_parse(const char *mode)
{ {
if (!mode) { if (!mode) {
return LAB_SSD_MODE_FULL; return LAB_SSD_MODE_INVALID;
} }
if (!strcasecmp(mode, "none")) { if (!strcasecmp(mode, "none")) {
return LAB_SSD_MODE_NONE; return LAB_SSD_MODE_NONE;
} else if (!strcasecmp(mode, "border")) { } else if (!strcasecmp(mode, "border")) {
return LAB_SSD_MODE_BORDER; return LAB_SSD_MODE_BORDER;
} else { } else if (!strcasecmp(mode, "full")) {
return LAB_SSD_MODE_FULL; return LAB_SSD_MODE_FULL;
} else {
return LAB_SSD_MODE_INVALID;
} }
} }

View file

@ -89,14 +89,20 @@ view_query_free(struct view_query *query)
zfree(query); zfree(query);
} }
static enum three_state
bool_to_tristate(bool b)
{
return b ? LAB_STATE_ENABLED : LAB_STATE_DISABLED;
}
static enum three_state static enum three_state
match_tristate(enum three_state desired, bool actual, enum three_state old_match) match_tristate(enum three_state desired, bool actual, enum three_state old_match)
{ {
switch (desired) { switch (desired) {
case LAB_STATE_ENABLED: case LAB_STATE_ENABLED:
return actual ? LAB_STATE_ENABLED : LAB_STATE_DISABLED; return bool_to_tristate(actual);
case LAB_STATE_DISABLED: case LAB_STATE_DISABLED:
return actual ? LAB_STATE_DISABLED : LAB_STATE_ENABLED; return bool_to_tristate(!actual);
default: default:
return old_match; return old_match;
} }
@ -209,14 +215,26 @@ view_matches_query(struct view *view, struct view_query *query)
if (query->desktop) { if (query->desktop) {
if (!strcasecmp(query->desktop, "other")) { if (!strcasecmp(query->desktop, "other")) {
return strcasecmp(view->workspace->name, struct workspace *current = view->server->workspaces.current;
view->server->workspaces.current->name); match = bool_to_tristate(strcasecmp(view->workspace->name, current->name));
} else { } else {
// TODO: perhaps allow wrapping for "left" and "right" workspaces // TODO: perhaps allow wrapping for "left" and "right" workspaces
struct workspace *target = struct workspace *target =
workspaces_find(view->server->workspaces.current, workspaces_find(view->server->workspaces.current,
query->desktop, false); query->desktop, false);
return target && !strcasecmp(view->workspace->name, target->name); match = bool_to_tristate(target &&
!strcasecmp(view->workspace->name, target->name));
}
if (match == LAB_STATE_DISABLED) {
return false;
}
}
enum ssd_mode decoration = view_get_ssd_mode(view);
if (query->decoration != LAB_SSD_MODE_INVALID) {
match = bool_to_tristate(query->decoration == decoration);
if (match == LAB_STATE_DISABLED) {
return false;
} }
} }