# HG changeset patch # User Mikael Berthe # Date 1399813627 -7200 # Node ID f56c214a19dc0b3f982c3cbeb4c90560f2de23b6 # Parent 113d3b96ae3efa7f4d1e213d13dfbc21de7bdca0 Add a guard for 'attention_char' diff -r 113d3b96ae3e -r f56c214a19dc mcabber/mcabber/main.c --- a/mcabber/mcabber/main.c Sun May 11 14:27:05 2014 +0200 +++ b/mcabber/mcabber/main.c Sun May 11 15:07:07 2014 +0200 @@ -372,6 +372,7 @@ roster_init(); settings_init(); scr_init_bindings(); + scr_init_settings(); caps_init(); #ifdef MODULES_ENABLE modules_init(); diff -r 113d3b96ae3e -r f56c214a19dc mcabber/mcabber/screen.c --- a/mcabber/mcabber/screen.c Sun May 11 14:27:05 2014 +0200 +++ b/mcabber/mcabber/screen.c Sun May 11 15:07:07 2014 +0200 @@ -1533,16 +1533,39 @@ } } +static char *attention_sign_guard(const gchar *key, const gchar *new_value) +{ + update_roster = TRUE; + if (g_strcmp0(settings_opt_get(key), new_value)) { + guint sign; + char *c; + if (!new_value || !*new_value) + return NULL; + sign = get_char(new_value); + c = next_char((char*)new_value); + if (get_char_width(new_value) != 1 || !iswprint(sign) || *c) { + scr_log_print(LPRINT_NORMAL, "attention_char value is invalid."); + return NULL; + } + // The new value looks good (1-char wide and printable) + return g_strdup(new_value); + } + return g_strdup(new_value); +} + +// scr_init_settings() +// Create guards for UI settings +void scr_init_settings(void) +{ + settings_set_guard("attention_char", attention_sign_guard); +} + static unsigned int attention_sign(void) { - guint sign; const char *as = settings_opt_get("attention_char"); if (!as) return DEFAULT_ATTENTION_CHAR; - sign = get_char(as); - if (get_char_width(as) != 1 || !iswprint(sign)) // XXX Better use a guard - return DEFAULT_ATTENTION_CHAR; - return sign; + return get_char(as); } // scr_update_main_status(forceupdate) diff -r 113d3b96ae3e -r f56c214a19dc mcabber/mcabber/screen.h --- a/mcabber/mcabber/screen.h Sun May 11 14:27:05 2014 +0200 +++ b/mcabber/mcabber/screen.h Sun May 11 15:07:07 2014 +0200 @@ -104,6 +104,7 @@ void scr_init_bindings(void); void scr_init_locale_charset(void); void scr_init_curses(void); +void scr_init_settings(void); void scr_terminate_curses(void); gboolean scr_curses_status(void); void scr_draw_main_window(unsigned int fullinit);