changeset 2101:f56c214a19dc

Add a guard for 'attention_char'
author Mikael Berthe <mikael@lilotux.net>
date Sun, 11 May 2014 15:07:07 +0200
parents 113d3b96ae3e
children 739f440e563b
files mcabber/mcabber/main.c mcabber/mcabber/screen.c mcabber/mcabber/screen.h
diffstat 3 files changed, 30 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- 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();
--- 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)
--- 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);