summaryrefslogtreecommitdiff
path: root/libs/canvas/canvas.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2015-11-02 05:15:55 +0100
committerRobin Gareus <robin@gareus.org>2015-11-02 05:15:55 +0100
commit160b24b13730ff84765e79975fab80a409a55e5e (patch)
treebb96bea82d45bfebfcf061c1d36d93d85ff87f92 /libs/canvas/canvas.cc
parent84d44eb5a3fd95f20f9c5e33ff8c05199dcccc38 (diff)
fix crash when cleaning up canvas items
Backport from Mixbus. In Ardour this does not currently matter since there is no top-level canvas destroyed top-down. ... Editor::session_going_away MixerStrip::~MixerStrip MixbusStripCanvas::~MixbusStripCanvas ArdourCanvas::GtkCanvas::~GtkCanvas ArdourCanvas::Canvas::~Canvas ArdourCanvas::Root::~Root ArdourCanvas::Container::~Container ArdourCanvas::Item::~Item ArdourCanvas::Item::clear_items GtkCanvas::item_going_away() queue_draw_item_area() ..expose can take place async to garbage collection: crash in one of the items.
Diffstat (limited to 'libs/canvas/canvas.cc')
-rw-r--r--libs/canvas/canvas.cc9
1 files changed, 9 insertions, 0 deletions
diff --git a/libs/canvas/canvas.cc b/libs/canvas/canvas.cc
index 0fcac6a317..6bf1959c67 100644
--- a/libs/canvas/canvas.cc
+++ b/libs/canvas/canvas.cc
@@ -389,6 +389,7 @@ GtkCanvas::GtkCanvas ()
, _single_exposure (1)
, current_tooltip_item (0)
, tooltip_window (0)
+ , _in_dtor (false)
{
/* these are the events we want to know about */
add_events (Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::POINTER_MOTION_MASK |
@@ -779,6 +780,10 @@ GtkCanvas::on_size_allocate (Gtk::Allocation& a)
bool
GtkCanvas::on_expose_event (GdkEventExpose* ev)
{
+ if (_in_dtor) {
+ return true;
+ }
+
#ifdef OPTIONAL_CAIRO_IMAGE_SURFACE
Cairo::RefPtr<Cairo::Context> draw_context;
Cairo::RefPtr<Cairo::Context> window_context;
@@ -1039,6 +1044,10 @@ GtkCanvas::on_leave_notify_event (GdkEventCrossing* ev)
void
GtkCanvas::request_redraw (Rect const & request)
{
+ if (_in_dtor) {
+ return;
+ }
+
Rect real_area;
Coord const w = width ();