From 33c8254b870b00a30bd83ab5488dd4130115a960 Mon Sep 17 00:00:00 2001 From: Hombre Date: Sun, 22 May 2011 10:39:26 +0200 Subject: [PATCH] (Partially) solved issue 663 : UTF-8 support at Windows for stable branch_3.0 --- rtengine/safegtk.cc | 23 ++--- rtengine/safegtk.h | 2 +- rtgui/main.cc | 46 +++++----- rtgui/safegtk.cc | 213 -------------------------------------------- 4 files changed, 34 insertions(+), 250 deletions(-) delete mode 100644 rtgui/safegtk.cc diff --git a/rtengine/safegtk.cc b/rtengine/safegtk.cc index 6ba18662e..0d1a1e307 100644 --- a/rtengine/safegtk.cc +++ b/rtengine/safegtk.cc @@ -50,19 +50,22 @@ Glib::RefPtr safe_create_from_file(const std::string& filename) return res; } -Cairo::RefPtr safe_create_from_png(const std::string& filename) +Cairo::RefPtr safe_create_from_png(const Glib::ustring& filename) { - Cairo::RefPtr res; + Cairo::RefPtr res; - if (!safe_file_test (filename, Glib::FILE_TEST_EXISTS)) { - printf ("ERROR: File \"%s\" not found.\n", filename.c_str()); - } else { + // files_test need a std::string which (as stated in its proto) but will only work if + // we use the Glib::ustring filename !? + if (!Glib::file_test (filename, Glib::FILE_TEST_EXISTS)) { + printf ("ERROR: (ustring) File \"%s\" not found.\n", filename.c_str()); + } else { try { - res = Cairo::ImageSurface::create_from_png (filename); + // create_from_png need a std::string converted from UTF8 with safe_locale_from_utf8 + res = Cairo::ImageSurface::create_from_png (safe_locale_from_utf8(filename)); } catch (...) {} - } - - return res; + } + + return res; } Glib::RefPtr safe_query_file_info (Glib::RefPtr &file) @@ -286,4 +289,4 @@ int safe_g_rename(const Glib::ustring& oldFilename, const Glib::ustring& newFile int safe_g_mkdir_with_parents(const Glib::ustring& dirName, int mode) { return ::g_mkdir_with_parents(dirName.c_str(), mode); -} \ No newline at end of file +} diff --git a/rtengine/safegtk.h b/rtengine/safegtk.h index ae8c597f4..3303833f5 100644 --- a/rtengine/safegtk.h +++ b/rtengine/safegtk.h @@ -6,7 +6,7 @@ #include Glib::RefPtr safe_create_from_file(const std::string& filename); -Cairo::RefPtr safe_create_from_png(const std::string& filename); +Cairo::RefPtr safe_create_from_png(const Glib::ustring& filename); class FileMTimeInfo { diff --git a/rtgui/main.cc b/rtgui/main.cc index dfcd3c202..91f0b766d 100644 --- a/rtgui/main.cc +++ b/rtgui/main.cc @@ -48,48 +48,42 @@ Glib::ustring argv0; Glib::ustring argv1; int main(int argc, char **argv) -{ +{ + + Glib::ustring argv0_, argv1_; - std::string argv0_, argv1_; - #ifdef WIN32 - char exname[512]; - GetModuleFileName (NULL, exname, 512); + + WCHAR exnameU[512] = {0}; + char exname[512] = {0}; + GetModuleFileNameW (NULL, exnameU, 512); + WideCharToMultiByte(CP_UTF8,0,exnameU,-1,exname,512,0,0 ); argv0_ = exname; - // get the path where the rawtherapee is stored - int i; - for (i=argv0_.size()-1; (argv0_[i]!='/' && argv0_[i]!='\\') && i>0; i--); - if (argv0_[i]=='/' || argv0_[i]=='\\') - argv0_ = argv0_.substr(0,i); + + // get the path where the rawtherapee executable is stored + argv0 = Glib::path_get_dirname(argv0_); + #else + // get the path to data (defined in config.h which is generated by cmake) - argv0_ = DATA_SEARCH_PATH; + argv0 = DATA_SEARCH_PATH; // check if path exists, otherwise revert back to behavior similar to windows try { Glib::Dir dir(DATA_SEARCH_PATH); } catch (Glib::FileError) { argv0_ = argv[0]; - int i; - for (i=argv0_.size()-1; (argv0_[i]!='/' && argv0_[i]!='\\') && i>0; i--); - if (argv0_[i]=='/' || argv0_[i]=='\\') - argv0_ = argv0_.substr(0,i); + argv0 = Glib::path_get_dirname(argv0_); } + #endif - + if (argc>1) argv1_ = argv[1]; else argv1_ = ""; - -#ifdef GLIBMM_EXCEPTIONS_ENABLED - argv0 = Glib::filename_to_utf8 (argv0_); - argv1 = Glib::filename_to_utf8 (argv1_); -#else - std::auto_ptr error; - argv0 = Glib::filename_to_utf8 (argv0_, error); - argv1 = Glib::filename_to_utf8 (argv1_, error); -#endif //GLIBMM_EXCEPTIONS_ENABLED + + argv1 = safe_locale_to_utf8 (argv1_); Glib::thread_init(); gdk_threads_init(); @@ -106,7 +100,7 @@ int main(int argc, char **argv) // Gtk::RC::add_default_file (argv0+"/themes/"+options.theme); if (!options.useSystemTheme) { - std::vector rcfiles; + std::vector rcfiles; rcfiles.push_back (argv0+"/themes/"+options.theme); // Set the font face and size Gtk::RC::parse_string (Glib::ustring::compose( diff --git a/rtgui/safegtk.cc b/rtgui/safegtk.cc deleted file mode 100644 index bc54ddde2..000000000 --- a/rtgui/safegtk.cc +++ /dev/null @@ -1,213 +0,0 @@ -/* - * This file is part of RawTherapee. - * - * Copyright (c) 2004-2010 Gabor Horvath - * Copyright (c) 2010 Sasha Vasko - * - * RawTherapee is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * RawTherapee is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with RawTherapee. If not, see . - */ - -#include -#include - -Glib::RefPtr safe_create_from_file(const std::string& filename) -{ - Glib::RefPtr res; -#ifdef GLIBMM_EXCEPTIONS_ENABLED - try { - res = Gdk::Pixbuf::create_from_file (filename); - } - catch (Glib::Exception& ex) { - printf ("%s\n", ex.what().c_str()); - } -#else - std::auto_ptr error; - res = Gdk::Pixbuf::create_from_file (filename, error); - if (error.get()) - printf ("%s\n", error->what().c_str()); -#endif - - return res; -} - -Cairo::RefPtr safe_create_from_png(const std::string& filename) -{ - Cairo::RefPtr res; - - if (!Glib::file_test (filename, Glib::FILE_TEST_EXISTS)) { - printf ("ERROR: File \"%s\" not found.\n", filename.c_str()); - } else { - try { - res = Cairo::ImageSurface::create_from_png (filename); - } catch (...) {} - } - - return res; -} - -Glib::RefPtr safe_query_file_info (Glib::RefPtr &file) -{ - Glib::RefPtr info; -#ifdef GLIBMM_EXCEPTIONS_ENABLED - try { info = file->query_info(); }catch (...) { } -#else - std::auto_ptr error; - info = file->query_info("*", Gio::FILE_QUERY_INFO_NONE, error); -#endif - return info; -} - -#ifdef GLIBMM_EXCEPTIONS_ENABLED -# define SAFE_ENUMERATOR_CODE_START \ - do{try { if ((dirList = dir->enumerate_children ())) \ - for (Glib::RefPtr info = dirList->next_file(); info; info = dirList->next_file()) { - -# define SAFE_ENUMERATOR_CODE_END \ - }} catch (Glib::Exception& ex) { printf ("%s\n", ex.what().c_str()); }}while(0) -#else -# define SAFE_ENUMERATOR_CODE_START \ - do{std::auto_ptr error; Glib::RefPtr cancellable; \ - if ((dirList = dir->enumerate_children (cancellable, "*", Gio::FILE_QUERY_INFO_NONE, error))) \ - for (Glib::RefPtr info = dirList->next_file(cancellable, error); !error.get() && info; info = dirList->next_file(cancellable, error)) { - -# define SAFE_ENUMERATOR_CODE_END } if (error.get()) printf ("%s\n", error->what().c_str());}while (0) -#endif - -void safe_build_file_list (Glib::RefPtr &dir, std::vector &flist) -{ - Glib::RefPtr dirList; - if (dir) { - SAFE_ENUMERATOR_CODE_START - flist.push_back (FileMTimeInfo (removeExtension(info->get_name()), info->modification_time())); - SAFE_ENUMERATOR_CODE_END; - } -} - -void safe_build_file_list (Glib::RefPtr &dir, std::vector &names, const Glib::ustring &directory) -{ - Glib::RefPtr dirList; - if (dir) { - SAFE_ENUMERATOR_CODE_START - names.push_back (Glib::build_filename (directory, info->get_name())); - SAFE_ENUMERATOR_CODE_END; - } -} - - -void safe_build_subdir_list (Glib::RefPtr &dir, std::vector &subDirs, bool add_hidden) -{ - Glib::RefPtr dirList; - if (dir) - { - // CD-ROMs with no drive inserted are reported, but do not exist, causing RT to crash - if (!Glib::file_test(dir->get_path(),Glib::FILE_TEST_EXISTS)) return; - - SAFE_ENUMERATOR_CODE_START - if (info->get_file_type() == Gio::FILE_TYPE_DIRECTORY && (!info->is_hidden() || add_hidden)) - subDirs.push_back (info->get_name()); - SAFE_ENUMERATOR_CODE_END; - } -} - -Glib::ustring safe_locale_to_utf8 (const std::string& src) -{ - Glib::ustring utf8_str; -#ifdef GLIBMM_EXCEPTIONS_ENABLED - try { - utf8_str = Glib::locale_to_utf8(src); - } - catch (const Glib::ConvertError& e) { - utf8_str = Glib::convert_with_fallback(src, "UTF8", "LATIN1","?"); - } -#else - { - std::auto_ptr error; - utf8_str = locale_to_utf8(src, error); - if (error.get()) - utf8_str = Glib::convert_with_fallback(src, "UTF8", "LATIN1","?", error); - } -#endif //GLIBMM_EXCEPTIONS_ENABLED - return utf8_str; -} - -std::string safe_locale_from_utf8 (const Glib::ustring& utf8_str) -{ - std::string str; -#ifdef GLIBMM_EXCEPTIONS_ENABLED - try { - str = Glib::locale_from_utf8(utf8_str); - } - catch (const Glib::ConvertError& e) { - //str = Glib::convert_with_fallback(utf8_str, "LATIN1", "UTF8", "?"); - } -#else - { - std::auto_ptr error; - str = Glib::locale_from_utf8(utf8_str, error); - /*if (error.get()) - {str = Glib::convert_with_fallback(utf8_str, "LATIN1", "UTF8", "?", error);}*/ - } -#endif //GLIBMM_EXCEPTIONS_ENABLED - return str; -} - - -bool safe_spawn_command_line_async (const Glib::ustring& cmd_utf8) -{ - std::string cmd; - bool success = false; -#ifdef GLIBMM_EXCEPTIONS_ENABLED - try { - cmd = Glib::filename_from_utf8(cmd_utf8); - printf ("command line: |%s|\n", cmd.c_str()); - Glib::spawn_command_line_async (cmd); - success = true; - } catch (Glib::Exception& ex) { - printf ("%s\n", ex.what().c_str()); - } -#else - std::auto_ptr error; - cmd = Glib::filename_from_utf8(cmd_utf8, error); - if (!error.get()) { - printf ("command line: |%s|\n", cmd.c_str()); - Glib::spawn_command_line_async (cmd, error); - } - if (error.get()) - printf ("%s\n", error->what().c_str()); - else - success = true; -#endif - return success; -} - -bool safe_spawn_command_line_sync (const Glib::ustring& cmd_utf8) -{ - std::string cmd; - std::string stdOut; - std::string stdErr; - - bool success = false; - - int exitStatus=-1; - try { - cmd = Glib::filename_from_utf8(cmd_utf8); - printf ("command line: |%s|\n", cmd.c_str()); - - // if it crashes here on windows, make sure you have the GTK runtime files gspawn-win32-helper*.exe files in RT directory - Glib::spawn_command_line_sync (cmd,NULL,NULL, &exitStatus); - } catch (Glib::Exception& ex) { - printf ("%s\n", ex.what().c_str()); - } - return (exitStatus==0); -}