X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fmain.cpp;h=6ec0ca6b405df1bea3eaccd8411d254bc1a658be;hb=7a1aa487fd405063c8aea5e19fed056f1ace3d75;hp=01406cc2041f39c3b72baac4e1e97ef4e04c1775;hpb=e06eadaa4386ea49a02efc71d893cb6eeaa09581;p=inkscape.git diff --git a/src/main.cpp b/src/main.cpp index 01406cc20..6ec0ca6b4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -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 area = item->getBounds(sp_item_i2doc_affine(item)); + NR::Maybe 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 area = item->getBounds(sp_item_i2doc_affine(item)); + NR::Maybe 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 );