From: Andrew J. Hesford Date: Thu, 31 Oct 2024 01:05:23 +0000 (-0400) Subject: config/rcxml.c: fix parsing of three-state query parameters X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=2b877d22936dabd333fe8fbe9eb961e8196301b9;p=proto%2Flabwc.git config/rcxml.c: fix parsing of three-state query parameters --- diff --git a/include/common/parse-bool.h b/include/common/parse-bool.h index 65fff384..2d26c4b8 100644 --- a/include/common/parse-bool.h +++ b/include/common/parse-bool.h @@ -2,6 +2,16 @@ #ifndef LABWC_PARSE_BOOL_H #define LABWC_PARSE_BOOL_H #include +#include "view.h" + +/** + * parse_three_state() - Parse boolean value of string as a three-state enum. + * @string: String to interpret. This check is case-insensitive. + * + * Return: LAB_STATE_DISABLED for false; LAB_STATE_ENABLED for true; + * LAB_STATE_UNSPECIFIED for non-boolean + */ +enum three_state parse_three_state(const char *str); /** * parse_bool() - Parse boolean value of string. diff --git a/src/common/parse-bool.c b/src/common/parse-bool.c index edef698a..dc6780f5 100644 --- a/src/common/parse-bool.c +++ b/src/common/parse-bool.c @@ -3,31 +3,41 @@ #include #include "common/parse-bool.h" -int -parse_bool(const char *str, int default_value) +enum three_state +parse_three_state(const char *str) { if (!str) { goto error_not_a_boolean; } else if (!strcasecmp(str, "yes")) { - return true; + return LAB_STATE_ENABLED; } else if (!strcasecmp(str, "true")) { - return true; + return LAB_STATE_ENABLED; } else if (!strcasecmp(str, "on")) { - return true; + return LAB_STATE_ENABLED; } else if (!strcmp(str, "1")) { - return true; + return LAB_STATE_ENABLED; } else if (!strcasecmp(str, "no")) { - return false; + return LAB_STATE_DISABLED; } else if (!strcasecmp(str, "false")) { - return false; + return LAB_STATE_DISABLED; } else if (!strcasecmp(str, "off")) { - return false; + return LAB_STATE_DISABLED; } else if (!strcmp(str, "0")) { - return false; + return LAB_STATE_DISABLED; } error_not_a_boolean: wlr_log(WLR_ERROR, "(%s) is not a boolean value", str); - return default_value; + return LAB_STATE_UNSPECIFIED; +} + +int +parse_bool(const char *str, int default_value) +{ + enum three_state val = parse_three_state(str); + if (val == LAB_STATE_UNSPECIFIED) { + return default_value; + } + return (val == LAB_STATE_ENABLED) ? 1 : 0; } void diff --git a/src/config/rcxml.c b/src/config/rcxml.c index 198fe38b..e4f6426e 100644 --- a/src/config/rcxml.c +++ b/src/config/rcxml.c @@ -474,15 +474,15 @@ fill_action_query(char *nodename, char *content, struct action *action) } else if (!strcasecmp(nodename, "sandboxAppId")) { current_view_query->sandbox_app_id = xstrdup(content); } else if (!strcasecmp(nodename, "shaded")) { - current_view_query->shaded = parse_bool(content, -1); + current_view_query->shaded = parse_three_state(content); } else if (!strcasecmp(nodename, "maximized")) { current_view_query->maximized = view_axis_parse(content); } else if (!strcasecmp(nodename, "iconified")) { - current_view_query->iconified = parse_bool(content, -1); + current_view_query->iconified = parse_three_state(content); } else if (!strcasecmp(nodename, "focused")) { - current_view_query->focused = parse_bool(content, -1); + current_view_query->focused = parse_three_state(content); } else if (!strcasecmp(nodename, "omnipresent")) { - current_view_query->omnipresent = parse_bool(content, -1); + current_view_query->omnipresent = parse_three_state(content); } else if (!strcasecmp(nodename, "tiled")) { current_view_query->tiled = view_edge_parse(content); } else if (!strcasecmp(nodename, "tiled_region")) {