Improve single-threaded operation. It's now safe(r?) to close a canvas while it...
authordooglus <dooglus@1f10aa63-cdf2-0310-b900-c93c546f37ac>
Fri, 12 Oct 2007 14:43:52 +0000 (14:43 +0000)
committerdooglus <dooglus@1f10aa63-cdf2-0310-b900-c93c546f37ac>
Fri, 12 Oct 2007 14:43:52 +0000 (14:43 +0000)
git-svn-id: http://svn.voria.com/code@913 1f10aa63-cdf2-0310-b900-c93c546f37ac

synfig-studio/trunk/src/gtkmm/canvasview.cpp
synfig-studio/trunk/src/gtkmm/canvasview.h
synfig-studio/trunk/src/gtkmm/workarea.cpp
synfig-studio/trunk/src/gtkmm/workarea.h

index 9f4860e..14419be 100644 (file)
@@ -3526,10 +3526,12 @@ static bool _close_instance(etl::handle<Instance> instance)
 }
 
 bool
-CanvasView::on_delete_event(GdkEventAny* event)
+CanvasView::close_instance_when_safe()
 {
+       if (get_work_area()->get_updating())
+               return true;
+
        if(get_instance()->get_visible_canvases()==1)
-       {
                // Schedule a close to occur in a few moments
                Glib::signal_timeout().connect(
                        sigc::bind(
@@ -3538,8 +3540,24 @@ CanvasView::on_delete_event(GdkEventAny* event)
                        )
                        ,250
                );
+
+       return false;
+}
+
+bool
+CanvasView::on_delete_event(GdkEventAny* event)
+{
+       if (get_work_area()->get_updating())
+       {
+               get_work_area()->stop_updating(true); // stop and mark as cancelled
+
+               // give the workarea chances to stop updating
+               Glib::signal_timeout().connect(sigc::mem_fun(*this, &CanvasView::close_instance_when_safe) ,250);
+               return true;
        }
 
+       close_instance_when_safe();
+
        //! \todo This causes the window to be deleted straight away - but what if we prompt 'save?' and the user cancels?
        //                Is there ever any need to pass on the delete event to the window here?
        // if(event) return Gtk::Window::on_delete_event(event);
index b934fd4..f1c1d78 100644 (file)
@@ -678,6 +678,7 @@ private:
        bool on_audio_scrub();
 
 protected:
+       bool close_instance_when_safe();
        bool on_delete_event(GdkEventAny* event);
 
        /*
index 54216f3..abdf30c 100644 (file)
@@ -810,6 +810,19 @@ WorkArea::~WorkArea()
                render_idle_func_id=0;
 }
 
+bool
+WorkArea::get_updating()const
+{
+       return App::single_threaded && async_renderer && async_renderer->updating == true;
+}
+
+void
+WorkArea::stop_updating(bool cancel)
+{
+       async_renderer->stop();
+       if (cancel) canceled_=true;
+}
+
 void
 WorkArea::save_meta_data()
 {
@@ -2174,9 +2187,9 @@ public:
 bool
 studio::WorkArea::async_update_preview()
 {
-       if (single_threaded() && async_renderer && async_renderer->updating == true)
+       if (get_updating())
        {
-               async_renderer->stop();
+               stop_updating();
                return false;
        }
 
index 3b6ecae..8769789 100644 (file)
@@ -258,6 +258,8 @@ public:
        bool get_canceled()const { return canceled_; }
        bool get_queued()const { return queued; }
        bool get_rendering()const { return rendering; }
+       bool get_updating()const;
+       void stop_updating(bool cancel = false);
        bool get_full_frame()const { return full_frame; }
        //int get_w()const { return w; }
        //int get_h()const { return h; }