Code

r16403@tres: ted | 2007-08-29 09:10:45 -0700
authorgouldtj <gouldtj@users.sourceforge.net>
Sat, 1 Sep 2007 04:33:48 +0000 (04:33 +0000)
committergouldtj <gouldtj@users.sourceforge.net>
Sat, 1 Sep 2007 04:33:48 +0000 (04:33 +0000)
 Fixed a tricky segmentation fault.  Multithreading is hard when you
 don't have threads :)

src/extension/execution-env.cpp
src/extension/execution-env.h
src/extension/prefdialog.cpp

index fcf60cdcbb3f6d8a61dff054ac3a675b3186fc4b..88cd1af7df30bef1cf00ce804dc64608702f7a90 100644 (file)
@@ -29,14 +29,15 @@ namespace Extension {
 
 
 ExecutionEnv::ExecutionEnv (Effect * effect, Inkscape::UI::View::View * doc, Gtk::Widget * controls, Gtk::Dialog * prefDialog) :
-    _effect(effect),
     _visibleDialog(NULL),
+    _effect(effect),
     _prefsVisible(false),
     _finished(false),
     _humanWait(false),
     _canceled(false),
     _prefsChanged(false),
     _livePreview(true),
+    _selfdelete(false),
     _doc(doc) {
 
     SPDesktop *desktop = (SPDesktop *)_doc;
@@ -49,7 +50,7 @@ ExecutionEnv::ExecutionEnv (Effect * effect, Inkscape::UI::View::View * doc, Gtk
             Glib::ustring selected_id;
             selected_id = SP_OBJECT_ID(*selected);
             _selected.insert(_selected.end(), selected_id);
-            //std::cout << "Selected: " << selected_id << std::endl;
+            std::cout << "Selected: " << selected_id << std::endl;
             ++selected;
         }
     }
@@ -110,7 +111,7 @@ ExecutionEnv::createPrefsDialog (Gtk::Widget * controls) {
 
 void
 ExecutionEnv::createWorkingDialog (void) {
-    printf("Create working dialog\n");
+    printf("Create working dialog.  doc: %X\n", _doc);
     if (_visibleDialog != NULL) {
         delete _visibleDialog;
     }
@@ -193,17 +194,28 @@ ExecutionEnv::documentCommit (void) {
 
 void
 ExecutionEnv::reselect (void) {
+    printf("A  doc: %X\n", _doc);
+    if (_doc == NULL) { return; }
     SPDocument * doc = _doc->doc();
+    if (doc == NULL) { return; }
 
+    printf("B  doc: %X\n", _doc);
     SPDesktop *desktop = (SPDesktop *)_doc;
     sp_namedview_document_from_window(desktop);
 
     if (desktop == NULL) { return; }
 
+    printf("C  doc: %X\n", _doc);
     Inkscape::Selection * selection = sp_desktop_selection(desktop);
 
+    printf("D  doc: %X\n", _doc);
     for (std::list<Glib::ustring>::iterator i = _selected.begin(); i != _selected.end(); i++) {
-        selection->add(doc->getObjectById(i->c_str()));
+        printf("E %s  doc: %X\n", i->c_str(), _doc);
+        SPObject * obj = doc->getObjectById(i->c_str());
+        printf("F %s  doc: %X\n", i->c_str(), _doc);
+        if (obj != NULL) {
+            selection->add(obj);
+        }
     }
 
     return;
@@ -221,11 +233,16 @@ ExecutionEnv::run (void) {
             processingComplete();
         }
         if (_canceled) {
+            printf("Canceling the document  doc: %X\n", _doc);
             sp_document_cancel(_doc->doc());
+            printf("Reselecting  doc: %X\n", _doc);
             reselect();
         }
     }
     printf("Execution environment done running\n");
+    if (_selfdelete) {
+        delete this;
+    }
     return;
 }
 
@@ -243,13 +260,19 @@ ExecutionEnv::livePreview (bool state) {
 }
 
 void
-ExecutionEnv::shutdown (void) { 
-    _mainloop->quit();
-    processingCancel();
+ExecutionEnv::shutdown (bool del) { 
+    printf("Shutting down Execution Environment\n");
+    if (_humanWait) {
+        _mainloop->quit();
+    } else {
+        processingCancel();
+    }
     documentCancel();
+
     _finished = true;
     _visibleDialog = NULL;
 }
+    _selfdelete = del;
 
     return;
 }
index a3938be3d3c608742ae726cd932b715c14fa733b..5758658f32662a19c6806dbe71672ce2bc69fdc4 100644 (file)
@@ -32,6 +32,7 @@ private:
     bool _canceled;
     bool _prefsChanged;
     bool _livePreview;
+    bool _selfdelete;
     Glib::RefPtr<Glib::MainLoop> _mainloop;
     Inkscape::UI::View::View * _doc;
     std::list<Glib::ustring> _selected;
@@ -46,7 +47,7 @@ public:
     void run (void);
     void preferencesChange (void);
     void livePreview (bool state = true);
-    void shutdown (void);
+    void shutdown (bool del = false);
 
 private:
     void createPrefsDialog (Gtk::Widget * controls);
index 62e6b9ff8965515ac5631be03dc4e12dfc3da96a..4676661b17273c8cab58ab3eb2a88aa7066ab1fa 100644 (file)
@@ -171,10 +171,7 @@ PrefDialog::pinned_toggle (void) {
         _button_cancel->set_label(Gtk::Stock::CLOSE.id);
 
         if (_exEnv != NULL) {
-            _exEnv->shutdown();
-            if (_createdExEnv) {
-                delete _exEnv;
-            }
+            _exEnv->shutdown(_createdExEnv);
             _exEnv = NULL;
         }
     } else {