]> git.mdlowis.com Git - proto/labwc.git/commitdiff
action: add get_arg_value_{str,bool} to simplify multi-arg handling
authorJohan Malm <jgm323@gmail.com>
Sun, 26 Mar 2023 21:19:47 +0000 (22:19 +0100)
committerJohan Malm <johanmalm@users.noreply.github.com>
Wed, 26 Apr 2023 14:11:31 +0000 (15:11 +0100)
src/action.c

index 3f7042ca23b2d8346be69dd44b30d94eeeac02a9..920981947522b6ddf329837577d127dc90366f4e 100644 (file)
@@ -164,18 +164,38 @@ action_arg_from_xml_node(struct action *action, char *nodename, char *content)
        }
 }
 
-static char *
+static const char *
 action_str_from_arg(struct action_arg *arg)
 {
        assert(arg->type == LAB_ACTION_ARG_STR);
        return ((struct action_arg_str *)arg)->value;
 }
 
+static const char *
+get_arg_value_str(struct action *action, const char *key, const char *default_value)
+{
+       assert(key);
+       struct action_arg *arg;
+       wl_list_for_each(arg, &action->args, link) {
+               if (!strcasecmp(key, arg->key)) {
+                       return action_str_from_arg(arg);
+               }
+       }
+       return default_value;
+}
+
 static bool
-action_bool_from_arg(struct action_arg *arg)
+get_arg_value_bool(struct action *action, const char *key, bool default_value)
 {
-       assert(arg->type == LAB_ACTION_ARG_BOOL);
-       return ((struct action_arg_bool *)arg)->value;
+       assert(key);
+       struct action_arg *arg;
+       wl_list_for_each(arg, &action->args, link) {
+               if (!strcasecmp(key, arg->key)) {
+                       assert(arg->type == LAB_ACTION_ARG_BOOL);
+                       return ((struct action_arg_bool *)arg)->value;
+               }
+       }
+       return default_value;
 }
 
 static struct action_arg *
@@ -244,7 +264,7 @@ void action_list_free(struct wl_list *action_list)
                        wl_list_remove(&arg->link);
                        zfree(arg->key);
                        if (arg->type == LAB_ACTION_ARG_STR) {
-                               free(action_str_from_arg(arg));
+                               free((void *)action_str_from_arg(arg));
                        }
                        zfree(arg);
                }
@@ -484,7 +504,7 @@ actions_run(struct view *activator, struct server *server,
                                break;
                        }
                        struct workspace *target;
-                       char *target_name = action_str_from_arg(arg);
+                       const char *target_name = action_str_from_arg(arg);
                        target = workspaces_find(server->workspace_current, target_name);
                        if (target) {
                                workspaces_switch_to(target);
@@ -492,19 +512,9 @@ actions_run(struct view *activator, struct server *server,
                        break;
                case ACTION_TYPE_SEND_TO_DESKTOP:
                        if (view) {
-                               struct action_arg *arg;
-                               char *target_name = NULL;
-                               struct workspace *target;
-                               bool follow = true;
-
-                               wl_list_for_each(arg, &action->args, link) {
-                                       if (!strcmp("to", arg->key)) {
-                                               target_name = action_str_from_arg(arg);
-                                       } else if (!strcmp("follow", arg->key)) {
-                                               follow = action_bool_from_arg(arg);
-                                       }
-                               }
-                               target = workspaces_find(view->workspace, target_name);
+                               const char *to = get_arg_value_str(action, "to", NULL);
+                               bool follow = get_arg_value_bool(action, "follow", true);
+                               struct workspace *target = workspaces_find(view->workspace, to);
                                if (target) {
                                        view_move_to_workspace(view, target);
                                        if (follow) {