Fix the crash that the previous commit half-fixed.
[synfig.git] / synfig-studio / trunk / src / gtkmm / workarea.cpp
index a6ca612..dce50cd 100644 (file)
@@ -800,6 +800,15 @@ WorkArea::WorkArea(etl::loose_handle<synfigapp::CanvasInterface> canvas_interfac
 WorkArea::~WorkArea()
 {
 //     delete [] buffer;
+
+       // don't leave the render function queued if we are about to vanish;
+       // that causes crashes
+       if(render_idle_func_id)
+       {
+               synfig::info("g_source_remove() returns %d", g_source_remove(render_idle_func_id));
+               render_idle_func_id=0;
+       } else
+               synfig::info("no render_idle_func_id to clear\n");
 }
 
 void
@@ -2048,7 +2057,6 @@ WorkArea::refresh(GdkEventExpose*event)
                }
        }
 
-
        // Calculate the window coordinates of the top-left
        // corner of the canvas.
        //const synfig::Vector::value_type
@@ -2062,11 +2070,10 @@ WorkArea::refresh(GdkEventExpose*event)
 
        Glib::RefPtr<Gdk::GC> gc=Gdk::GC::create(drawing_area->get_window());
 
-
-
        // If we are in animate mode, draw a red border around the screen
        if(canvas_interface->get_mode()&synfigapp::MODE_ANIMATE)
        {
+// #define USE_FRAME_BACKGROUND_TO_SHOW_EDIT_MODE
 #ifdef USE_FRAME_BACKGROUND_TO_SHOW_EDIT_MODE
                // This method of drawing the red border doesn't work on any
                // Gtk theme which uses the crux-engine, hcengine, industrial,
@@ -2084,10 +2091,10 @@ WorkArea::refresh(GdkEventExpose*event)
                        drawing_area->get_width()-1,drawing_area->get_height()-1); // w,h
 #endif
        }
+#ifdef USE_FRAME_BACKGROUND_TO_SHOW_EDIT_MODE
        else
                drawing_frame->unset_bg(Gtk::STATE_NORMAL);
-
-
+#endif
 
        previous_focus=get_focus_point();
 
@@ -2499,9 +2506,11 @@ studio::WorkArea::zoom_norm()
 gboolean
 studio::WorkArea::__render_preview(gpointer data)
 {
-
        WorkArea *work_area(static_cast<WorkArea*>(data));
 
+       // there's no point anyone trying to cancel the timer now - it's gone off already
+       work_area->render_idle_func_id = 0;
+
        work_area->queued=false;
        work_area->async_render_preview(work_area->get_canvas_view()->get_time());