diff --git a/src/main.cpp b/src/main.cpp
index c50ba7311b652e00c9344199cefe963a5901100f..a1b21cc4d0f65b1cf1fb3ad2cba4787ab2648ec0 100644 (file)
--- a/src/main.cpp
+++ b/src/main.cpp
-#define __MAIN_C__
-
/** \file
* Inkscape - an ambitious vector drawing program
*
* Pawel Palucha
* Bryce Harrington <bryce@bryceharrington.com>
* ... and various people who have worked with various projects
+ * Jon A. Cruz <jon@oncruz.org>
+ * Abhishek Sharma
*
* Copyright (C) 1999-2004 authors
* Copyright (C) 2001-2002 Ximian, Inc.
#define bind_textdomain_codeset(p,c)
#endif
-#include "application/application.h"
#include "main-cmdlineact.h"
#include "widgets/icon.h"
#include "ui/widget/panel.h"
static gboolean sp_query_height = FALSE;
static gboolean sp_query_all = FALSE;
static gchar *sp_query_id = NULL;
-static int sp_new_gui = FALSE;
static gboolean sp_shell = FALSE;
static gboolean sp_vacuum_defs = FALSE;
gchar *perl = g_build_filename(exe, "python", NULL);
gchar *pythonlib = g_build_filename(exe, "python", "Lib", NULL);
gchar *pythondll = g_build_filename(exe, "python", "DLLs", NULL);
- gchar *extdir = g_build_filename(exe, "share", "extensions", NULL);
// Python 2.x needs short paths in PYTHONPATH.
// Otherwise it doesn't work when Inkscape is installed in Unicode directories.
gchar *python_s = g_win32_locale_filename_from_utf8(python);
gchar *pythonlib_s = g_win32_locale_filename_from_utf8(pythonlib);
gchar *pythondll_s = g_win32_locale_filename_from_utf8(pythondll);
- gchar *extdir_s = g_win32_locale_filename_from_utf8(extdir);
gchar *new_path;
gchar *new_pythonpath;
new_path = g_strdup_printf("%s;%s;%s;%s", exe, python, scripts, perl);
}
if (pythonpath) {
- new_pythonpath = g_strdup_printf("%s;%s;%s;%s;%s",
- extdir_s, python_s, pythonlib_s, pythondll_s, pythonpath);
- } else {
new_pythonpath = g_strdup_printf("%s;%s;%s;%s",
- extdir_s, python_s, pythonlib_s, pythondll_s);
+ python_s, pythonlib_s, pythondll_s, pythonpath);
+ } else {
+ new_pythonpath = g_strdup_printf("%s;%s;%s",
+ python_s, pythonlib_s, pythondll_s);
}
g_setenv("PATH", new_path, TRUE);
}
#endif
+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);
+#else
+ extdir = g_strdup(INKSCAPE_EXTENSIONDIR);
+#endif
+
+ // 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(new_pythonpath);
+ //printf("PYTHONPATH = %s\n", g_getenv("PYTHONPATH"));
+}
+
/**
* This is the classic main() entry point of the program, though on some
* architectures it might be called by something else.
#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
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");
textdomain(GETTEXT_PACKAGE);
#endif
+ set_extensions_env();
+
// Prevents errors like "Unable to wrap GdkPixbuf..." (in nr-filter-image.cpp for example)
Gtk::Main::init_gtkmm_internals();
}
#endif // WIN32
- /// \todo Should this be a static object (see inkscape.cpp)?
- Inkscape::NSApplication::Application app(argc, argv, use_gui, sp_new_gui);
+ int retcode;
+
+ if (use_gui) {
+ retcode = sp_main_gui(argc, (const char **) argv);
+ } else {
+ retcode = sp_main_console(argc, (const char **) argv);
+ }
- return app.run();
+ return retcode;
}
g_warning("Specified document %s cannot be opened (does not exist or not a valid SVG file)", filename);
} else {
if (sp_vacuum_defs) {
- vacuum_document(doc);
+ doc->vacuumDocument();
}
if (sp_vacuum_defs && !sp_export_svg) {
// save under the name given in the command line
Inkscape::XML::Node *repr;
rdoc = sp_repr_document_new("svg:svg");
repr = rdoc->root();
- repr = sp_document_root(doc)->updateRepr(rdoc, repr, SP_OBJECT_WRITE_BUILD);
+ repr = doc->getRoot()->updateRepr(rdoc, repr, SP_OBJECT_WRITE_BUILD);
sp_repr_save_rebased_file(repr->document(), sp_export_svg, SP_SVG_NS_URI,
- doc->base, sp_export_svg);
+ doc->getBase(), sp_export_svg);
}
if (sp_export_ps) {
do_export_ps_pdf(doc, sp_export_ps, "image/x-postscript");
@@ -1176,15 +1196,15 @@ do_query_dimension (SPDocument *doc, bool extent, Geom::Dim2 const axis, const g
return;
}
} else {
- o = SP_DOCUMENT_ROOT(doc);
+ o = doc->getRoot();
}
if (o) {
- sp_document_ensure_up_to_date (doc);
+ doc->ensureUpToDate();
SPItem *item = ((SPItem *) o);
// "true" SVG bbox for scripting
- Geom::OptRect area = item->getBounds(sp_item_i2doc_affine(item));
+ Geom::OptRect area = item->getBounds(item->i2doc_affine());
if (area) {
Inkscape::SVGOStringStream os;
if (extent) {
@@ -1199,15 +1219,12 @@ do_query_dimension (SPDocument *doc, bool extent, Geom::Dim2 const axis, const g
}
}
-static void
-do_query_all (SPDocument *doc)
+static void do_query_all(SPDocument *doc)
{
- SPObject *o = NULL;
-
- o = SP_DOCUMENT_ROOT(doc);
+ SPObject *o = doc->getRoot();
if (o) {
- sp_document_ensure_up_to_date (doc);
+ doc->ensureUpToDate();
do_query_all_recurse(o);
}
}
{
SPItem *item = ((SPItem *) o);
if (o->getId() && SP_IS_ITEM(item)) {
- Geom::OptRect area = item->getBounds(sp_item_i2doc_affine(item));
+ Geom::OptRect area = item->getBounds(item->i2doc_affine());
if (area) {
Inkscape::SVGOStringStream os;
os << o->getId();
SPObject *o_area = NULL;
if (sp_export_id && sp_export_area_drawing) {
o = doc->getObjectById(sp_export_id);
- o_area = SP_DOCUMENT_ROOT (doc);
+ o_area = doc->getRoot();
} else if (sp_export_id) {
o = doc->getObjectById(sp_export_id);
o_area = o;
} else if (sp_export_area_drawing) {
- o = SP_DOCUMENT_ROOT (doc);
+ o = doc->getRoot();
o_area = o;
}
}
// write object bbox to area
- sp_document_ensure_up_to_date (doc);
+ doc->ensureUpToDate();
Geom::OptRect areaMaybe;
- sp_item_invoke_bbox((SPItem *) o_area, areaMaybe, sp_item_i2d_affine((SPItem *) o_area), TRUE);
+ static_cast<SPItem *>(o_area)->invoke_bbox( areaMaybe, static_cast<SPItem *>(o_area)->i2d_affine(), TRUE);
if (areaMaybe) {
area = *areaMaybe;
} else {
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;
}
area = Geom::Rect(Geom::Interval(x0,x1), Geom::Interval(y0,y1));
} else if (sp_export_area_page || !(sp_export_id || sp_export_area_drawing)) {
/* Export the whole page: note: Inkscape uses 'page' in all menus and dialogs, not 'canvas' */
- sp_document_ensure_up_to_date (doc);
+ doc->ensureUpToDate();
Geom::Point origin (SP_ROOT(doc->root)->x.computed, SP_ROOT(doc->root)->y.computed);
- area = Geom::Rect(origin, origin + sp_document_dimensions(doc));
+ area = Geom::Rect(origin, origin + doc->getDimensions());
}
// set filename and dpi from options, if not yet set from the hints
gchar *path = 0;
if (filename_from_hint) {
//Make relative paths go from the document location, if possible:
- if (!g_path_is_absolute(filename) && doc->uri) {
- gchar *dirname = g_path_get_dirname(doc->uri);
+ if (!g_path_is_absolute(filename) && doc->getURI()) {
+ gchar *dirname = g_path_get_dirname(doc->getURI());
if (dirname) {
path = g_build_filename(dirname, filename, NULL);
g_free(dirname);