diff options
author | Robin Gareus <robin@gareus.org> | 2015-11-02 05:15:55 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2015-11-02 05:15:55 +0100 |
commit | 160b24b13730ff84765e79975fab80a409a55e5e (patch) | |
tree | bb96bea82d45bfebfcf061c1d36d93d85ff87f92 | |
parent | 84d44eb5a3fd95f20f9c5e33ff8c05199dcccc38 (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.
-rw-r--r-- | libs/canvas/canvas.cc | 9 | ||||
-rw-r--r-- | libs/canvas/canvas/canvas.h | 3 |
2 files changed, 12 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 (); diff --git a/libs/canvas/canvas/canvas.h b/libs/canvas/canvas/canvas.h index 87e580e046..b818c7eb41 100644 --- a/libs/canvas/canvas/canvas.h +++ b/libs/canvas/canvas/canvas.h @@ -172,6 +172,7 @@ class LIBCANVAS_API GtkCanvas : public Canvas, public Gtk::EventBox { public: GtkCanvas (); + ~GtkCanvas () { _in_dtor = true ; } void request_redraw (Rect const &); void request_size (Duple); @@ -238,6 +239,8 @@ private: bool show_tooltip (); void hide_tooltip (); bool really_start_tooltip_timeout (); + + bool _in_dtor; }; /** A GTK::Alignment with a GtkCanvas inside it plus some Gtk::Adjustments for |