Fix crash on failed processor DnD. Fixes #3554.
authorCarl Hetherington <carl@carlh.net>
Wed, 24 Nov 2010 00:46:51 +0000 (00:46 +0000)
committerCarl Hetherington <carl@carlh.net>
Wed, 24 Nov 2010 00:46:51 +0000 (00:46 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@8079 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/processor_box.cc
gtk2_ardour/processor_box.h

index 0109a36cea62f2430ac496680709efda3f9a1abf..c4849c9fc36192ab2d69c97933b8e774f7cf29bd 100644 (file)
@@ -1064,32 +1064,42 @@ ProcessorBox::compute_processor_sort_keys ()
        }
 
        if (_route->reorder_processors (our_processors)) {
+               /* Reorder failed, so report this to the user.  As far as I can see this must be done
+                  in an idle handler: it seems that the redisplay_processors() that happens below destroys
+                  widgets that were involved in the drag-and-drop on the processor list, which causes problems
+                  when the drag is torn down after this handler function is finished.
+               */
+               Glib::signal_idle().connect_once (sigc::mem_fun (*this, &ProcessorBox::report_failed_reorder));
+       }
+}
 
-               /* reorder failed, so redisplay */
-
-               redisplay_processors ();
-
-               /* now tell them about the problem */
-
-               ArdourDialog dialog (_("Plugin Incompatibility"));
-               Label label;
-
-               label.set_text (_("\
+void
+ProcessorBox::report_failed_reorder ()
+{
+       /* reorder failed, so redisplay */
+       
+       redisplay_processors ();
+       
+       /* now tell them about the problem */
+       
+       ArdourDialog dialog (_("Plugin Incompatibility"));
+       Label label;
+       
+       label.set_text (_("\
 You cannot reorder these plugins/sends/inserts\n\
 in that way because the inputs and\n\
 outputs will not work correctly."));
 
-               dialog.get_vbox()->set_border_width (12);
-               dialog.get_vbox()->pack_start (label);
-               dialog.add_button (Stock::OK, RESPONSE_ACCEPT);
-
-               dialog.set_name (X_("PluginIODialog"));
-               dialog.set_position (Gtk::WIN_POS_MOUSE);
-               dialog.set_modal (true);
-               dialog.show_all ();
-
-               dialog.run ();
-       }
+       dialog.get_vbox()->set_border_width (12);
+       dialog.get_vbox()->pack_start (label);
+       dialog.add_button (Stock::OK, RESPONSE_ACCEPT);
+       
+       dialog.set_name (X_("PluginIODialog"));
+       dialog.set_position (Gtk::WIN_POS_MOUSE);
+       dialog.set_modal (true);
+       dialog.show_all ();
+       
+       dialog.run ();
 }
 
 void
index 971ad401768162631f27e764f3a2c7b64a7b4aff..785809e1421d02210cec6af13d4f7370a7efe2ed 100644 (file)
@@ -244,6 +244,7 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
        void redisplay_processors ();
        void add_processor_to_display (boost::weak_ptr<ARDOUR::Processor>);
        void reordered ();
+       void report_failed_reorder ();
        void route_processors_changed (ARDOUR::RouteProcessorChange);
 
        void processors_reordered (const Gtk::TreeModel::Path&, const Gtk::TreeModel::iterator&, int*);