mirror of
https://github.com/labwc/labwc.git
synced 2025-10-29 05:40:24 -04:00
src/action.c: add none branch to the ForEach action
This allows implementing a run_or_raise behavior. For an example see https://github.com/labwc/labwc/pull/1710#issuecomment-2054002641 Fixes: #1298
This commit is contained in:
parent
c841a25acf
commit
76bdaac4dc
2 changed files with 26 additions and 4 deletions
16
src/action.c
16
src/action.c
|
|
@ -515,7 +515,7 @@ action_is_valid(struct action *action)
|
|||
case ACTION_TYPE_IF:
|
||||
case ACTION_TYPE_FOR_EACH:
|
||||
; /* works around "a label can only be part of a statement" */
|
||||
static const char * const branches[] = { "then", "else" };
|
||||
static const char * const branches[] = { "then", "else", "none" };
|
||||
for (size_t i = 0; i < ARRAY_SIZE(branches); i++) {
|
||||
struct wl_list *children = action_get_actionlist(action, branches[i]);
|
||||
if (children && !action_list_is_valid(children)) {
|
||||
|
|
@ -636,7 +636,7 @@ view_for_action(struct view *activator, struct server *server,
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
static bool
|
||||
run_if_action(struct view *view, struct server *server, struct action *action)
|
||||
{
|
||||
struct view_query *query;
|
||||
|
|
@ -659,6 +659,7 @@ run_if_action(struct view *view, struct server *server, struct action *action)
|
|||
if (actions) {
|
||||
actions_run(view, server, actions, 0);
|
||||
}
|
||||
return !strcmp(branch, "then");
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -984,12 +985,20 @@ actions_run(struct view *activator, struct server *server,
|
|||
{
|
||||
struct wl_array views;
|
||||
struct view **item;
|
||||
bool matches = false;
|
||||
wl_array_init(&views);
|
||||
view_array_append(server, &views, LAB_VIEW_CRITERIA_NONE);
|
||||
wl_array_for_each(item, &views) {
|
||||
run_if_action(*item, server, action);
|
||||
matches |= run_if_action(*item, server, action);
|
||||
}
|
||||
wl_array_release(&views);
|
||||
if (!matches) {
|
||||
struct wl_list *actions;
|
||||
actions = action_get_actionlist(action, "none");
|
||||
if (actions) {
|
||||
actions_run(view, server, actions, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ACTION_TYPE_VIRTUAL_OUTPUT_ADD:
|
||||
|
|
@ -1052,4 +1061,3 @@ actions_run(struct view *activator, struct server *server,
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@ static bool in_window_rules;
|
|||
static bool in_action_query;
|
||||
static bool in_action_then_branch;
|
||||
static bool in_action_else_branch;
|
||||
static bool in_action_none_branch;
|
||||
|
||||
static struct usable_area_override *current_usable_area_override;
|
||||
static struct keybind *current_keybind;
|
||||
|
|
@ -282,6 +283,7 @@ fill_child_action(char *nodename, char *content, struct action *parent,
|
|||
string_truncate_at_pattern(nodename, ".mousebind.context.mouse");
|
||||
string_truncate_at_pattern(nodename, ".then.action");
|
||||
string_truncate_at_pattern(nodename, ".else.action");
|
||||
string_truncate_at_pattern(nodename, ".none.action");
|
||||
|
||||
if (!strcasecmp(nodename, "action")) {
|
||||
current_child_action = NULL;
|
||||
|
|
@ -731,6 +733,9 @@ entry(xmlNode *node, char *nodename, char *content)
|
|||
} else if (in_action_else_branch) {
|
||||
fill_child_action(nodename, content,
|
||||
current_keybind_action, "else");
|
||||
} else if (in_action_none_branch) {
|
||||
fill_child_action(nodename, content,
|
||||
current_keybind_action, "none");
|
||||
} else {
|
||||
fill_keybind(nodename, content);
|
||||
}
|
||||
|
|
@ -745,6 +750,9 @@ entry(xmlNode *node, char *nodename, char *content)
|
|||
} else if (in_action_else_branch) {
|
||||
fill_child_action(nodename, content,
|
||||
current_mousebind_action, "else");
|
||||
} else if (in_action_none_branch) {
|
||||
fill_child_action(nodename, content,
|
||||
current_mousebind_action, "none");
|
||||
} else {
|
||||
fill_mousebind(nodename, content);
|
||||
}
|
||||
|
|
@ -1085,6 +1093,12 @@ xml_tree_walk(xmlNode *node)
|
|||
in_action_else_branch = false;
|
||||
continue;
|
||||
}
|
||||
if (!strcasecmp((char *)n->name, "none")) {
|
||||
in_action_none_branch = true;
|
||||
traverse(n);
|
||||
in_action_none_branch = false;
|
||||
continue;
|
||||
}
|
||||
traverse(n);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue