diff --git a/src/core/settings.c b/src/core/settings.c index 65c7b1d9..9c0999c9 100644 --- a/src/core/settings.c +++ b/src/core/settings.c @@ -35,6 +35,7 @@ static GHashTable *settings; static char *last_error_msg; static int timeout_tag; +static int config_last_modifycounter; static time_t config_last_mtime; static long config_last_size; static unsigned int config_last_checksum; @@ -379,7 +380,8 @@ int settings_save(const char *fname) fname = mainconfig->fname; error = config_write(mainconfig, fname, 0660) != 0; - irssi_config_save_state(fname); + irssi_config_save_state(fname); + config_last_modifycounter = mainconfig->modifycounter; if (error) { str = g_strdup_printf(_("Couldn't save " "configuration file: %s"), @@ -394,7 +396,8 @@ static void sig_autosave(void) { char *fname, *str; - if (!settings_get_bool("settings_autosave")) + if (!settings_get_bool("settings_autosave") || + config_last_modifycounter == mainconfig->modifycounter) return; if (!irssi_config_is_changed(NULL)) @@ -419,6 +422,7 @@ void settings_init(void) (GCompareFunc) g_str_equal); config_last_mtime = 0; + config_last_modifycounter = 0; init_configfile(); settings_add_bool("misc", "settings_autosave", TRUE); diff --git a/src/lib-config/iconfig.h b/src/lib-config/iconfig.h index f6910642..c00fdd0c 100644 --- a/src/lib-config/iconfig.h +++ b/src/lib-config/iconfig.h @@ -46,12 +46,13 @@ typedef struct { struct _config_rec { char *fname; int handle; - int create_mode; + int create_mode; + int modifycounter; /* increase every time something is changed */ char *last_error; CONFIG_NODE *mainnode; GHashTable *cache; /* path -> node (for querying) */ - GHashTable *cache_nodes; /* node -> path (for removing) */ + GHashTable *cache_nodes; /* node -> path (for removing) */ GScanner *scanner; diff --git a/src/lib-config/set.c b/src/lib-config/set.c index f48aa3b9..342d2b70 100644 --- a/src/lib-config/set.c +++ b/src/lib-config/set.c @@ -37,6 +37,7 @@ void config_node_remove(CONFIG_REC *rec, CONFIG_NODE *parent, CONFIG_NODE *node) g_return_if_fail(parent != NULL); g_return_if_fail(node != NULL); + rec->modifycounter++; cache_remove(rec, node); parent->value = g_slist_remove(parent->value, node); @@ -114,6 +115,7 @@ void config_node_set_str(CONFIG_REC *rec, CONFIG_NODE *parent, const char *key, } node->value = g_strdup(value); + rec->modifycounter++; } void config_node_set_int(CONFIG_NODE *parent, const char *key, int value)