void actions_run(struct view *activator, struct server *server,
struct wl_list *actions, uint32_t resize_edges);
+
+void action_free(struct action *action);
void action_list_free(struct wl_list *action_list);
#endif /* LABWC_ACTION_H */
return false;
}
-void action_list_free(struct wl_list *action_list)
+void
+action_free(struct action *action)
{
+ /* Free args */
struct action_arg *arg, *arg_tmp;
+ wl_list_for_each_safe(arg, arg_tmp, &action->args, link) {
+ wl_list_remove(&arg->link);
+ zfree(arg->key);
+ if (arg->type == LAB_ACTION_ARG_STR) {
+ struct action_arg_str *str_arg = (struct action_arg_str *)arg;
+ zfree(str_arg->value);
+ }
+ zfree(arg);
+ }
+ zfree(action);
+}
+
+void
+action_list_free(struct wl_list *action_list)
+{
struct action *action, *action_tmp;
- /* Free actions */
wl_list_for_each_safe(action, action_tmp, action_list, link) {
wl_list_remove(&action->link);
- /* Free args */
- wl_list_for_each_safe(arg, arg_tmp, &action->args, link) {
- wl_list_remove(&arg->link);
- zfree(arg->key);
- if (arg->type == LAB_ACTION_ARG_STR) {
- free((void *)action_str_from_arg(arg));
- }
- zfree(arg);
- }
- zfree(action);
+ action_free(action);
}
}
zfree(rule);
}
+static void
+validate_actions(void)
+{
+ struct action *action, *action_tmp;
+
+ struct keybind *keybind;
+ wl_list_for_each(keybind, &rc.keybinds, link) {
+ wl_list_for_each_safe(action, action_tmp, &keybind->actions, link) {
+ if (!action_is_valid(action)) {
+ wl_list_remove(&action->link);
+ action_free(action);
+ wlr_log(WLR_ERROR, "Removed invalid keybind action");
+ }
+ }
+ }
+
+ struct mousebind *mousebind;
+ wl_list_for_each(mousebind, &rc.mousebinds, link) {
+ wl_list_for_each_safe(action, action_tmp, &mousebind->actions, link) {
+ if (!action_is_valid(action)) {
+ wl_list_remove(&action->link);
+ action_free(action);
+ wlr_log(WLR_ERROR, "Removed invalid mousebind action");
+ }
+ }
+ }
+
+ struct window_rule *rule;
+ wl_list_for_each(rule, &rc.window_rules, link) {
+ wl_list_for_each_safe(action, action_tmp, &rule->actions, link) {
+ if (!action_is_valid(action)) {
+ wl_list_remove(&action->link);
+ action_free(action);
+ wlr_log(WLR_ERROR, "Removed invalid window rule action");
+ }
+ }
+ }
+}
+
static void
validate(void)
{
}
/* Window-rule criteria */
- struct window_rule *rule, *next;
- wl_list_for_each_safe(rule, next, &rc.window_rules, link) {
+ struct window_rule *rule, *rule_tmp;
+ wl_list_for_each_safe(rule, rule_tmp, &rc.window_rules, link) {
if (!rule->identifier && !rule->title) {
wlr_log(WLR_ERROR, "Deleting rule %p as it has no criteria", rule);
rule_destroy(rule);
}
}
+
+ validate_actions();
}
static void
}
}
+static void
+validate_menu(struct menu *menu)
+{
+ struct menuitem *item;
+ struct action *action, *action_tmp;
+ wl_list_for_each(item, &menu->menuitems, link) {
+ wl_list_for_each_safe(action, action_tmp, &item->actions, link) {
+ if (!action_is_valid(action)) {
+ wl_list_remove(&action->link);
+ action_free(action);
+ wlr_log(WLR_ERROR, "Removed invalid menu action");
+ }
+ }
+ }
+}
+
+static void
+validate(struct server *server)
+{
+ for (int i = 0; i < nr_menus; ++i) {
+ validate_menu(menus + i);
+ }
+}
+
static struct menuitem *
item_create(struct menu *menu, const char *text, bool show_arrow)
{
init_rootmenu(server);
init_windowmenu(server);
post_processing(server);
+ validate(server);
}
void