diff options
author | Søren Sandmann Pedersen <ssp@dhcp-100-2-40.bos.redhat.com> | 2009-04-15 21:32:14 -0400 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@dhcp-100-2-40.bos.redhat.com> | 2009-04-15 21:32:14 -0400 |
commit | 3dd766d8681bf41fa966b2aa65d5a1e78e41f073 (patch) | |
tree | 6c34ab5709a28ef431ed95d253b6c4ae679f6f73 | |
parent | 7a8846fd1e1370f1e46587ec429eb3b469af3556 (diff) |
Only save meta data once
-rw-r--r-- | siv.c | 119 |
1 files changed, 62 insertions, 57 deletions
@@ -18,6 +18,8 @@ struct App GtkWidget * chooser; GPtrArray * windows; + + GHashTable *meta_data; }; void @@ -89,11 +91,59 @@ app_register_window (App *app, g_ptr_array_add (app->windows, window); } +static void +foreach (gpointer key, gpointer value, gpointer user_data) +{ + gchar *filename = key; + MetaData *meta = value; + GKeyFile *key_file = user_data; + + g_key_file_set_integer (key_file, filename, "window_x", meta->window_x); + g_key_file_set_integer (key_file, filename, "window_y", meta->window_y); + g_key_file_set_integer (key_file, filename, "window_width", meta->window_width); + g_key_file_set_integer (key_file, filename, "window_height", meta->window_height); + g_key_file_set_integer (key_file, filename, "background", meta->background); + g_key_file_set_integer (key_file, filename, "smooth_image", meta->smooth_image); + g_key_file_set_integer (key_file, filename, "zoom_level", meta->zoom_level); + g_key_file_set_integer (key_file, filename, "hadj", meta->hadj); + g_key_file_set_integer (key_file, filename, "vadj", meta->vadj); + g_key_file_set_integer (key_file, filename, "show_toolbar", meta->show_toolbar); +} + +static gchar * +make_filename (void) +{ + return g_build_filename ( + g_get_home_dir(), ".gnome2", "siv.metadata", NULL); +} + +static void +quit (App *app) +{ + char *key_filename = make_filename(); + GKeyFile *keyfile = g_key_file_new (); + char *output; + + g_hash_table_foreach (app->meta_data, foreach, keyfile); + + output = g_key_file_to_data (keyfile, NULL, NULL); + if (output) + { + g_file_set_contents (key_filename, output, -1, NULL); + g_free (output); + } + + g_key_file_free (keyfile); + g_free (key_filename); + + gtk_main_quit(); +} + void app_unregister_window (App *app, SivWindow *window) { if (--app->n_windows == 0) - gtk_main_quit (); + quit (app); g_ptr_array_remove (app->windows, window); } @@ -103,13 +153,12 @@ app_get_open_chooser (App *app) { if (!app->chooser) { - app->chooser = - gtk_file_chooser_dialog_new ("Open", - NULL, - GTK_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, - NULL); + app->chooser = gtk_file_chooser_dialog_new ( + "Open", NULL, + GTK_FILE_CHOOSER_ACTION_OPEN, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + NULL); } return app->chooser; @@ -154,13 +203,6 @@ get_int (GKeyFile *keyfile, const char *group, const char *key, int *result) return TRUE; } -static gchar * -make_filename (void) -{ - return g_build_filename ( - g_get_home_dir(), ".gnome2", "siv.metadata", NULL); -} - static GHashTable * load_meta_data (void) { @@ -238,9 +280,8 @@ app_get_meta_data (App *app, MetaData *data) { char *encoded = encode (file); - GHashTable *table = load_meta_data (); - MetaData *d = g_hash_table_lookup (table, encoded); gboolean result = FALSE; + MetaData *d = g_hash_table_lookup (app->meta_data, encoded); if (d) { @@ -251,30 +292,10 @@ app_get_meta_data (App *app, } g_free (encoded); - g_hash_table_destroy (table); return result; } -static void -foreach (gpointer key, gpointer value, gpointer user_data) -{ - gchar *filename = key; - MetaData *meta = value; - GKeyFile *key_file = user_data; - - g_key_file_set_integer (key_file, filename, "window_x", meta->window_x); - g_key_file_set_integer (key_file, filename, "window_y", meta->window_y); - g_key_file_set_integer (key_file, filename, "window_width", meta->window_width); - g_key_file_set_integer (key_file, filename, "window_height", meta->window_height); - g_key_file_set_integer (key_file, filename, "background", meta->background); - g_key_file_set_integer (key_file, filename, "smooth_image", meta->smooth_image); - g_key_file_set_integer (key_file, filename, "zoom_level", meta->zoom_level); - g_key_file_set_integer (key_file, filename, "hadj", meta->hadj); - g_key_file_set_integer (key_file, filename, "vadj", meta->vadj); - g_key_file_set_integer (key_file, filename, "show_toolbar", meta->show_toolbar); -} - void app_set_meta_data (App *app, const char *filename, @@ -289,18 +310,14 @@ app_set_meta_data (App *app, int hadj, int show_toolbar) { - GKeyFile *keyfile = g_key_file_new (); char *encoded = encode (filename); - GHashTable *table = load_meta_data (); - MetaData *data = g_hash_table_lookup (table, encoded); - char *key_filename = make_filename(); - char *output; + MetaData *data = g_hash_table_lookup (app->meta_data, encoded); if (!data) { data = g_new0 (MetaData, 1); - g_hash_table_insert (table, g_strdup (encoded), data); + g_hash_table_insert (app->meta_data, g_strdup (encoded), data); } data->window_x = window_x; @@ -314,20 +331,7 @@ app_set_meta_data (App *app, data->vadj = vadj; data->show_toolbar = show_toolbar; - g_hash_table_foreach (table, foreach, keyfile); - - output = g_key_file_to_data (keyfile, NULL, NULL); - if (output) - { - g_file_set_contents (key_filename, output, -1, NULL); - g_free (output); - } - - g_key_file_free (keyfile); - g_free (key_filename); g_free (encoded); - - g_hash_table_destroy (table); } static char ** @@ -468,6 +472,7 @@ app_new (int argc, char **argv) app = g_new0 (App, 1); app->windows = g_ptr_array_new (); + app->meta_data = load_meta_data (); app_begin_load (app); @@ -536,7 +541,7 @@ on_sigint (int signo, gpointer data) window_free (window); } - gtk_main_quit (); + quit (app); } int |