summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKees Cook <kees@outflux.net>2006-10-01 17:23:40 +0000
committerkeescook <keescook@users.sourceforge.net>2006-10-01 17:23:40 +0000
commit0bb199cdf8c63341361fa93bf4bd85336a993a00 (patch)
tree4dd1ea4cc8cce68076d4e61be864be9680cd38ab /src
parentAdded forgotten #ifdef HAVE_CAIRO_PDF/#endif pair (diff)
downloadinkscape-0bb199cdf8c63341361fa93bf4bd85336a993a00.tar.gz
inkscape-0bb199cdf8c63341361fa93bf4bd85336a993a00.zip
Fixes path memory issues with the save dialog. (Closes: #1089414)
(bzr r1747)
Diffstat (limited to 'src')
-rw-r--r--src/file.cpp7
-rw-r--r--src/ui/dialog/filedialog.cpp26
-rw-r--r--src/ui/dialog/filedialog.h4
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