diff --git a/config.h b/config.h index 25f35b8..1a996c3 100644 --- a/config.h +++ b/config.h @@ -46,8 +46,7 @@ struct settings defaults = { .separator_height = 2, /* height of the separator line between two notifications */ .padding = 0, .h_padding = 0, /* horizontal padding */ -.sep_color = SEP_AUTO, /* SEP_AUTO, SEP_FOREGROUND, SEP_FRAME, SEP_CUSTOM */ -.sep_custom_color_str = NULL,/* custom color if sep_color is set to CUSTOM */ +.sep_color = {SEP_AUTO}, /* SEP_AUTO, SEP_FOREGROUND, SEP_FRAME, SEP_CUSTOM */ .frame_width = 0, .frame_color = "#888888", diff --git a/src/dbus.c b/src/dbus.c index 3994c4f..679a489 100644 --- a/src/dbus.c +++ b/src/dbus.c @@ -463,8 +463,8 @@ static bool dbus_get_fdn_daemon_info(GDBusConnection *connection, char **name, char **vendor) { - g_return_val_if_fail(pid, false); - g_return_val_if_fail(connection, false); + ASSERT_OR_RET(pid, false); + ASSERT_OR_RET(connection, false); char *owner = NULL; GError *error = NULL; diff --git a/src/draw.c b/src/draw.c index 5e50e0b..bae6a30 100644 --- a/src/draw.c +++ b/src/draw.c @@ -93,14 +93,14 @@ static struct color calculate_foreground_color(struct color bg) static struct color layout_get_sepcolor(struct colored_layout *cl, struct colored_layout *cl_next) { - switch (settings.sep_color) { + switch (settings.sep_color.type) { case SEP_FRAME: if (cl_next->n->urgency > cl->n->urgency) return cl_next->frame; else return cl->frame; case SEP_CUSTOM: - return string_to_color(settings.sep_custom_color_str); + return string_to_color(settings.sep_color.sep_color); case SEP_FOREGROUND: return cl->fg; case SEP_AUTO: @@ -486,7 +486,7 @@ static cairo_surface_t *render_background(cairo_surface_t *srf, draw_rounded_rect(c, x, y, width, height, corner_radius, first, last); cairo_fill(c); - if ( settings.sep_color != SEP_FRAME + if ( settings.sep_color.type != SEP_FRAME && settings.separator_height > 0 && !last) { struct color sep_color = layout_get_sepcolor(cl, cl_next); diff --git a/src/icon.c b/src/icon.c index b45e413..8cdc194 100644 --- a/src/icon.c +++ b/src/icon.c @@ -206,8 +206,7 @@ cairo_surface_t *icon_get_for_notification(const struct notification *n) else return NULL; - if (!pixbuf) - return NULL; + ASSERT_OR_RET(pixbuf, NULL); int w = gdk_pixbuf_get_width(pixbuf); int h = gdk_pixbuf_get_height(pixbuf); diff --git a/src/log.c b/src/log.c index a5e7de7..8e1ac54 100644 --- a/src/log.c +++ b/src/log.c @@ -30,8 +30,7 @@ static const char *log_level_to_string(GLogLevelFlags level) /* see log.h */ void log_set_level_from_string(const char *level) { - if (!level) - return; + ASSERT_OR_RET(level,); if (STR_CASEQ(level, "critical")) log_level = G_LOG_LEVEL_CRITICAL; diff --git a/src/markup.c b/src/markup.c index 3f74716..8877138 100644 --- a/src/markup.c +++ b/src/markup.c @@ -18,8 +18,7 @@ */ static char *markup_quote(char *str) { - if (!str) - return NULL; + ASSERT_OR_RET(str, NULL); str = string_replace_all("&", "&", str); str = string_replace_all("\"", """, str); @@ -36,8 +35,7 @@ static char *markup_quote(char *str) */ static char *markup_unquote(char *str) { - if (!str) - return NULL; + ASSERT_OR_RET(str, NULL); str = string_replace_all(""", "\"", str); str = string_replace_all("'", "'", str); @@ -54,8 +52,7 @@ static char *markup_unquote(char *str) */ static char *markup_br2nl(char *str) { - if (!str) - return NULL; + ASSERT_OR_RET(str, NULL); str = string_replace_all("
", "\n", str); str = string_replace_all("
", "\n", str); @@ -224,8 +221,7 @@ void markup_strip_img(char **str, char **urls) /* see markup.h */ char *markup_strip(char *str) { - if (!str) - return NULL; + ASSERT_OR_RET(str, NULL); /* strip all tags */ string_strip_delimited(str, '<', '>'); @@ -248,8 +244,7 @@ static bool markup_is_entity(const char *str) assert(*str == '&'); char *end = strchr(str, ';'); - if (!end) - return false; + ASSERT_OR_RET(end, false); // Parse (hexa)decimal entities with the format Ӓ or ઼ if (str[1] == '#') { @@ -293,8 +288,7 @@ static bool markup_is_entity(const char *str) */ static char *markup_escape_unsupported(char *str) { - if (!str) - return NULL; + ASSERT_OR_RET(str, NULL); char *match = str; while ((match = strchr(match, '&'))) { @@ -313,8 +307,7 @@ static char *markup_escape_unsupported(char *str) /* see markup.h */ char *markup_transform(char *str, enum markup_mode markup_mode) { - if (!str) - return NULL; + ASSERT_OR_RET(str, NULL); switch (markup_mode) { case MARKUP_NULL: diff --git a/src/menu.c b/src/menu.c index 1c52a5a..71f1a6b 100644 --- a/src/menu.c +++ b/src/menu.c @@ -222,8 +222,7 @@ void invoke_action(const char *action) */ void dispatch_menu_result(const char *input) { - if (!input) - return; + ASSERT_OR_RET(input,); char *in = g_strdup(input); g_strstrip(in); @@ -248,8 +247,7 @@ char *invoke_dmenu(const char *dmenu_input) return NULL; } - if (!dmenu_input || *dmenu_input == '\0') - return NULL; + ASSERT_OR_RET(STR_FULL(dmenu_input), NULL); gint dunst_to_dmenu; gint dmenu_to_dunst; diff --git a/src/notification.c b/src/notification.c index f9bde8a..968dd7b 100644 --- a/src/notification.c +++ b/src/notification.c @@ -168,8 +168,7 @@ int notification_cmp_data(const void *va, const void *vb, void *data) struct notification *a = (struct notification *) va; struct notification *b = (struct notification *) vb; - if (!settings.sort) - return 1; + ASSERT_OR_RET(settings.sort, 1); return notification_cmp(a, b); } @@ -191,8 +190,7 @@ int notification_is_duplicate(const struct notification *a, const struct notific /* see notification.h */ void rawimage_free(struct raw_image *i) { - if (!i) - return; + ASSERT_OR_RET(i,); g_free(i->data); g_free(i); @@ -220,8 +218,7 @@ void notification_ref(struct notification *n) /* see notification.h */ void notification_unref(struct notification *n) { - if (!n) - return; + ASSERT_OR_RET(n,); assert(n->priv->refcount > 0); if (!g_atomic_int_dec_and_test(&n->priv->refcount)) diff --git a/src/option_parser.c b/src/option_parser.c index 0bd78bb..9dbca54 100644 --- a/src/option_parser.c +++ b/src/option_parser.c @@ -11,6 +11,7 @@ #include "dunst.h" #include "log.h" #include "utils.h" +#include "settings.h" struct entry { char *key; @@ -39,6 +40,122 @@ static void cmdline_usage_append(const char *key, const char *type, const char * static int cmdline_find_option(const char *key); +#define STRING_PARSE_RET(string, value) if (STR_EQ(s, string)) { *ret = value; return true; } + +bool string_parse_alignment(const char *s, enum alignment *ret) +{ + ASSERT_OR_RET(s, false); + ASSERT_OR_RET(ret, false); + + STRING_PARSE_RET("left", ALIGN_LEFT); + STRING_PARSE_RET("center", ALIGN_CENTER); + STRING_PARSE_RET("right", ALIGN_RIGHT); + + return false; +} + +bool string_parse_ellipsize(const char *s, enum ellipsize *ret) +{ + ASSERT_OR_RET(s, false); + ASSERT_OR_RET(ret, false); + + STRING_PARSE_RET("start", ELLIPSE_START); + STRING_PARSE_RET("middle", ELLIPSE_MIDDLE); + STRING_PARSE_RET("end", ELLIPSE_END); + + return false; +} + +bool string_parse_follow_mode(const char *s, enum follow_mode *ret) +{ + ASSERT_OR_RET(s, false); + ASSERT_OR_RET(ret, false); + + STRING_PARSE_RET("mouse", FOLLOW_MOUSE); + STRING_PARSE_RET("keyboard", FOLLOW_KEYBOARD); + STRING_PARSE_RET("none", FOLLOW_NONE); + + return false; +} + + +bool string_parse_fullscreen(const char *s, enum behavior_fullscreen *ret) +{ + ASSERT_OR_RET(s, false); + ASSERT_OR_RET(ret, false); + + STRING_PARSE_RET("show", FS_SHOW); + STRING_PARSE_RET("delay", FS_DELAY); + STRING_PARSE_RET("pushback", FS_PUSHBACK); + + return false; +} + +bool string_parse_icon_position(const char *s, enum icon_position *ret) +{ + ASSERT_OR_RET(s, false); + ASSERT_OR_RET(ret, false); + + STRING_PARSE_RET("left", ICON_LEFT); + STRING_PARSE_RET("right", ICON_RIGHT); + STRING_PARSE_RET("off", ICON_OFF); + + return false; +} + +bool string_parse_markup_mode(const char *s, enum markup_mode *ret) +{ + ASSERT_OR_RET(s, false); + ASSERT_OR_RET(ret, false); + + STRING_PARSE_RET("strip", MARKUP_STRIP); + STRING_PARSE_RET("no", MARKUP_NO); + STRING_PARSE_RET("full", MARKUP_FULL); + STRING_PARSE_RET("yes", MARKUP_FULL); + + return false; +} + +bool string_parse_mouse_action(const char *s, enum mouse_action *ret) +{ + ASSERT_OR_RET(s, false); + ASSERT_OR_RET(ret, false); + + STRING_PARSE_RET("none", MOUSE_NONE); + STRING_PARSE_RET("do_action", MOUSE_DO_ACTION); + STRING_PARSE_RET("close_current", MOUSE_CLOSE_CURRENT); + STRING_PARSE_RET("close_all", MOUSE_CLOSE_ALL); + + return false; +} + +bool string_parse_sepcolor(const char *s, struct separator_color_data *ret) +{ + ASSERT_OR_RET(s, false); + ASSERT_OR_RET(ret, false); + + STRING_PARSE_RET("auto", (struct separator_color_data){.type = SEP_AUTO}); + STRING_PARSE_RET("foreground", (struct separator_color_data){.type = SEP_FOREGROUND}); + STRING_PARSE_RET("frame", (struct separator_color_data){.type = SEP_FRAME}); + + ret->type = SEP_CUSTOM; + ret->sep_color = g_strdup(s); + + return true; +} + +bool string_parse_urgency(const char *s, enum urgency *ret) +{ + ASSERT_OR_RET(s, false); + ASSERT_OR_RET(ret, false); + + STRING_PARSE_RET("low", URG_LOW); + STRING_PARSE_RET("normal", URG_NORM); + STRING_PARSE_RET("critical", URG_CRIT); + + return false; +} + struct section *new_section(const char *name) { for (int i = 0; i < section_count; i++) { @@ -95,9 +212,7 @@ void add_entry(const char *section_name, const char *key, const char *value) const char *get_value(const char *section, const char *key) { struct section *s = get_section(section); - if (!s) { - return NULL; - } + ASSERT_OR_RET(s, NULL); for (int i = 0; i < s->entry_count; i++) { if (STR_EQ(s->entries[i].key, key)) { @@ -158,11 +273,8 @@ bool ini_is_set(const char *ini_section, const char *ini_key) const char *next_section(const char *section) { - if (section_count == 0) - return NULL; - - if (!section) - return sections[0].name; + ASSERT_OR_RET(section_count > 0, NULL); + ASSERT_OR_RET(section, sections[0].name); for (int i = 0; i < section_count; i++) { if (STR_EQ(section, sections[i].name)) { @@ -202,8 +314,7 @@ int ini_get_bool(const char *section, const char *key, int def) int load_ini_file(FILE *fp) { - if (!fp) - return 1; + ASSERT_OR_RET(fp, 1); char *line = NULL; size_t line_len = 0; @@ -277,9 +388,8 @@ void cmdline_load(int argc, char *argv[]) int cmdline_find_option(const char *key) { - if (!key) { - return -1; - } + ASSERT_OR_RET(key, -1); + char *key1 = g_strdup(key); char *key2 = strchr(key1, '/'); @@ -532,22 +642,4 @@ const char *cmdline_create_usage(void) return usage_str; } -/* see option_parser.h */ -enum behavior_fullscreen parse_enum_fullscreen(const char *string, enum behavior_fullscreen def) -{ - if (!string) - return def; - - if (STR_EQ(string, "show")) - return FS_SHOW; - else if (STR_EQ(string, "delay")) - return FS_DELAY; - else if (STR_EQ(string, "pushback")) - return FS_PUSHBACK; - else { - LOG_W("Unknown fullscreen value: '%s'\n", string); - return def; - } -} - /* vim: set tabstop=8 shiftwidth=8 expandtab textwidth=0: */ diff --git a/src/option_parser.h b/src/option_parser.h index d712fa8..8d98618 100644 --- a/src/option_parser.h +++ b/src/option_parser.h @@ -7,6 +7,17 @@ #include #include "dunst.h" +#include "settings.h" + +bool string_parse_alignment(const char *s, enum alignment *ret); +bool string_parse_ellipsize(const char *s, enum ellipsize *ret); +bool string_parse_follow_mode(const char *s, enum follow_mode *ret); +bool string_parse_fullscreen(const char *s, enum behavior_fullscreen *ret); +bool string_parse_icon_position(const char *s, enum icon_position *ret); +bool string_parse_markup_mode(const char *s, enum markup_mode *ret); +bool string_parse_mouse_action(const char *s, enum mouse_action *ret); +bool string_parse_sepcolor(const char *s, struct separator_color_data *ret); +bool string_parse_urgency(const char *s, enum urgency *ret); int load_ini_file(FILE *); char *ini_get_path(const char *section, const char *key, const char *def); @@ -65,17 +76,5 @@ int option_get_bool(const char *ini_section, */ const char *next_section(const char *section); -/** - * Parse the fullscreen behavior value of the given string - * - * @param string the string representation of #behavior_fullscreen. - * The string must not contain any waste characters. - * @param def value to return in case of errors - * - * @return the #behavior_fullscreen representation of `string` - * @return `def` if `string` is invalid or `NULL` - */ -enum behavior_fullscreen parse_enum_fullscreen(const char *string, enum behavior_fullscreen def); - #endif /* vim: set tabstop=8 shiftwidth=8 expandtab textwidth=0: */ diff --git a/src/queues.c b/src/queues.c index 2d47172..dcbb4e0 100644 --- a/src/queues.c +++ b/src/queues.c @@ -113,8 +113,7 @@ static void queues_swap_notifications(GQueue *queueA, */ static bool queues_notification_is_ready(const struct notification *n, struct dunst_status status, bool shown) { - if (!status.running) - return false; + ASSERT_OR_RET(status.running, false); if (status.fullscreen && shown) return n && n->fullscreen != FS_PUSHBACK; else if (status.fullscreen && !shown) @@ -418,8 +417,7 @@ void queues_update(struct dunst_status status) struct notification *n = iter->data; nextiter = iter->next; - if (!n) - return; + ASSERT_OR_RET(n,); if (!queues_notification_is_ready(n, status, false)) { iter = nextiter; diff --git a/src/settings.c b/src/settings.c index 64883d2..d4bcba2 100644 --- a/src/settings.c +++ b/src/settings.c @@ -18,80 +18,18 @@ struct settings settings; -static const char *follow_mode_to_string(enum follow_mode f_mode) +static enum urgency ini_get_urgency(const char *section, const char *key, const enum urgency def) { - switch(f_mode) { - case FOLLOW_NONE: return "none"; - case FOLLOW_MOUSE: return "mouse"; - case FOLLOW_KEYBOARD: return "keyboard"; - default: return ""; + enum urgency ret; + char *c = ini_get_string(section, key, NULL); + + if (!string_parse_urgency(c, &ret)) { + if (c) + LOG_W("Unknown urgency: '%s'", c); + ret = def; } -} -static enum follow_mode parse_follow_mode(const char *mode) -{ - if (!mode) - return FOLLOW_NONE; - - if (STR_EQ(mode, "mouse")) - return FOLLOW_MOUSE; - else if (STR_EQ(mode, "keyboard")) - return FOLLOW_KEYBOARD; - else if (STR_EQ(mode, "none")) - return FOLLOW_NONE; - else { - LOG_W("Unknown follow mode: '%s'", mode); - return FOLLOW_NONE; - } -} - -static enum markup_mode parse_markup_mode(const char *mode) -{ - if (STR_EQ(mode, "strip")) { - return MARKUP_STRIP; - } else if (STR_EQ(mode, "no")) { - return MARKUP_NO; - } else if (STR_EQ(mode, "full") || STR_EQ(mode, "yes")) { - return MARKUP_FULL; - } else { - LOG_W("Unknown markup mode: '%s'", mode); - return MARKUP_NO; - } -} - -static enum mouse_action parse_mouse_action(const char *action) -{ - if (STR_EQ(action, "none")) - return MOUSE_NONE; - else if (STR_EQ(action, "do_action")) - return MOUSE_DO_ACTION; - else if (STR_EQ(action, "close_current")) - return MOUSE_CLOSE_CURRENT; - else if (STR_EQ(action, "close_all")) - return MOUSE_CLOSE_ALL; - else { - LOG_W("Unknown mouse action: '%s'", action); - return MOUSE_NONE; - } -} - - -static enum urgency ini_get_urgency(const char *section, const char *key, const int def) -{ - int ret = def; - char *urg = ini_get_string(section, key, ""); - - if (STR_FULL(urg)) { - if (STR_EQ(urg, "low")) - ret = URG_LOW; - else if (STR_EQ(urg, "normal")) - ret = URG_NORM; - else if (STR_EQ(urg, "critical")) - ret = URG_CRIT; - else - LOG_W("Unknown urgency: '%s'", urg); - } - g_free(urg); + g_free(c); return ret; } @@ -206,13 +144,11 @@ void load_settings(char *cmdline_config_path) "Specify how markup should be handled" ); - //Use markup if set - //Use default if settings.markup not set yet - // (=>c empty&&!allow_markup) - if (c) { - settings.markup = parse_markup_mode(c); - } else if (!settings.markup) { - settings.markup = defaults.markup; + if (!string_parse_markup_mode(c, &settings.markup)) { + if (c) + LOG_W("Cannot parse markup mode value: '%s'", c); + if (!settings.markup) + settings.markup = defaults.markup; } g_free(c); } @@ -244,20 +180,13 @@ void load_settings(char *cmdline_config_path) { char *c = option_get_string( "global", - "ellipsize", "-ellipsize", "", + "ellipsize", "-ellipsize", NULL, "Ellipsize truncated lines on the start/middle/end" ); - if (STR_EMPTY(c)) { - settings.ellipsize = defaults.ellipsize; - } else if (STR_EQ(c, "start")) { - settings.ellipsize = ELLIPSE_START; - } else if (STR_EQ(c, "middle")) { - settings.ellipsize = ELLIPSE_MIDDLE; - } else if (STR_EQ(c, "end")) { - settings.ellipsize = ELLIPSE_END; - } else { - LOG_W("Unknown ellipsize value: '%s'", c); + if (!string_parse_ellipsize(c, &settings.ellipsize)) { + if (c) + LOG_W("Unknown ellipsize value: '%s'", c); settings.ellipsize = defaults.ellipsize; } g_free(c); @@ -284,11 +213,15 @@ void load_settings(char *cmdline_config_path) { char *c = option_get_string( "global", - "follow", "-follow", follow_mode_to_string(defaults.f_mode), + "follow", "-follow", NULL, "Follow mouse, keyboard or none?" ); - settings.f_mode = parse_follow_mode(c); + if (!string_parse_follow_mode(c, &settings.f_mode)) { + if (c) + LOG_W("Cannot parse follow mode: %s", c); + settings.f_mode = defaults.f_mode; + } g_free(c); } @@ -347,17 +280,14 @@ void load_settings(char *cmdline_config_path) "alignment", "-align/-alignment", "", "Text alignment left/center/right" ); - if (STR_FULL(c)) { - if (STR_EQ(c, "left")) - settings.align = ALIGN_LEFT; - else if (STR_EQ(c, "center")) - settings.align = ALIGN_CENTER; - else if (STR_EQ(c, "right")) - settings.align = ALIGN_RIGHT; - else + + if (!string_parse_alignment(c, &settings.align)) { + if (c) LOG_W("Unknown alignment value: '%s'", c); - g_free(c); + settings.align = defaults.align; } + + g_free(c); } settings.show_age_threshold = option_get_time( @@ -427,17 +357,8 @@ void load_settings(char *cmdline_config_path) "Color of the separator line (or 'auto')" ); - if (STR_FULL(c)) { - if (STR_EQ(c, "auto")) - settings.sep_color = SEP_AUTO; - else if (STR_EQ(c, "foreground")) - settings.sep_color = SEP_FOREGROUND; - else if (STR_EQ(c, "frame")) - settings.sep_color = SEP_FRAME; - else { - settings.sep_color = SEP_CUSTOM; - settings.sep_custom_color_str = g_strdup(c); - } + if (!string_parse_sepcolor(c, &settings.sep_color)) { + settings.sep_color = defaults.sep_color; } g_free(c); } @@ -494,17 +415,12 @@ void load_settings(char *cmdline_config_path) "Align icons left/right/off" ); - if (STR_FULL(c)) { - if (STR_EQ(c, "left")) - settings.icon_position = ICON_LEFT; - else if (STR_EQ(c, "right")) - settings.icon_position = ICON_RIGHT; - else if (STR_EQ(c, "off")) - settings.icon_position = ICON_OFF; - else + if (!string_parse_icon_position(c, &settings.icon_position)) { + if (c) LOG_W("Unknown icon position: '%s'", c); - g_free(c); + settings.icon_position = defaults.icon_position; } + g_free(c); } settings.max_icon_size = option_get_int( @@ -580,12 +496,11 @@ void load_settings(char *cmdline_config_path) "Action of Left click event" ); - if (c) { - settings.mouse_left_click = parse_mouse_action(c); - } else { + if (!string_parse_mouse_action(c, &settings.mouse_left_click)) { + if (c) + LOG_W("Unknown mouse action value: '%s'", c); settings.mouse_left_click = defaults.mouse_left_click; } - g_free(c); } @@ -596,12 +511,11 @@ void load_settings(char *cmdline_config_path) "Action of middle click event" ); - if (c) { - settings.mouse_middle_click = parse_mouse_action(c); - } else { + if (!string_parse_mouse_action(c, &settings.mouse_middle_click)) { + if (c) + LOG_W("Unknown mouse action value: '%s'", c); settings.mouse_middle_click = defaults.mouse_middle_click; } - g_free(c); } @@ -612,12 +526,11 @@ void load_settings(char *cmdline_config_path) "Action of right click event" ); - if (c) { - settings.mouse_right_click = parse_mouse_action(c); - } else { + if (!string_parse_mouse_action(c, &settings.mouse_right_click)) { + if (c) + LOG_W("Unknown mouse action value: '%s'", c); settings.mouse_right_click = defaults.mouse_right_click; } - g_free(c); } @@ -795,10 +708,11 @@ void load_settings(char *cmdline_config_path) "markup", NULL ); - if (c) { - r->markup = parse_markup_mode(c); - g_free(c); + if (!string_parse_markup_mode(c, &r->markup)) { + if (c) + LOG_W("Invalid markup mode value: %s", c); } + g_free(c); } r->urgency = ini_get_urgency(cur_section, "urgency", r->urgency); @@ -817,7 +731,10 @@ void load_settings(char *cmdline_config_path) "fullscreen", NULL ); - r->fullscreen = parse_enum_fullscreen(c, r->fullscreen); + if (!string_parse_fullscreen(c, &r->fullscreen)) { + if (c) + LOG_W("Invalid fullscreen value: %s", c); + } g_free(c); } r->script = ini_get_path(cur_section, "script", NULL); diff --git a/src/settings.h b/src/settings.h index 8e64507..6bcf6b8 100644 --- a/src/settings.h +++ b/src/settings.h @@ -15,6 +15,11 @@ enum separator_color { SEP_FOREGROUND, SEP_AUTO, SEP_FRAME, SEP_CUSTOM }; enum follow_mode { FOLLOW_NONE, FOLLOW_MOUSE, FOLLOW_KEYBOARD }; enum mouse_action { MOUSE_NONE, MOUSE_DO_ACTION, MOUSE_CLOSE_CURRENT, MOUSE_CLOSE_ALL }; +struct separator_color_data { + enum separator_color type; + char *sep_color; +}; + struct geometry { int x; int y; @@ -24,7 +29,6 @@ struct geometry { bool negative_y; bool negative_width; bool width_set; - }; struct settings { @@ -61,8 +65,7 @@ struct settings { int separator_height; int padding; int h_padding; - enum separator_color sep_color; - char *sep_custom_color_str; + struct separator_color_data sep_color; int frame_width; char *frame_color; int startup_notification; diff --git a/src/utils.c b/src/utils.c index 4dcffa5..1b4713c 100644 --- a/src/utils.c +++ b/src/utils.c @@ -14,8 +14,7 @@ /* see utils.h */ char *string_replace_char(char needle, char replacement, char *haystack) { - if (!haystack) - return NULL; + ASSERT_OR_RET(haystack, NULL); char *current = haystack; while ((current = strchr(current, needle))) @@ -56,8 +55,7 @@ char *string_replace_at(char *buf, int pos, int len, const char *repl) /* see utils.h */ char *string_replace_all(const char *needle, const char *replacement, char *haystack) { - if (!haystack) - return NULL; + ASSERT_OR_RET(haystack, NULL); assert(needle); assert(replacement); @@ -104,8 +102,7 @@ char *string_append(char *a, const char *b, const char *sep) /* see utils.h */ char *string_strip_quotes(const char *value) { - if (!value) - return NULL; + ASSERT_OR_RET(value, NULL); size_t len = strlen(value); char *s; diff --git a/src/utils.h b/src/utils.h index 6b8a7a7..8a6f652 100644 --- a/src/utils.h +++ b/src/utils.h @@ -16,6 +16,9 @@ //! Test if string a and b are the same case-insensitively #define STR_CASEQ(a, b) (strcasecmp(a, b) == 0) +//! Assert that expr evaluates to true, if not return with val +#define ASSERT_OR_RET(expr, val) if (!(expr)) return val; + //! Convert a second into the internal time representation #define S2US(s) (((gint64)(s)) * 1000 * 1000) diff --git a/src/x11/screen.c b/src/x11/screen.c index f00431a..7ef1300 100644 --- a/src/x11/screen.c +++ b/src/x11/screen.c @@ -221,8 +221,7 @@ bool window_is_fullscreen(Window window) { bool fs = false; - if (!window) - return false; + ASSERT_OR_RET(window, false); Atom has_wm_state = XInternAtom(xctx.dpy, "_NET_WM_STATE", True); if (has_wm_state == None){ diff --git a/src/x11/x.c b/src/x11/x.c index 8a8a285..07d658f 100644 --- a/src/x11/x.c +++ b/src/x11/x.c @@ -674,8 +674,7 @@ void x_win_show(struct window_x11 *win) */ void x_win_hide(struct window_x11 *win) { - if (!win->visible) - return; + ASSERT_OR_RET(win->visible,); x_shortcut_ungrab(&settings.close_ks); x_shortcut_ungrab(&settings.close_all_ks); @@ -755,8 +754,7 @@ static int x_shortcut_tear_down_error_handler(void) */ static int x_shortcut_grab(struct keyboard_shortcut *ks) { - if (!ks->is_valid) - return 1; + ASSERT_OR_RET(ks->is_valid, 1); Window root; root = RootWindow(xctx.dpy, DefaultScreen(xctx.dpy)); @@ -805,8 +803,7 @@ static void x_shortcut_ungrab(struct keyboard_shortcut *ks) */ static void x_shortcut_init(struct keyboard_shortcut *ks) { - if (!ks|| !ks->str) - return; + ASSERT_OR_RET(ks && ks->str,); if (STR_EQ(ks->str, "none") || (STR_EQ(ks->str, ""))) { ks->is_valid = false;