]> git.mdlowis.com Git - proto/labwc.git/commitdiff
config: validate keybind, mousebind and menu actions
authorConsolatis <35009135+Consolatis@users.noreply.github.com>
Sat, 13 May 2023 14:27:46 +0000 (16:27 +0200)
committerConsolatis <35009135+Consolatis@users.noreply.github.com>
Wed, 5 Jul 2023 20:20:18 +0000 (22:20 +0200)
include/action.h
src/action.c
src/config/rcxml.c
src/menu/menu.c

index 76c6fc98a8a86b6994943e95bf6653d24eb36825..f11e4c116b31ec20eb17c294d014e8b048e630b7 100644 (file)
@@ -30,6 +30,8 @@ bool actions_contain_toggle_keybinds(struct wl_list *action_list);
 
 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 */
index ad5a657b622fd1ab9280be66b53e1728a11479bd..65f33de141a5eef717c24e7c2ae2ace8ae159126 100644 (file)
@@ -401,23 +401,30 @@ action_is_valid(struct action *action)
        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);
        }
 }
 
index f78559d341fb0b7785e257a383a5e26454c455b4..f0af0b515e60a9609ad29f609110da1731491589 100644 (file)
@@ -1121,6 +1121,45 @@ rule_destroy(struct window_rule *rule)
        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)
 {
@@ -1144,13 +1183,15 @@ 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
index ff7bfda85bd6b08228130759da69f54c1918954b..71419be4dbb213a1fd032460f0f08b1793e74561 100644 (file)
@@ -128,6 +128,30 @@ post_processing(struct server *server)
        }
 }
 
+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)
 {
@@ -730,6 +754,7 @@ menu_init(struct server *server)
        init_rootmenu(server);
        init_windowmenu(server);
        post_processing(server);
+       validate(server);
 }
 
 void