X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Finkscape.cpp;h=60ab895ede7789bf05f082b957aaf1f017375f40;hb=bd2dcf193883cbaf5c165835f9bac5c22b24cd71;hp=5d9e217a82f4061fdb43813db9a882b43730be49;hpb=b50bd4043d21611cc8301b731f60b4b0cd27bfb8;p=inkscape.git diff --git a/src/inkscape.cpp b/src/inkscape.cpp index 5d9e217a8..60ab895ed 100644 --- a/src/inkscape.cpp +++ b/src/inkscape.cpp @@ -15,6 +15,7 @@ # include "config.h" #endif +#include #include #include "debug/simple-event.h" @@ -140,9 +141,12 @@ static void (* segv_handler) (int) = SIG_DFL; static void (* abrt_handler) (int) = SIG_DFL; static void (* fpe_handler) (int) = SIG_DFL; static void (* ill_handler) (int) = SIG_DFL; +#ifndef WIN32 static void (* bus_handler) (int) = SIG_DFL; +#endif -#define INKSCAPE_PROFILE_DIR "Inkscape" +#define INKSCAPE_PROFILE_DIR "inkscape" +#define INKSCAPE_PROFILE_DIR_047DEV "Inkscape" #define INKSCAPE_LEGACY_PROFILE_DIR ".inkscape" #define MENUS_FILE "menus.xml" @@ -787,10 +791,17 @@ inkscape_application_init (const gchar *argv0, gboolean use_gui) Inkscape::Preferences *prefs = Inkscape::Preferences::get(); InkErrorHandler* handler = new InkErrorHandler(use_gui); prefs->setErrorHandler(handler); + { + Glib::ustring msg; + Glib::ustring secondary; + if (prefs->getLastError( msg, secondary )) { + handler->handleError(msg, secondary); + } + } inkscape_load_menus(inkscape); sp_input_load_from_preferences(); - + /* set language for user interface according setting in preferences */ Glib::ustring ui_language = prefs->getString("/ui/language"); if(!ui_language.empty()) @@ -847,18 +858,21 @@ gboolean inkscape_app_use_gui( Inkscape::Application const * app ) */ bool inkscape_load_menus (Inkscape::Application */*inkscape*/) { + // TODO fix that fn is being leaked gchar *fn = profile_path(MENUS_FILE); - gchar *menus_xml = NULL; gsize len = 0; + gchar *menus_xml = NULL; + gsize len = 0; if (g_file_get_contents(fn, &menus_xml, &len, NULL)) { // load the menus_xml file INKSCAPE->menus = sp_repr_read_mem(menus_xml, len, NULL); g_free(menus_xml); - if (INKSCAPE->menus) return true; + if (INKSCAPE->menus) { + return true; + } } INKSCAPE->menus = sp_repr_read_mem(menus_skeleton, MENUS_SKELETON_SIZE, NULL); - if (INKSCAPE->menus) return true; - return false; + return (INKSCAPE->menus != 0); } @@ -1367,7 +1381,15 @@ gchar * profile_path(const char *filename) { static const gchar *prefdir = NULL; + + if (!prefdir) { + // First check for a custom environment variable for a "portable app" + gchar const *val = g_getenv("INKSCAPE_PORTABLE_PROFILE_DIR"); + if (val) { + prefdir = g_strdup(val); + } + #ifdef HAS_SHGetSpecialFolderLocation // prefer c:\Documents and Settings\UserName\Application Data\ to // c:\Documents and Settings\userName\; @@ -1421,14 +1443,37 @@ profile_path(const char *filename) if (!prefdir) { prefdir = g_build_filename(g_get_user_config_dir(), INKSCAPE_PROFILE_DIR, NULL); gchar * legacyDir = homedir_path(INKSCAPE_LEGACY_PROFILE_DIR); + gchar * dev47Dir = g_build_filename(g_get_user_config_dir(), INKSCAPE_PROFILE_DIR_047DEV, NULL); - // TODO here is a point to hook in preference migration + bool needsMigration = ( !Inkscape::IO::file_test( prefdir, G_FILE_TEST_EXISTS ) && Inkscape::IO::file_test( legacyDir, G_FILE_TEST_EXISTS ) ); + if (needsMigration) { + // TODO here is a point to hook in preference migration + g_warning("Preferences need to be migrated from 0.46 or older %s to %s", legacyDir, prefdir); + } - if ( !Inkscape::IO::file_test( prefdir, G_FILE_TEST_EXISTS ) && Inkscape::IO::file_test( legacyDir, G_FILE_TEST_EXISTS ) ) { - prefdir = legacyDir; - } else { - g_free(legacyDir); - legacyDir = 0; + bool needsRenameWarning = ( !Inkscape::IO::file_test( prefdir, G_FILE_TEST_EXISTS ) && Inkscape::IO::file_test( dev47Dir, G_FILE_TEST_EXISTS ) ); + if (needsRenameWarning) { + g_warning("Preferences need to be copied from %s to %s", legacyDir, prefdir); + } + + g_free(legacyDir); + legacyDir = 0; + g_free(dev47Dir); + dev47Dir = 0; + // In case the XDG user config dir of the moment does not yet exist... + int mode = S_IRWXU; +#ifdef S_IRGRP + mode |= S_IRGRP; +#endif +#ifdef S_IXGRP + mode |= S_IXGRP; +#endif +#ifdef S_IXOTH + mode |= S_IXOTH; +#endif + if ( g_mkdir_with_parents(prefdir, mode) == -1 ) { + int problem = errno; + g_warning("Unable to create profile directory (%s) (%d)", g_strerror(problem), problem); } } }