From 3a413acda20ebb24ae0256bcc0fa0919a2fd575e Mon Sep 17 00:00:00 2001 From: Nickolay V. Shmyrev Date: Mon, 14 Nov 2005 19:45:32 +0000 Subject: Save last document settings and reuse them for new documents. * data/evince.schemas.in: * shell/ev-metadata-manager.c: (value_free), (ev_metadata_manager_get_last), (ev_metadata_manager_set_last), (ev_metadata_manager_get), (ev_metadata_manager_set): * shell/ev-metadata-manager.h: * shell/ev-window.c: (update_chrome_flag), (ev_window_cmd_focus_page_selector), (update_sidebar_visibility), (setup_document_from_metadata), (setup_chrome_from_metadata), (setup_sidebar_from_metadata), (setup_view_from_metadata), (ev_window_cmd_edit_find), (ev_window_cmd_escape), (ev_window_view_toolbar_cb), (ev_window_sidebar_visibility_changed_cb), (find_bar_close_cb), (view_actions_focus_in_cb), (ev_window_init), (ev_window_new): Save last document settings and reuse them for new documents. --- (limited to 'shell/ev-metadata-manager.c') diff --git a/shell/ev-metadata-manager.c b/shell/ev-metadata-manager.c index 7acf6a1..b6638c9 100644 --- a/shell/ev-metadata-manager.c +++ b/shell/ev-metadata-manager.c @@ -286,15 +286,107 @@ load_values () return TRUE; } +static void +value_free (gpointer data) +{ + GValue *value = (GValue *)data; + + g_value_unset (value); + g_free (value); +} + + +#define LAST_URI "last-used-value" + +static gboolean +ev_metadata_manager_get_last (const gchar *key, + GValue *value, + gboolean ignore) +{ + Item *item; + GValue *ret; + + g_assert (ev_metadata_manager->values_loaded); + + if (ignore) + return FALSE; + + item = (Item *)g_hash_table_lookup (ev_metadata_manager->items, + LAST_URI); + + if (item == NULL) + return FALSE; + + item->atime = time (NULL); + + if (item->values == NULL) + return FALSE; + + ret = (GValue *)g_hash_table_lookup (item->values, key); + + if (ret != NULL) { + g_value_init (value, G_VALUE_TYPE (ret)); + g_value_copy (ret, value); + return TRUE; + } + + return FALSE; +} + +static void +ev_metadata_manager_set_last (const gchar *key, + const GValue *value) +{ + Item *item; + + g_assert (ev_metadata_manager->values_loaded); + + item = (Item *)g_hash_table_lookup (ev_metadata_manager->items, + LAST_URI); + + if (item == NULL) + { + item = g_new0 (Item, 1); + + g_hash_table_insert (ev_metadata_manager->items, + g_strdup (LAST_URI), + item); + } + + if (item->values == NULL) + item->values = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + value_free); + if (value != NULL) { + GValue *new; + + new = g_new0 (GValue, 1); + g_value_init (new, G_VALUE_TYPE (value)); + g_value_copy (value, new); + + g_hash_table_insert (item->values, + g_strdup (key), + new); + } else { + g_hash_table_remove (item->values, + key); + } + + item->atime = time (NULL); + ev_metadata_manager->modified = TRUE; + return; +} + gboolean ev_metadata_manager_get (const gchar *uri, const gchar *key, - GValue *value) + GValue *value, + gboolean ignore_last) { Item *item; GValue *ret; - g_return_val_if_fail (uri != NULL, FALSE); g_return_val_if_fail (key != NULL, FALSE); if (ev_metadata_manager == NULL) @@ -307,39 +399,32 @@ ev_metadata_manager_get (const gchar *uri, res = load_values (); if (!res) - return FALSE; + return ev_metadata_manager_get_last (key, value, ignore_last); } + if (uri == NULL) + return ev_metadata_manager_get_last (key, value, ignore_last); + item = (Item *)g_hash_table_lookup (ev_metadata_manager->items, uri); if (item == NULL) - return FALSE; + return ev_metadata_manager_get_last (key, value, ignore_last); item->atime = time (NULL); if (item->values == NULL) - return FALSE; + return ev_metadata_manager_get_last (key, value, ignore_last); ret = (GValue *)g_hash_table_lookup (item->values, key); - if (ret == NULL) { - return FALSE; - } else { + if (ret != NULL) { g_value_init (value, G_VALUE_TYPE (ret)); g_value_copy (ret, value); - return TRUE; } -} -static void -value_free (gpointer data) -{ - GValue *value = (GValue *)data; - - g_value_unset (value); - g_free (value); + return ev_metadata_manager_get_last (key, value, ignore_last); } void @@ -349,7 +434,6 @@ ev_metadata_manager_set (const gchar *uri, { Item *item; - g_return_if_fail (uri != NULL); g_return_if_fail (key != NULL); if (ev_metadata_manager == NULL) @@ -365,6 +449,12 @@ ev_metadata_manager_set (const gchar *uri, return; } + if (uri == NULL) + { + ev_metadata_manager_set_last (key, value); + return; + } + item = (Item *)g_hash_table_lookup (ev_metadata_manager->items, uri); @@ -392,6 +482,7 @@ ev_metadata_manager_set (const gchar *uri, g_hash_table_insert (item->values, g_strdup (key), new); + ev_metadata_manager_set_last (key, value); } else { g_hash_table_remove (item->values, key); -- cgit v0.9.1