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)) {
}
}
-static void
+static bool
run_if_action(struct view *view, struct server *server, struct action *action)
{
struct view_query *query;
if (actions) {
actions_run(view, server, actions, 0);
}
+ return !strcmp(branch, "then");
}
void
{
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:
}
}
}
-
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;
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;
} 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);
}
} 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);
}
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);
}
}