From 0ad6ad39d3ba2543dfe6848af12b4fa6e830fc22 Mon Sep 17 00:00:00 2001 From: Konstantin Dmitriev Date: Mon, 14 Mar 2016 14:48:29 +0600 Subject: [PATCH] Fix crash when trying to start Synfig installed into path containing with non-latin characters. Most common for Windows users. --- ETL/ETL/_stringf.h | 1 + synfig-core/src/synfig/main.cpp | 17 +++++++---------- synfig-core/src/synfig/module.cpp | 6 +++++- synfig-core/src/tool/main.cpp | 5 +---- synfig-studio/src/gui/main.cpp | 7 +------ synfig-studio/src/synfigapp/main.cpp | 5 +---- 6 files changed, 16 insertions(+), 25 deletions(-) diff --git a/ETL/ETL/_stringf.h b/ETL/ETL/_stringf.h index d50f669d531..d727b845f6f 100644 --- a/ETL/ETL/_stringf.h +++ b/ETL/ETL/_stringf.h @@ -291,6 +291,7 @@ inline std::string current_working_directory() { char dir[256]; + // TODO: current_working_directory() should use Glib::locale_to_utf8() std::string ret(getcwd(dir,sizeof(dir))); return ret; } diff --git a/synfig-core/src/synfig/main.cpp b/synfig-core/src/synfig/main.cpp index 59049c233a7..5d3e2d1aed9 100644 --- a/synfig-core/src/synfig/main.cpp +++ b/synfig-core/src/synfig/main.cpp @@ -159,11 +159,11 @@ static void broken_pipe_signal (int /*sig*/) { bool retrieve_modules_to_load(String filename,std::list &modules_to_load) { - std::ifstream file(filename.c_str()); + std::ifstream file(Glib::locale_from_utf8(filename).c_str()); if(!file) { - // warning("Cannot open "+filename); + synfig::warning("Cannot open "+filename); return false; } @@ -204,11 +204,8 @@ synfig::Main::Main(const synfig::String& basepath,ProgressCallback *cb): #ifdef ENABLE_NLS String locale_dir; locale_dir = locale_path; -#ifdef _WIN32 - locale_dir = Glib::locale_from_utf8(locale_dir); -#endif - bindtextdomain("synfig", locale_path.c_str() ); + bindtextdomain("synfig", Glib::locale_from_utf8(locale_path).c_str() ); bind_textdomain_codeset("synfig", "UTF-8"); #endif @@ -342,15 +339,12 @@ synfig::Main::Main(const synfig::String& basepath,ProgressCallback *cb): if(getenv("HOME")) locations.push_back(strprintf("%s/Library/Synfig/%s", getenv("HOME"), MODULE_LIST_FILENAME)); #endif - #ifdef _WIN32 - locations.push_back("C:\\Program Files\\Synfig\\etc\\" MODULE_LIST_FILENAME); - #endif } for(i=0;itask(strprintf(_("Loading modules from %s"),locations[i].c_str())); break; } @@ -626,5 +620,8 @@ synfig::get_binary_path(const String &fallback_path) // (usually should come from argv[0]) result = etl::absolute_path(fallback_path); } + + result = Glib::locale_to_utf8(result); + return result; } diff --git a/synfig-core/src/synfig/module.cpp b/synfig-core/src/synfig/module.cpp index 7ffd4adca4a..f66e6556886 100644 --- a/synfig-core/src/synfig/module.cpp +++ b/synfig-core/src/synfig/module.cpp @@ -36,6 +36,7 @@ #include "general.h" #include #include "type.h" +#include #ifndef USE_CF_BUNDLES #include @@ -73,7 +74,10 @@ Module::subsys_init(const String &prefix) lt_dladdsearchdir("."); if(getenv("HOME")) lt_dladdsearchdir(strprintf("%s/.local/share/synfig/modules", getenv("HOME")).c_str()); - lt_dladdsearchdir((prefix+"/lib/synfig/modules").c_str()); + lt_dladdsearchdir((Glib::locale_from_utf8(prefix) + \ + ETL_DIRECTORY_SEPARATOR + "lib" + \ + ETL_DIRECTORY_SEPARATOR + "synfig" + \ + ETL_DIRECTORY_SEPARATOR + "modules" ).c_str()); #ifdef LIBDIR lt_dladdsearchdir(LIBDIR"/synfig/modules"); #endif diff --git a/synfig-core/src/tool/main.cpp b/synfig-core/src/tool/main.cpp index 6feb0c20ac2..0e5aedbd3a9 100644 --- a/synfig-core/src/tool/main.cpp +++ b/synfig-core/src/tool/main.cpp @@ -94,10 +94,7 @@ int main(int argc, char* argv[]) boost::filesystem::path locale_path = binary_path.parent_path().parent_path(); locale_path = locale_path/"share"/"locale"; -#ifdef _WIN32 - locale_path = Glib::locale_from_utf8(locale_path.string()); -#endif - bindtextdomain("synfig", locale_path.string().c_str() ); + bindtextdomain("synfig", Glib::locale_from_utf8(locale_path.string()).c_str() ); bind_textdomain_codeset("synfig", "UTF-8"); textdomain("synfig"); #endif diff --git a/synfig-studio/src/gui/main.cpp b/synfig-studio/src/gui/main.cpp index 8743422bc8a..ca17ce30e0c 100644 --- a/synfig-studio/src/gui/main.cpp +++ b/synfig-studio/src/gui/main.cpp @@ -78,16 +78,11 @@ int main(int argc, char **argv) #ifdef ENABLE_NLS String locale_dir; locale_dir = etl::dirname(etl::dirname(binary_path))+ETL_DIRECTORY_SEPARATOR+"share"+ETL_DIRECTORY_SEPARATOR+"locale"; -#ifdef _WIN32 - locale_dir = Glib::locale_from_utf8(locale_dir); -#endif - setlocale(LC_ALL, ""); - bindtextdomain(GETTEXT_PACKAGE, locale_dir.c_str() ); + bindtextdomain(GETTEXT_PACKAGE, Glib::locale_from_utf8(locale_dir).c_str() ); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); textdomain(GETTEXT_PACKAGE); #endif - { SmartFILE file(IPC::make_connection()); if(file) diff --git a/synfig-studio/src/synfigapp/main.cpp b/synfig-studio/src/synfigapp/main.cpp index 0171dd4ce79..1c6a8827219 100644 --- a/synfig-studio/src/synfigapp/main.cpp +++ b/synfig-studio/src/synfigapp/main.cpp @@ -118,11 +118,8 @@ synfigapp::Main::Main(const synfig::String &basepath, synfig::ProgressCallback * #ifdef ENABLE_NLS String locale_dir; locale_dir = etl::dirname(basepath)+ETL_DIRECTORY_SEPARATOR+"share"+ETL_DIRECTORY_SEPARATOR+"locale"; -#ifdef _WIN32 - locale_dir = Glib::locale_from_utf8(locale_dir); -#endif - bindtextdomain(GETTEXT_PACKAGE, locale_dir.c_str() ); + bindtextdomain(GETTEXT_PACKAGE, Glib::locale_from_utf8(locale_dir).c_str() ); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); #endif