Code

adapt code to new Maybe/bbox regime
[inkscape.git] / src / main.cpp
index c5d9256bfb8329310dce3df1c105ff58d32f57a3..dff671c638650b8f42ff98cfb9bd7a271df39d85 100644 (file)
@@ -108,6 +108,8 @@ using Inkscape::Extension::Internal::PrintWin32;
 
 #include "application/application.h"
 
+#include "main-cmdlineact.h"
+
 enum {
     SP_ARG_NONE,
     SP_ARG_NOGUI,
@@ -144,6 +146,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
 };
 
@@ -366,6 +371,21 @@ struct poptOption options[] = {
      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
 };
 
@@ -654,6 +674,7 @@ sp_main_gui(int argc, char const **argv)
         }
     }
 
+    Glib::signal_idle().connect(sigc::ptr_fun(&Inkscape::CmdLineAction::idle));
     main_instance.run();
 
 #ifdef WIN32
@@ -736,6 +757,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);
     }
 
@@ -767,15 +789,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->getBounds(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());
     }
 }
 
@@ -1370,6 +1397,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;
             }