X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftrunk%2Fsrc%2Fgtkmm%2Fworkarea.cpp;h=dce50cdd1ba55a45cdb4dc88f2f4859fcf1590b4;hb=5442b08724a36e90837ca46f17660c8b3031beeb;hp=01b9a0a328a41ddd33ecbda1f942f3098c7fa2f0;hpb=11c0abb278300f2c4439b538b300433078a19a78;p=synfig.git diff --git a/synfig-studio/trunk/src/gtkmm/workarea.cpp b/synfig-studio/trunk/src/gtkmm/workarea.cpp index 01b9a0a..dce50cd 100644 --- a/synfig-studio/trunk/src/gtkmm/workarea.cpp +++ b/synfig-studio/trunk/src/gtkmm/workarea.cpp @@ -800,6 +800,15 @@ WorkArea::WorkArea(etl::loose_handle 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,27 +2070,31 @@ WorkArea::refresh(GdkEventExpose*event) Glib::RefPtr 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) { - /*gc->set_rgb_fg_color(Gdk::Color("#FF0000")); +// #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, + // mist, or ubuntulooks engine, such as the default ubuntu + // 'Human' theme. + drawing_frame->modify_bg(Gtk::STATE_NORMAL,Gdk::Color("#FF0000")); +#else + // So let's do it in a more primitive fashion. + gc->set_rgb_fg_color(Gdk::Color("#FF0000")); gc->set_line_attributes(1,Gdk::LINE_SOLID,Gdk::CAP_BUTT,Gdk::JOIN_MITER); drawing_area->get_window()->draw_rectangle( gc, false, // Fill? 0,0, // x,y - drawing_area->get_width()-1,drawing_area->get_height()-1 //w,h - ); - */ - drawing_frame->modify_bg(Gtk::STATE_NORMAL,Gdk::Color("#FF0000")); - //get_window()->set_background(Gdk::Color("#FF0000")); + 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(); @@ -2318,7 +2330,6 @@ again: dirty=false; get_canvas_view()->reset_cancel_status(); - bool ret=false; RendDesc desc=get_canvas()->rend_desc(); //newdesc->set_flags(RendDesc::PX_ASPECT|RendDesc::IM_SPAN); @@ -2345,7 +2356,7 @@ again: if(cb) cb->task(strprintf("Rendering canvas %s...",get_canvas()->get_name().c_str())); - target->render(cb); + bool ret = target->render(cb); if(!ret && !get_canvas_view()->get_cancel_status() && dirty) { @@ -2495,9 +2506,11 @@ studio::WorkArea::zoom_norm() gboolean studio::WorkArea::__render_preview(gpointer data) { - WorkArea *work_area(static_cast(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());