From 1f60221c7de693c3fe1cbd60ffd1d5406b22d9fb Mon Sep 17 00:00:00 2001 From: keescook Date: Sun, 1 Oct 2006 17:23:40 +0000 Subject: [PATCH] Fixes path memory issues with the save dialog. (Closes: #1089414) --- src/file.cpp | 7 +++++-- src/ui/dialog/filedialog.cpp | 26 +++++++++++++++++++++----- src/ui/dialog/filedialog.h | 4 ++++ 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/file.cpp b/src/file.cpp index de8ab2b5d..f8ebc9809 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -589,7 +589,8 @@ sp_file_save_dialog(SPDocument *doc, bool is_copy) save_loc.append(formatBuf); } } else { - save_loc = Glib::path_get_dirname(doc->uri); + save_loc = Glib::build_filename(Glib::path_get_dirname(doc->uri), + Glib::path_get_basename(doc->uri)); } // convert save_loc from utf-8 to locale @@ -615,6 +616,8 @@ sp_file_save_dialog(SPDocument *doc, bool is_copy) (char const *) _("Select file to save to"), default_extension ); + else + saveDialogInstance->change_path(save_loc); saveDialogInstance->change_title(dialog_title); bool success = saveDialogInstance->show(); @@ -640,7 +643,7 @@ sp_file_save_dialog(SPDocument *doc, bool is_copy) if (success) prefs_set_recent_file(SP_DOCUMENT_URI(doc), SP_DOCUMENT_NAME(doc)); - save_path = fileName; + save_path = Glib::path_get_dirname(fileName); prefs_set_string_attribute("dialogs.save_as", "path", save_path.c_str()); return success; diff --git a/src/ui/dialog/filedialog.cpp b/src/ui/dialog/filedialog.cpp index 3417ba06c..7381c660e 100644 --- a/src/ui/dialog/filedialog.cpp +++ b/src/ui/dialog/filedialog.cpp @@ -1138,6 +1138,7 @@ public: Glib::ustring getFilename(); void change_title(const Glib::ustring& title); + void change_path(const Glib::ustring& dir); private: @@ -1355,7 +1356,7 @@ FileSaveDialogImpl::FileSaveDialogImpl(const Glib::ustring &dir, // leaving a trailing backslash on the directory name leads to the infamous // double-directory bug on win32 if (len != 0 && udir[len - 1] == '\\') udir.erase(len - 1); - set_current_folder(udir.c_str()); + myFilename = udir; } //###### Add the file types menu @@ -1455,10 +1456,7 @@ FileSaveDialogImpl::~FileSaveDialogImpl() bool FileSaveDialogImpl::show() { - Glib::ustring s = Glib::filename_to_utf8 (get_current_folder()); - if (s.length() == 0) - s = getcwd (NULL, 0); - set_current_folder(Glib::filename_from_utf8(s)); //hack to force initial dir listing + change_path(myFilename); set_modal (TRUE); //Window sp_transientize((GtkWidget *)gobj()); //Make transient gint b = run(); //Dialog @@ -1519,6 +1517,24 @@ FileSaveDialogImpl::change_title(const Glib::ustring& title) this->set_title(title); } +/** + * Change the default save path location. + */ +void +FileSaveDialogImpl::change_path(const Glib::ustring& path) +{ + myFilename = path; + if (Glib::file_test(myFilename, Glib::FILE_TEST_IS_DIR)) { + //fprintf(stderr,"set_current_folder(%s)\n",myFilename.c_str()); + set_current_folder(myFilename); + } else { + //fprintf(stderr,"set_filename(%s)\n",myFilename.c_str()); + set_filename(myFilename); + Glib::ustring basename = Glib::path_get_basename(myFilename); + //fprintf(stderr,"set_current_name(%s)\n",basename.c_str()); + set_current_name(basename); + } +} diff --git a/src/ui/dialog/filedialog.h b/src/ui/dialog/filedialog.h index daefc9387..508c72997 100644 --- a/src/ui/dialog/filedialog.h +++ b/src/ui/dialog/filedialog.h @@ -172,6 +172,10 @@ public: */ virtual void change_title(const Glib::ustring& title) =0; + /** + * Change the default save path location. + */ + virtual void change_path(const Glib::ustring& path) =0; }; //FileSaveDialog -- 2.30.2