summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <ssp@dhcp-100-2-40.bos.redhat.com>2009-04-15 21:32:14 -0400
committerSøren Sandmann Pedersen <ssp@dhcp-100-2-40.bos.redhat.com>2009-04-15 21:32:14 -0400
commit3dd766d8681bf41fa966b2aa65d5a1e78e41f073 (patch)
tree6c34ab5709a28ef431ed95d253b6c4ae679f6f73
parent7a8846fd1e1370f1e46587ec429eb3b469af3556 (diff)
Only save meta data once
-rw-r--r--siv.c119
1 files changed, 62 insertions, 57 deletions
diff --git a/siv.c b/siv.c
index 40b63ff..6f8cac2 100644
--- a/siv.c
+++ b/siv.c
@@ -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