Code

spiral-context.h: Supply missing #includes/declarations so that we don't depend on...
[inkscape.git] / src / main.cpp
index 01406cc2041f39c3b72baac4e1e97ef4e04c1775..6ec0ca6b405df1bea3eaccd8411d254bc1a658be 100644 (file)
@@ -411,38 +411,43 @@ struct poptOption options[] = {
 };
 
 static bool needToRecodeParams = true;
-gchar const* blankParam = "";
+gchar * blankParam = g_strdup("");
 
-#ifdef WIN32
-static int _win32_set_inkscape_env(char *argv0)
-{
-    CHAR szFullPath[_MAX_PATH];
 
-    CHAR szDrive[_MAX_DRIVE];
-    CHAR szDir[_MAX_DIR];
-    CHAR szFile[_MAX_FNAME];
-    CHAR szExt[_MAX_EXT];
 
-    std::string tmp;
+#ifdef WIN32
 
-    if (GetModuleFileName(NULL, szFullPath, sizeof(szFullPath)) == 0) {
-        strcpy(szFullPath, argv0);
-    }
+/**
+ * Return the directory of the .exe that is currently running
+ */
+static Glib::ustring _win32_getExePath()
+{
+    char exeName[MAX_PATH+1];
+    GetModuleFileName(NULL, exeName, MAX_PATH);
+    char *slashPos = strrchr(exeName, '\\');
+    if (slashPos)
+        *slashPos = '\0';
+    Glib::ustring s = exeName;
+    return s;
+}
 
-    _splitpath(szFullPath, szDrive, szDir, szFile, szExt);
-    strcpy(szFullPath, szDrive);
-    strcat(szFullPath, szDir);
+/**
+ * Set up the PATH and PYTHONPATH environment variables on
+ * win32
+ */  
+static int _win32_set_inkscape_env(const Glib::ustring &exePath)
+{
 
     char *oldenv = getenv("PATH");
-    tmp = "PATH=";
-    tmp += szFullPath;
+    Glib::ustring tmp = "PATH=";
+    tmp += exePath;
     tmp += ";";
-    tmp += szFullPath;
-    tmp += "python;";
-    tmp += szFullPath;
-    tmp += "python\\Scripts;";  // for uniconv.cmd
-    tmp += szFullPath;
-    tmp += "perl";
+    tmp += exePath;
+    tmp += "\\python;";
+    tmp += exePath;
+    tmp += "\\python\\Scripts;";  // for uniconv.cmd
+    tmp += exePath;
+    tmp += "\\perl";
     if(oldenv != NULL) {
         tmp += ";";
         tmp += oldenv;
@@ -451,12 +456,12 @@ static int _win32_set_inkscape_env(char *argv0)
 
     oldenv = getenv("PYTHONPATH");
     tmp = "PYTHONPATH=";
-    tmp += szFullPath;
-    tmp += "python;";
-    tmp += szFullPath;
-    tmp += "python\\Lib;";
-    tmp += szFullPath;
-    tmp += "python\\DLLs";
+    tmp += exePath;
+    tmp += "\\python;";
+    tmp += exePath;
+    tmp += "\\python\\Lib;";
+    tmp += exePath;
+    tmp += "\\python\\DLLs";
     if(oldenv != NULL) {
         tmp += ";";
         tmp += oldenv;
@@ -467,6 +472,12 @@ static int _win32_set_inkscape_env(char *argv0)
 }
 #endif
 
+
+
+/**
+ * This is the classic main() entry point of the program, though on some
+ * architectures it might be called by something else.
+ */  
 int
 main(int argc, char **argv)
 {
@@ -477,14 +488,30 @@ main(int argc, char **argv)
     fpsetmask(fpgetmask() & ~(FP_X_DZ | FP_X_INV));
 #endif
 
-#ifdef ENABLE_NLS
 #ifdef WIN32
-       _win32_set_inkscape_env(argv[0]);
+    /*
+      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
+    */
+    Glib::ustring homedir = _win32_getExePath();
+    SetCurrentDirectory(homedir.c_str());
+       _win32_set_inkscape_env(homedir);
     RegistryTool rt;
     rt.setPathInfo();
-    gchar *pathBuf = g_strconcat(g_path_get_dirname(argv[0]), "\\", PACKAGE_LOCALE_DIR, NULL);
-    bindtextdomain(GETTEXT_PACKAGE, pathBuf);
-    g_free(pathBuf);
+#endif
+
+   /**
+    * Call bindtextdomain() for various machines's paths
+    */    
+#ifdef ENABLE_NLS
+#ifdef WIN32
+    Glib::ustring localePath = homedir;
+       localePath += "\\";
+       localePath += PACKAGE_LOCALE_DIR;
+    bindtextdomain(GETTEXT_PACKAGE, localePath.c_str());
 #else
 #ifdef ENABLE_BINRELOC
     bindtextdomain(GETTEXT_PACKAGE, BR_LOCALEDIR(""));
@@ -513,21 +540,10 @@ main(int argc, char **argv)
     Inkscape::Debug::Logger::init();
 
     gboolean use_gui;
+
 #ifndef WIN32
     use_gui = (getenv("DISPLAY") != NULL);
 #else
-    /*
-      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 FIXME BROKEN - non-UTF-8 sneaks in here.
-    char *homedir = g_path_get_dirname(argv[0]);
-    SetCurrentDirectory(homedir);
-    g_free(homedir);
-
     use_gui = TRUE;
 #endif
     /* Test whether with/without GUI is forced */
@@ -594,6 +610,9 @@ main(int argc, char **argv)
     return app.run();
 }
 
+
+
+
 void fixupSingleFilename( gchar **orig, gchar **spare )
 {
     if ( orig && *orig && **orig ) {
@@ -610,6 +629,8 @@ void fixupSingleFilename( gchar **orig, gchar **spare )
     }
 }
 
+
+
 GSList *fixupFilenameEncoding( GSList* fl )
 {
     GSList *newFl = NULL;
@@ -840,7 +861,7 @@ sp_main_console(int argc, char const **argv)
                 Inkscape::XML::Node *repr;
                 rdoc = sp_repr_document_new("svg:svg");
                 repr = rdoc->root();
-                repr = sp_document_root(doc)->updateRepr(repr, SP_OBJECT_WRITE_BUILD);
+                repr = sp_document_root(doc)->updateRepr(rdoc, repr, SP_OBJECT_WRITE_BUILD);
                 sp_repr_save_file(repr->document(), sp_export_svg, SP_SVG_NS_URI);
             }
             if (sp_export_ps) {
@@ -899,7 +920,7 @@ do_query_dimension (SPDocument *doc, bool extent, NR::Dim2 const axis, const gch
         SPItem *item = ((SPItem *) o);
 
         // "true" SVG bbox for scripting
-        NR::Maybe<NR::Rect> area = item->getBounds(sp_item_i2doc_affine(item));
+        NR::Maybe<NR::Rect> area = item->getBounds(from_2geom(sp_item_i2doc_affine(item)));
         if (area) {
             Inkscape::SVGOStringStream os;
             if (extent) {
@@ -932,7 +953,7 @@ do_query_all_recurse (SPObject *o)
 {
     SPItem *item = ((SPItem *) o);
     if (o->id && SP_IS_ITEM(item)) {
-        NR::Maybe<NR::Rect> area = item->getBounds(sp_item_i2doc_affine(item));
+        NR::Maybe<NR::Rect> area = item->getBounds(from_2geom(sp_item_i2doc_affine(item)));
         if (area) {
             Inkscape::SVGOStringStream os;
             os << o->id;
@@ -1024,7 +1045,7 @@ sp_do_export_png(SPDocument *doc)
 
             // write object bbox to area
             sp_document_ensure_up_to_date (doc);
-            sp_item_invoke_bbox((SPItem *) o_area, &area, sp_item_i2r_affine((SPItem *) o_area), TRUE);
+            sp_item_invoke_bbox((SPItem *) o_area, &area, from_2geom(sp_item_i2r_affine((SPItem *) o_area)), TRUE);
         } else {
             g_warning("Object with id=\"%s\" was not found in the document. Nothing exported.", sp_export_id);
             return;
@@ -1414,11 +1435,13 @@ bool replaceArgs( int& argc, char**& argv )
                 if ( wildcarded )
                 {
 #ifdef REPLACEARGS_ANSI
-                    WIN32_FIND_DATAA data = {0};
+                    WIN32_FIND_DATAA data;
 #else
-                    WIN32_FIND_DATAW data = {0};
+                    WIN32_FIND_DATAW data;
 #endif // REPLACEARGS_ANSI
 
+                    memset((void *)&data, 0, sizeof(data));
+
                     int baseLen = wcslen(parsed[i1]) + 2;
                     wchar_t* base = new wchar_t[baseLen];
                     wcsncpy( base, parsed[i1], baseLen );