Added SILC Thread Queue API
[crypto.git] / apps / irssi / src / fe-common / core / fe-settings.c
index 382a09f742add475bb5df04d1900d4a2c8f2f2fd..dccfcba9105d4f95a6dbb1e002271ace75bf0155 100644 (file)
@@ -45,6 +45,9 @@ static void set_print(SETTINGS_REC *rec)
                value = value_int;
                break;
        case SETTING_TYPE_STRING:
+       case SETTING_TYPE_TIME:
+       case SETTING_TYPE_LEVEL:
+       case SETTING_TYPE_SIZE:
                value = settings_get_str(rec->key);
                break;
        default:
@@ -66,7 +69,7 @@ static void set_boolean(const char *key, const char *value)
                printformat(NULL, NULL, MSGLEVEL_CLIENTCRAP, TXT_NOT_TOGGLE);
 }
 
-/* SYNTAX: SET [-clear] [<key> [<value>]] */
+/* SYNTAX: SET [-clear | -default] [<key> [<value>]] */
 static void cmd_set(char *data)
 {
         GHashTable *optlist;
@@ -74,20 +77,24 @@ static void cmd_set(char *data)
        const char *last_section;
        char *key, *value;
        void *free_arg;
-       int found, clear;
+       int found, clear, set_default;
 
        if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_GETREST | PARAM_FLAG_OPTIONS,
                            "set", &optlist, &key, &value))
                return;
 
        clear = g_hash_table_lookup(optlist, "clear") != NULL;
+       set_default = g_hash_table_lookup(optlist, "default") != NULL;
+
+       if (*key == '\0')
+               clear = set_default = FALSE;
 
        last_section = ""; found = 0;
        sets = settings_get_sorted();
        for (tmp = sets; tmp != NULL; tmp = tmp->next) {
                SETTINGS_REC *rec = tmp->data;
 
-               if (((clear || *value != '\0') && g_strcasecmp(rec->key, key) != 0) ||
+               if (((clear || set_default || *value != '\0') && g_strcasecmp(rec->key, key) != 0) ||
                    (*value == '\0' && *key != '\0' && stristr(rec->key, key) == NULL))
                        continue;
 
@@ -98,20 +105,44 @@ static void cmd_set(char *data)
                        last_section = rec->section;
                }
 
-               if (clear || *value != '\0') {
+               if (clear || set_default || *value != '\0') {
                        /* change the setting */
                        switch (rec->type) {
                        case SETTING_TYPE_BOOLEAN:
                                 if (clear)
                                        settings_set_bool(key, FALSE);
-                                else
+                               else if (set_default)
+                                       settings_set_bool(key, rec->default_value.v_bool);
+                               else
                                        set_boolean(key, value);
                                break;
                        case SETTING_TYPE_INT:
-                               settings_set_int(key, clear ? 0 : atoi(value));
+                               settings_set_int(key, clear ? 0 :
+                                                set_default ? rec->default_value.v_int :
+                                                atoi(value));
                                break;
                        case SETTING_TYPE_STRING:
-                               settings_set_str(key, clear ? "" : value);
+                               settings_set_str(key, clear ? "" :
+                                                set_default ? rec->default_value.v_string :
+                                                value);
+                               break;
+                       case SETTING_TYPE_TIME:
+                               if (!settings_set_time(key, clear ? "0" :
+                                                      set_default ? rec->default_value.v_string : value))
+                                       printformat(NULL, NULL, MSGLEVEL_CLIENTERROR,
+                                                   TXT_INVALID_TIME);
+                               break;
+                       case SETTING_TYPE_LEVEL:
+                               if (!settings_set_level(key, clear ? "" :
+                                                       set_default ? rec->default_value.v_string : value))
+                                       printformat(NULL, NULL, MSGLEVEL_CLIENTERROR,
+                                                   TXT_INVALID_LEVEL);
+                               break;
+                       case SETTING_TYPE_SIZE:
+                               if (!settings_set_size(key, clear ? "0" :
+                                                      set_default ? rec->default_value.v_string : value))
+                                       printformat(NULL, NULL, MSGLEVEL_CLIENTERROR,
+                                                   TXT_INVALID_SIZE);
                                break;
                        }
                        signal_emit("setup changed", 0);
@@ -209,6 +240,8 @@ static void alias_remove(const char *alias)
        else {
                printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_ALIAS_REMOVED, alias);
                iconfig_set_str("aliases", alias, NULL);
+
+               signal_emit("alias removed", 1, alias);
        }
 }
 
@@ -230,6 +263,7 @@ static void cmd_alias(const char *data)
        else {
                printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_ALIAS_ADDED, alias);
                iconfig_set_str("aliases", alias, value);
+               signal_emit("alias added", 2, alias, value);
        }
         cmd_params_free(free_arg);
 }
@@ -237,10 +271,17 @@ static void cmd_alias(const char *data)
 /* SYNTAX: UNALIAS <alias> */
 static void cmd_unalias(const char *data)
 {
+       char *alias;
+       void *free_arg;
+
        g_return_if_fail(data != NULL);
-       if (*data == '\0') cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS);
 
-       alias_remove(data);
+       if (!cmd_get_params(data, &free_arg, 1, &alias))
+               return;
+       if (*alias == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);
+
+       alias_remove(alias);
+        cmd_params_free(free_arg);
 }
 
 /* SYNTAX: RELOAD [<file>] */
@@ -324,7 +365,7 @@ void fe_settings_init(void)
        command_bind("unalias", NULL, (SIGNAL_FUNC) cmd_unalias);
        command_bind("reload", NULL, (SIGNAL_FUNC) cmd_reload);
        command_bind("save", NULL, (SIGNAL_FUNC) cmd_save);
-       command_set_options("set", "clear");
+       command_set_options("set", "clear default");
 
         signal_add("settings errors", (SIGNAL_FUNC) sig_settings_errors);
 }