--- Begin Message ---
Package: evince
Version: 3.4.0-3.1
Severity: normal
Tags: patch
On choosing File->Save a copy, the file dialog never has a default folder,
and always says:
Save in folder: Please select folder below
The attached patch is from the 3.6 version of evince, applies cleanly
to the version of evince currently in wheezy, and fixes the problem:
commit f6137df22503d88a76cc69f622919ec7bd3582d7
Author: Christian Persch <[email protected]>
Date: 2012-07-06
shell: Store and restore current folder when opening or saving file
Remember the folder last used to open or save a document, attachment
or image.
M data/org.gnome.Evince.gschema.xml.in
M shell/ev-window.c
-- System Information:
Debian Release: 7.0
APT prefers testing-updates
APT policy: (500, 'testing-updates'), (500, 'testing')
Architecture: amd64 (x86_64)
Foreign Architectures: i386
Kernel: Linux 3.2.0-4-amd64 (SMP w/4 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Versions of packages evince depends on:
ii evince-common 3.4.0-3.1
ii gnome-icon-theme 3.4.0-2
ii libatk1.0-0 2.4.0-2
ii libc6 2.13-38
ii libcairo-gobject2 1.12.2-3
ii libcairo2 1.12.2-3
ii libevdocument3-4 3.4.0-3.1
ii libevview3-3 3.4.0-3.1
ii libgail-3-0 3.4.2-6
ii libgdk-pixbuf2.0-0 2.26.1-1
ii libglib2.0-0 2.33.12+really2.32.4-5
ii libgnome-keyring0 3.4.1-1
ii libgtk-3-0 3.4.2-6
ii libice6 2:1.0.8-2
ii libnautilus-extension1a 3.4.2-1+build1
ii libpango1.0-0 1.30.0-1
ii libsm6 2:1.2.1-2
ii libx11-6 2:1.5.0-1
ii libxml2 2.8.0+dfsg1-7+nmu1
ii shared-mime-info 1.0-1+b1
ii zlib1g 1:1.2.7.dfsg-13
Versions of packages evince recommends:
ii dbus-x11 1.6.8-1
ii gvfs 1.12.3-4
Versions of packages evince suggests:
ii nautilus 3.4.2-1+build1
ii poppler-data 0.4.5-10
pn unrar <none>
-- no debconf information
diff --git a/data/org.gnome.Evince.gschema.xml.in b/data/org.gnome.Evince.gschema.xml.in
index 06384d4..3de283a 100644
--- a/data/org.gnome.Evince.gschema.xml.in
+++ b/data/org.gnome.Evince.gschema.xml.in
@@ -17,6 +17,14 @@
<_summary>Automatically reload the document</_summary>
<_description>The document is automatically reloaded on file change.</_description>
</key>
+ <key name="document-directory" type="ms">
+ <default>nothing</default>
+ <_summary>The URI of the directory last used to open or save a document</_summary>
+ </key>
+ <key name="pictures-directory" type="ms">
+ <default>nothing</default>
+ <_summary>The URI of the directory last used to save a picture</_summary>
+ </key>
<child name="default" schema="org.gnome.Evince.Default"/>
</schema>
diff --git a/shell/ev-window.c b/shell/ev-window.c
index c8bd717..7f068af 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -246,6 +246,8 @@ struct _EvWindowPrivate {
#define GS_SCHEMA_NAME "org.gnome.Evince"
#define GS_OVERRIDE_RESTRICTIONS "override-restrictions"
#define GS_AUTO_RELOAD "auto-reload"
+#define GS_LAST_DOCUMENT_DIRECTORY "document-directory"
+#define GS_LAST_PICTURES_DIRECTORY "pictures-directory"
#define SIDEBAR_DEFAULT_SIZE 132
#define LINKS_SIDEBAR_ID "links"
@@ -1438,6 +1440,22 @@ lockdown_changed (GSettings *lockdown,
}
#endif
+static GSettings *
+ev_window_ensure_settings (EvWindow *ev_window)
+{
+ EvWindowPrivate *priv = ev_window->priv;
+
+ if (priv->settings != NULL)
+ return priv->settings;
+
+ priv->settings = g_settings_new (GS_SCHEMA_NAME);
+ g_signal_connect (priv->settings,
+ "changed::"GS_OVERRIDE_RESTRICTIONS,
+ G_CALLBACK (override_restrictions_changed),
+ ev_window);
+ return priv->settings;
+}
+
static gboolean
ev_window_setup_document (EvWindow *ev_window)
{
@@ -1453,13 +1471,7 @@ ev_window_setup_document (EvWindow *ev_window)
ev_window_title_set_document (ev_window->priv->title, document);
ev_window_title_set_uri (ev_window->priv->title, ev_window->priv->uri);
- if (!ev_window->priv->settings) {
- ev_window->priv->settings = g_settings_new (GS_SCHEMA_NAME);
- g_signal_connect (ev_window->priv->settings,
- "changed::"GS_OVERRIDE_RESTRICTIONS,
- G_CALLBACK (override_restrictions_changed),
- ev_window);
- }
+ ev_window_ensure_settings (ev_window);
#ifdef HAVE_DESKTOP_SCHEMAS
if (!ev_window->priv->lockdown_settings) {
@@ -2404,6 +2416,75 @@ ev_window_reload_document (EvWindow *ev_window,
}
}
+static const gchar *
+get_settings_key_for_directory (GUserDirectory directory)
+{
+ switch (directory) {
+ case G_USER_DIRECTORY_PICTURES:
+ return GS_LAST_PICTURES_DIRECTORY;
+ case G_USER_DIRECTORY_DOCUMENTS:
+ default:
+ return GS_LAST_DOCUMENT_DIRECTORY;
+ }
+}
+
+static void
+ev_window_file_chooser_restore_folder (EvWindow *window,
+ GtkFileChooser *file_chooser,
+ const gchar *uri,
+ GUserDirectory directory)
+{
+ const gchar *folder_uri, *dir;
+ gchar *parent_uri = NULL;
+
+ g_settings_get (ev_window_ensure_settings (window),
+ get_settings_key_for_directory (directory),
+ "m&s", &folder_uri);
+ if (folder_uri == NULL && uri != NULL) {
+ GFile *file, *parent;
+
+ file = g_file_new_for_uri (uri);
+ parent = g_file_get_parent (file);
+ g_object_unref (file);
+ if (parent) {
+ folder_uri = parent_uri = g_file_get_uri (parent);
+ g_object_unref (parent);
+ }
+ }
+
+ if (folder_uri) {
+ gtk_file_chooser_set_current_folder_uri (file_chooser, folder_uri);
+ } else {
+ dir = g_get_user_special_dir (directory);
+ gtk_file_chooser_set_current_folder (file_chooser,
+ dir ? dir : g_get_home_dir ());
+ }
+
+ g_free (parent_uri);
+}
+
+static void
+ev_window_file_chooser_save_folder (EvWindow *window,
+ GtkFileChooser *file_chooser,
+ GUserDirectory directory)
+{
+ gchar *uri, *folder;
+
+ folder = gtk_file_chooser_get_current_folder (file_chooser);
+ if (g_strcmp0 (folder, g_get_user_special_dir (directory)) == 0) {
+ /* Store 'nothing' if the folder is the default one */
+ uri = NULL;
+ } else {
+ uri = gtk_file_chooser_get_current_folder_uri (file_chooser);
+ }
+ g_free (folder);
+
+ g_settings_set (ev_window_ensure_settings (window),
+ get_settings_key_for_directory (directory),
+ "ms", uri);
+ g_free (uri);
+}
+
static void
file_open_dialog_response_cb (GtkWidget *chooser,
gint response_id,
@@ -2412,6 +2493,9 @@ file_open_dialog_response_cb (GtkWidget *chooser,
if (response_id == GTK_RESPONSE_OK) {
GSList *uris;
+ ev_window_file_chooser_save_folder (ev_window, GTK_FILE_CHOOSER (chooser),
+ G_USER_DIRECTORY_DOCUMENTS);
+
uris = gtk_file_chooser_get_uris (GTK_FILE_CHOOSER (chooser));
ev_application_open_uri_list (EV_APP, uris,
@@ -2429,8 +2513,6 @@ static void
ev_window_cmd_file_open (GtkAction *action, EvWindow *window)
{
GtkWidget *chooser;
- const gchar *default_uri = NULL;
- gchar *parent_uri = NULL;
chooser = gtk_file_chooser_dialog_new (_("Open Document"),
GTK_WINDOW (window),
@@ -2444,29 +2526,8 @@ ev_window_cmd_file_open (GtkAction *action, EvWindow *window)
gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (chooser), TRUE);
gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (chooser), FALSE);
- if (window->priv->uri) {
- GFile *file, *parent;
-
- file = g_file_new_for_uri (window->priv->uri);
- parent = g_file_get_parent (file);
- if (parent) {
- parent_uri = g_file_get_uri (parent);
- default_uri = parent_uri;
- g_object_unref (parent);
- }
- g_object_unref (file);
- }
-
- if (default_uri) {
- gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (chooser), default_uri);
- } else {
- const gchar *folder;
-
- folder = g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS);
- gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (chooser),
- folder ? folder : g_get_home_dir ());
- }
- g_free (parent_uri);
+ ev_window_file_chooser_restore_folder (window, GTK_FILE_CHOOSER (chooser),
+ NULL, G_USER_DIRECTORY_DOCUMENTS);
g_signal_connect (chooser, "response",
G_CALLBACK (file_open_dialog_response_cb),
@@ -2899,6 +2960,9 @@ file_save_dialog_response_cb (GtkWidget *fc,
return;
}
+ ev_window_file_chooser_save_folder (ev_window, GTK_FILE_CHOOSER (fc),
+ G_USER_DIRECTORY_DOCUMENTS);
+
uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (fc));
/* FIXME: remote copy should be done here rather than in the save job,
@@ -2947,6 +3011,10 @@ ev_window_cmd_save_as (GtkAction *action, EvWindow *ev_window)
g_object_unref (file);
g_free (base_name);
+ ev_window_file_chooser_restore_folder (ev_window, GTK_FILE_CHOOSER (fc),
+ ev_window->priv->uri,
+ G_USER_DIRECTORY_DOCUMENTS);
+
g_signal_connect (fc, "response",
G_CALLBACK (file_save_dialog_response_cb),
ev_window);
@@ -6570,6 +6638,9 @@ image_save_dialog_response_cb (GtkWidget *fc,
return;
}
+ ev_window_file_chooser_save_folder (ev_window, GTK_FILE_CHOOSER (fc),
+ G_USER_DIRECTORY_PICTURES);
+
uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (fc));
filter = gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (fc));
format = g_object_get_data (G_OBJECT (filter), "pixbuf-format");
@@ -6673,6 +6744,9 @@ ev_view_popup_cmd_save_image_as (GtkAction *action, EvWindow *window)
file_chooser_dialog_add_writable_pixbuf_formats (GTK_FILE_CHOOSER (fc));
+ ev_window_file_chooser_restore_folder (window, GTK_FILE_CHOOSER (fc), NULL,
+ G_USER_DIRECTORY_PICTURES);
+
g_signal_connect (fc, "response",
G_CALLBACK (image_save_dialog_response_cb),
window);
@@ -6805,6 +6879,9 @@ attachment_save_dialog_response_cb (GtkWidget *fc,
return;
}
+ ev_window_file_chooser_save_folder (ev_window, GTK_FILE_CHOOSER (fc),
+ G_USER_DIRECTORY_DOCUMENTS);
+
uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (fc));
target_file = g_file_new_for_uri (uri);
g_object_get (G_OBJECT (fc), "action", &fc_action, NULL);
@@ -6901,6 +6978,9 @@ ev_attachment_popup_cmd_save_attachment_as (GtkAction *action, EvWindow *window)
gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (fc),
ev_attachment_get_name (attachment));
+ ev_window_file_chooser_restore_folder (window, GTK_FILE_CHOOSER (fc), NULL,
+ G_USER_DIRECTORY_DOCUMENTS);
+
g_signal_connect (fc, "response",
G_CALLBACK (attachment_save_dialog_response_cb),
window);
--- End Message ---