Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell/ev-window.c
diff options
context:
space:
mode:
authorCarlos Garcia Campos <carlosgc@gnome.org>2009-05-21 18:10:24 (GMT)
committer Carlos Garcia Campos <carlosgc@gnome.org>2009-05-21 18:10:24 (GMT)
commitcd072866af05d7a5beadb6534b562a296cd85511 (patch)
tree747aa2e0b871f5409036990a5f5ddeca122b8972 /shell/ev-window.c
parent5e2d5f13c109d67fb653f6172b6d3bfc6798dfcf (diff)
[shell] Remember and reuse "Save a Copy..." path
Fixes bgo#485195.
Diffstat (limited to 'shell/ev-window.c')
-rw-r--r--shell/ev-window.c89
1 files changed, 63 insertions, 26 deletions
diff --git a/shell/ev-window.c b/shell/ev-window.c
index 1f368ec..2926828 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -2021,24 +2021,25 @@ file_open_dialog_response_cb (GtkWidget *chooser,
gint response_id,
EvWindow *ev_window)
{
- gchar *uri;
-
if (response_id == GTK_RESPONSE_OK) {
GSList *uris;
+ gchar *uri;
uris = gtk_file_chooser_get_uris (GTK_FILE_CHOOSER (chooser));
ev_application_open_uri_list (EV_APP, uris,
gtk_window_get_screen (GTK_WINDOW (ev_window)),
GDK_CURRENT_TIME);
-
- g_slist_foreach (uris, (GFunc)g_free, NULL);
+
+ g_slist_foreach (uris, (GFunc)g_free, NULL);
g_slist_free (uris);
- }
- uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (chooser));
- ev_application_set_chooser_uri (EV_APP, uri);
- g_free (uri);
+ uri = gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (chooser));
+ ev_application_set_filechooser_uri (EV_APP,
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ uri);
+ g_free (uri);
+ }
gtk_widget_destroy (chooser);
}
@@ -2046,7 +2047,9 @@ file_open_dialog_response_cb (GtkWidget *chooser,
static void
ev_window_cmd_file_open (GtkAction *action, EvWindow *window)
{
- GtkWidget *chooser;
+ GtkWidget *chooser;
+ const gchar *default_uri;
+ gchar *parent_uri = NULL;
chooser = gtk_file_chooser_dialog_new (_("Open Document"),
GTK_WINDOW (window),
@@ -2059,12 +2062,23 @@ ev_window_cmd_file_open (GtkAction *action, EvWindow *window)
ev_document_factory_add_filters (chooser, NULL);
gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (chooser), TRUE);
gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (chooser), FALSE);
- if (ev_application_get_chooser_uri (EV_APP) != NULL) {
- gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (chooser),
- ev_application_get_chooser_uri (EV_APP));
- } else if (window->priv->uri != NULL) {
- gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (chooser),
- window->priv->uri);
+
+ default_uri = ev_application_get_filechooser_uri (EV_APP, GTK_FILE_CHOOSER_ACTION_OPEN);
+ if (!default_uri && 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;
@@ -2072,7 +2086,8 @@ ev_window_cmd_file_open (GtkAction *action, EvWindow *window)
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (chooser),
folder ? folder : g_get_home_dir ());
}
-
+ g_free (parent_uri);
+
g_signal_connect (chooser, "response",
G_CALLBACK (file_open_dialog_response_cb),
window);
@@ -2538,17 +2553,32 @@ file_save_dialog_response_cb (GtkWidget *fc,
EvWindow *ev_window)
{
gchar *uri;
-
+ GFile *file, *parent;
+
if (response_id != GTK_RESPONSE_OK) {
gtk_widget_destroy (fc);
return;
}
-
+
uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (fc));
+ file = g_file_new_for_uri (uri);
+ parent = g_file_get_parent (file);
+ g_object_unref (file);
+ if (parent) {
+ gchar *folder_uri;
+
+ folder_uri = g_file_get_uri (parent);
+ ev_application_set_filechooser_uri (EV_APP,
+ GTK_FILE_CHOOSER_ACTION_SAVE,
+ folder_uri);
+ g_free (folder_uri);
+ g_object_unref (parent);
+ }
+
/* FIXME: remote copy should be done here rather than in the save job,
* so that we can track progress and cancel the operation
*/
-
+
ev_window_clear_save_job (ev_window);
ev_window->priv->save_job = ev_job_save_new (ev_window->priv->document,
uri, ev_window->priv->uri);
@@ -2568,7 +2598,7 @@ ev_window_cmd_save_as (GtkAction *action, EvWindow *ev_window)
GtkWidget *fc;
gchar *base_name;
GFile *file;
- const gchar *folder;
+ const gchar *default_uri;
fc = gtk_file_chooser_dialog_new (
_("Save a Copy"),
@@ -2589,14 +2619,21 @@ ev_window_cmd_save_as (GtkAction *action, EvWindow *ev_window)
file = g_file_new_for_uri (ev_window->priv->uri);
base_name = g_file_get_basename (file);
gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (fc), base_name);
-
- folder = g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS);
- gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (fc),
- folder ? folder : g_get_home_dir ());
-
+
+ default_uri = ev_application_get_filechooser_uri (EV_APP, GTK_FILE_CHOOSER_ACTION_SAVE);
+ if (default_uri) {
+ gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (fc), 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 (fc),
+ folder ? folder : g_get_home_dir ());
+ }
+
g_object_unref (file);
g_free (base_name);
-
+
g_signal_connect (fc, "response",
G_CALLBACK (file_save_dialog_response_cb),
ev_window);