Code

Belarusian translation for 0.47, by Hleb Valoshka
[inkscape.git] / src / inkscape.cpp
index 5d9e217a82f4061fdb43813db9a882b43730be49..60ab895ede7789bf05f082b957aaf1f017375f40 100644 (file)
@@ -15,6 +15,7 @@
 # include "config.h"
 #endif
 
+#include <errno.h>
 
 #include <map>
 #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);
             }
         }
     }