summaryrefslogtreecommitdiff
path: root/libs/canvas
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
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')
-rw-r--r--libs/canvas/canvas.cc9
-rw-r--r--libs/canvas/canvas/canvas.h3
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