Code

Fix self-snapping when dragging the transformation center of a selection containing...
[inkscape.git] / src / main.cpp
index a6dfb37f04e41367180fa908354a290669189d44..78b66d8478766b185c65473e63c70a39e01e919c 100644 (file)
@@ -545,6 +545,7 @@ static void set_extensions_env()
 {
     gchar const *pythonpath = g_getenv("PYTHONPATH");
     gchar *extdir;
+    gchar *new_pythonpath;
     
 #ifdef WIN32
     extdir = g_win32_locale_filename_from_utf8(INKSCAPE_EXTENSIONDIR);
@@ -552,11 +553,29 @@ static void set_extensions_env()
     extdir = g_strdup(INKSCAPE_EXTENSIONDIR);
 #endif
 
-    gchar *new_pythonpath = g_strdup_printf("%s" G_SEARCHPATH_SEPARATOR_S "%s",
-                                            extdir, pythonpath);
+    // On some platforms, INKSCAPE_EXTENSIONDIR is not absolute,
+    // but relative to the directory that contains the Inkscape executable.
+    // Since we spawn Python chdir'ed into the script's directory,
+    // we need to obtain the absolute path here.
+    if (!g_path_is_absolute(extdir)) {
+        gchar *curdir = g_get_current_dir();
+        gchar *extdir_new = g_build_filename(curdir, extdir, NULL);
+        g_free(extdir);
+        g_free(curdir);
+        extdir = extdir_new;
+    }
+
+    if (pythonpath) {
+        new_pythonpath = g_strdup_printf("%s" G_SEARCHPATH_SEPARATOR_S "%s",
+                                         extdir, pythonpath);
+        g_free(extdir);
+    } else {
+        new_pythonpath = extdir;
+    }
+
     g_setenv("PYTHONPATH", new_pythonpath, TRUE);
-    g_free(extdir);
     g_free(new_pythonpath);
+    //printf("PYTHONPATH = %s\n", g_getenv("PYTHONPATH"));
 }
 
 /**
@@ -574,23 +593,7 @@ main(int argc, char **argv)
 #endif
 
 #ifdef WIN32
-    /*
-      Set the current directory to the directory of the
-      executable.  This seems redundant, but is needed for
-      when inkscape.exe is executed from another directory.
-      We use relative paths on win32.
-      HKCR\svgfile\shell\open\command is a good example
-
-      TODO: this breaks the CLI on Windows, see LP #167455
-      However, the CLI is broken anyway, because we are a GUI app
-    */
-    const int pathbuf = 2048;
-    gunichar2 *path = g_new(gunichar2, pathbuf);
-    GetModuleFileNameW(NULL, (WCHAR*) path, pathbuf);
-    gchar *inkscape = g_utf16_to_utf8(path, -1, NULL, NULL, NULL);
-    gchar *exedir = g_path_get_dirname(inkscape);
-    gunichar2 *dirw = g_utf8_to_utf16(exedir, -1, NULL, NULL, NULL);
-    SetCurrentDirectoryW((WCHAR*) dirw);
+    gchar *exedir = g_strdup(win32_getExePath().data());
     _win32_set_inkscape_env(exedir);
 
 # ifdef ENABLE_NLS
@@ -602,11 +605,7 @@ main(int argc, char **argv)
     g_free(shortexedir);
     g_free(localepath);
 # endif
-    
-    g_free(path);
-    g_free(inkscape);
     g_free(exedir);
-    g_free(dirw);
 
     // Don't touch the registry (works fine without it) for Inkscape Portable
     gchar const *val = g_getenv("INKSCAPE_PORTABLE_PROFILE_DIR");
@@ -1346,7 +1345,7 @@ sp_do_export_png(SPDocument *doc)
     if (sp_export_area) {
         /* Try to parse area (given in SVG pixels) */
         gdouble x0,y0,x1,y1;
-        if (!sscanf(sp_export_area, "%lg:%lg:%lg:%lg", &x0, &y0, &x1, &y1) == 4) {
+        if (sscanf(sp_export_area, "%lg:%lg:%lg:%lg", &x0, &y0, &x1, &y1) != 4) {
             g_warning("Cannot parse export area '%s'; use 'x0:y0:x1:y1'. Nothing exported.", sp_export_area);
             return;
         }