Code

Refactoring SPColor to C++ and removing legacy CMYK implementation
[inkscape.git] / src / main.cpp
index 60050c461adc326e74bc287392315da0b6492b89..cc359793a518983bdec6b68639fe8777cce17d10 100644 (file)
@@ -48,8 +48,6 @@
 #include <gtk/gtkwindow.h>
 #include <gtk/gtkbox.h>
 
-#include <gtk/gtkmain.h>
-
 #include "gc-core.h"
 
 #include "macros.h"
@@ -58,7 +56,6 @@
 #include "sp-object.h"
 #include "interface.h"
 #include "print.h"
-#include "slideshow.h"
 #include "color.h"
 #include "sp-item.h"
 #include "sp-root.h"
@@ -80,6 +77,7 @@
 #include "io/sys.h"
 
 #include "debug/logger.h"
+#include "debug/log-display-config.h"
 
 #include "helper/png-write.h"
 
@@ -110,6 +108,8 @@ using Inkscape::Extension::Internal::PrintWin32;
 
 #include "application/application.h"
 
+#include "main-cmdlineact.h"
+
 enum {
     SP_ARG_NONE,
     SP_ARG_NOGUI,
@@ -134,9 +134,10 @@ enum {
     SP_ARG_EXPORT_EPS,
     SP_ARG_EXPORT_PDF,
     SP_ARG_EXPORT_TEXT_TO_PATH,
+    SP_ARG_EXPORT_FONT,
     SP_ARG_EXPORT_BBOX_PAGE,
     SP_ARG_EXTENSIONDIR,
-    SP_ARG_SLIDESHOW,
+    SP_ARG_FIT_PAGE_TO_DRAWING,
     SP_ARG_QUERY_X,
     SP_ARG_QUERY_Y,
     SP_ARG_QUERY_WIDTH,
@@ -144,6 +145,9 @@ enum {
     SP_ARG_QUERY_ID,
     SP_ARG_VERSION,
     SP_ARG_VACUUM_DEFS,
+    SP_ARG_VERB_LIST,
+    SP_ARG_VERB,
+    SP_ARG_SELECT,
     SP_ARG_LAST
 };
 
@@ -156,7 +160,6 @@ static void do_query_dimension (SPDocument *doc, bool extent, NR::Dim2 const axi
 
 
 static gchar *sp_global_printer = NULL;
-static gboolean sp_global_slideshow = FALSE;
 static gchar *sp_export_png = NULL;
 static gchar *sp_export_dpi = NULL;
 static gchar *sp_export_area = NULL;
@@ -175,6 +178,7 @@ static gchar *sp_export_ps = NULL;
 static gchar *sp_export_eps = NULL;
 static gchar *sp_export_pdf = NULL;
 static gboolean sp_export_text_to_path = FALSE;
+static gboolean sp_export_font = FALSE;
 static gboolean sp_export_bbox_page = FALSE;
 static gboolean sp_query_x = FALSE;
 static gboolean sp_query_y = FALSE;
@@ -310,6 +314,11 @@ struct poptOption options[] = {
      N_("Convert text object to paths on export (EPS)"),
      NULL},
 
+    {"export-embed-fonts", 'F',
+     POPT_ARG_NONE, &sp_export_font, SP_ARG_EXPORT_FONT,
+     N_("Embed fonts on export (Type 1 only) (EPS)"),
+     NULL},
+
     {"export-bbox-page", 'B',
      POPT_ARG_NONE, &sp_export_bbox_page, SP_ARG_EXPORT_BBOX_PAGE,
      N_("Export files with the bounding box set to the page size (EPS)"),
@@ -350,16 +359,26 @@ struct poptOption options[] = {
      N_("Print out the extension directory and exit"),
      NULL},
 
-    {"slideshow", 's',
-     POPT_ARG_NONE, &sp_global_slideshow, SP_ARG_SLIDESHOW,
-     N_("Show given files one-by-one, switch to next on any key/mouse event"),
-     NULL},
-
     {"vacuum-defs", 0,
      POPT_ARG_NONE, &sp_vacuum_defs, SP_ARG_VACUUM_DEFS,
      N_("Remove unused definitions from the defs section(s) of the document"),
      NULL},
 
+    {"verb-list", 0,
+     POPT_ARG_NONE, NULL, SP_ARG_VERB_LIST,
+     N_("List the IDs of all the verbs in Inkscape"),
+     NULL},
+
+    {"verb", 0,
+     POPT_ARG_STRING, NULL, SP_ARG_VERB,
+     N_("Verb to call when Inkscape opens."),
+     N_("VERB-ID")},
+
+    {"select", 0,
+     POPT_ARG_STRING, NULL, SP_ARG_SELECT,
+     N_("Object ID to select when Inkscape opens."),
+     N_("OBJECT-ID")},
+
     POPT_AUTOHELP POPT_TABLEEND
 };
 
@@ -390,6 +409,12 @@ main(int argc, char **argv)
     bindtextdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
 #endif
 #endif
+    // Allow the user to override the locale directory by setting 
+    // the environment variable INKSCAPE_LOCALEDIR.
+    char *inkscape_localedir = getenv("INKSCAPE_LOCALEDIR");
+    if (inkscape_localedir != NULL) {
+        bindtextdomain(GETTEXT_PACKAGE, inkscape_localedir);
+    }
 #endif
 
     bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
@@ -595,6 +620,34 @@ int sp_common_main( int argc, char const **argv, GSList **flDest )
     return 0;
 }
 
+static void
+snooper(GdkEvent *event, gpointer data) { 
+    if(inkscape_mapalt())  /* returns the map of the keyboard modifier to map to Alt, zero if no mapping */
+    {
+        GdkModifierType mapping=(GdkModifierType)inkscape_mapalt();
+        switch (event->type) {
+            case GDK_MOTION_NOTIFY:
+                if(event->motion.state & mapping) {
+                    event->motion.state|=GDK_MOD1_MASK;
+                }
+                break;       
+            case GDK_BUTTON_PRESS:
+                if(event->button.state & mapping) {
+                    event->button.state|=GDK_MOD1_MASK;
+                }
+                break;       
+             case GDK_KEY_PRESS:
+                 if(event->key.state & mapping) {
+                     event->key.state|=GDK_MOD1_MASK;
+                 }
+                 break;                
+        default:
+            break;
+        }
+    }
+    gtk_main_do_event (event);
+}
+
 int
 sp_main_gui(int argc, char const **argv)
 {
@@ -606,6 +659,10 @@ sp_main_gui(int argc, char const **argv)
 
     inkscape_gtk_stock_init();
 
+    gdk_event_handler_set((GdkEventFunc)snooper, NULL, NULL);
+
+    Inkscape::Debug::log_display_config();
+
     /* Set default icon */
     gchar *filename = (gchar *) g_build_filename (INKSCAPE_APPICONDIR, "inkscape.png", NULL);
     if (Inkscape::IO::file_test(filename, (GFileTest)(G_FILE_TEST_IS_REGULAR | G_FILE_TEST_IS_SYMLINK))) {
@@ -614,34 +671,22 @@ sp_main_gui(int argc, char const **argv)
     g_free (filename);
     filename = 0;
 
-    if (!sp_global_slideshow) {
-        gboolean create_new = TRUE;
+    gboolean create_new = TRUE;
 
-        /// \todo FIXME BROKEN - non-UTF-8 sneaks in here.
-        inkscape_application_init(argv[0], true);
+    /// \todo FIXME BROKEN - non-UTF-8 sneaks in here.
+    inkscape_application_init(argv[0], true);
 
-        while (fl) {
-            if (sp_file_open((gchar *)fl->data,NULL)) {
-                create_new=FALSE;
-            }
-            fl = g_slist_remove(fl, fl->data);
-        }
-        if (create_new) {
-            sp_file_new_default();
-        }
-    } else {
-        if (fl) {
-            GtkWidget *ss;
-            /// \todo FIXME BROKEN - non-UTF-8 sneaks in here.
-            inkscape_application_init(argv[0], true);
-            ss = sp_slideshow_new(fl);
-            if (ss) gtk_widget_show(ss);
-        } else {
-            g_warning ("No slides to display");
-            exit(0);
+    while (fl) {
+        if (sp_file_open((gchar *)fl->data,NULL)) {
+            create_new=FALSE;
         }
+        fl = g_slist_remove(fl, fl->data);
+    }
+    if (create_new) {
+        sp_file_new_default();
     }
 
+    Glib::signal_idle().connect(sigc::ptr_fun(&Inkscape::CmdLineAction::idle));
     main_instance.run();
 
 #ifdef WIN32
@@ -724,6 +769,7 @@ sp_main_console(int argc, char const **argv)
                 do_query_dimension (doc, false, sp_query_x? NR::X : NR::Y, sp_query_id);
             }
         }
+
         fl = g_slist_remove(fl, fl->data);
     }
 
@@ -755,15 +801,20 @@ do_query_dimension (SPDocument *doc, bool extent, NR::Dim2 const axis, const gch
     if (o) {
         sp_document_ensure_up_to_date (doc);
         SPItem *item = ((SPItem *) o);
-        NR::Rect area = item->invokeBbox(sp_item_i2doc_affine(item)); // "true" SVG bbox for scripting
 
-        Inkscape::SVGOStringStream os;
-        if (extent) {
-            os << area.extent(axis);
+        // "true" SVG bbox for scripting
+        NR::Maybe<NR::Rect> area = item->getBounds(sp_item_i2doc_affine(item));
+        if (area) {
+            Inkscape::SVGOStringStream os;
+            if (extent) {
+                os << area->extent(axis);
+            } else {
+                os << area->min()[axis];
+            }
+            g_print ("%s", os.str().c_str());
         } else {
-            os << area.min()[axis];
+            g_print("0");
         }
-        g_print ("%s", os.str().c_str());
     }
 }
 
@@ -994,6 +1045,7 @@ static void do_export_ps(SPDocument* doc, gchar const* uri, char const* mime)
     }
 
     bool old_text_to_path = false;
+    bool old_font_embedded = false;
     bool old_bbox_page = false;
 
     try {
@@ -1004,6 +1056,14 @@ static void do_export_ps(SPDocument* doc, gchar const* uri, char const* mime)
         g_warning ("Could not set export-text-to-path option for this export.");
     }
 
+    try {
+        old_font_embedded = (*i)->get_param_bool("fontEmbedded");
+        (*i)->set_param_bool("fontEmbedded", sp_export_font);
+    }
+    catch (...) {
+        g_warning ("Could not set export-font option for this export.");
+    }
+
     try {
         old_bbox_page = (*i)->get_param_bool("pageBoundingBox");
         (*i)->set_param_bool("pageBoundingBox", sp_export_bbox_page);
@@ -1016,6 +1076,7 @@ static void do_export_ps(SPDocument* doc, gchar const* uri, char const* mime)
 
     try {
         (*i)->set_param_bool("textToPath", old_text_to_path);
+        (*i)->set_param_bool("fontEmbedded", old_font_embedded);
         (*i)->set_param_bool("pageBoundingBox", old_bbox_page);
     }
     catch (...) {
@@ -1348,6 +1409,25 @@ sp_process_args(poptContext ctx)
                 exit(0);
                 break;
             }
+            case SP_ARG_VERB_LIST: {
+                // This really shouldn't go here, we should init the app.
+                // But, since we're just exiting in this path, there is
+                // no harm, and this is really a better place to put
+                // everything else.
+                Inkscape::Extension::init();
+                Inkscape::Verb::list();
+                exit(0);
+                break;
+            }
+            case SP_ARG_VERB:
+            case SP_ARG_SELECT: {
+                gchar const *arg = poptGetOptArg(ctx);
+                if (arg != NULL) {
+                    // printf("Adding in: %s\n", arg);
+                    new Inkscape::CmdLineAction((a == SP_ARG_VERB), arg);
+                }
+                break;
+            }
             default: {
                 break;
             }