+class ProcessorBox;
+
+/** A WindowProxy for Processor UI windows; it knows how to ask a ProcessorBox
+ * to create a UI window for a particular processor.
+ */
+class ProcessorWindowProxy : public WindowProxy<Gtk::Window>
+{
+public:
+ ProcessorWindowProxy (std::string const &, XMLNode const *, ProcessorBox *, boost::weak_ptr<ARDOUR::Processor>);
+
+ void show ();
+ bool rc_configured () const {
+ return false;
+ }
+
+ boost::weak_ptr<ARDOUR::Processor> processor () const {
+ return _processor;
+ }
+
+ bool marked;
+
+private:
+ ProcessorBox* _processor_box;
+ boost::weak_ptr<ARDOUR::Processor> _processor;
+};
+
+class ProcessorEntry : public Gtkmm2ext::DnDVBoxChild, public sigc::trackable
+{
+public:
+ ProcessorEntry (boost::shared_ptr<ARDOUR::Processor>, Width);
+
+ Gtk::EventBox& action_widget ();
+ Gtk::Widget& widget ();
+ std::string drag_text () const;
+ void set_visual_state (Gtkmm2ext::VisualState, bool);
+
+ enum Position {
+ PreFader,
+ Fader,
+ PostFader
+ };
+
+ void set_position (Position);
+ boost::shared_ptr<ARDOUR::Processor> processor () const;
+ void set_enum_width (Width);
+ virtual void set_pixel_width (int) {}
+
+ /** Hide any widgets that should be hidden */
+ virtual void hide_things () {}
+
+protected:
+ ArdourButton _button;
+ Gtk::VBox _vbox;
+ Position _position;
+
+ virtual void setup_visuals ();
+
+private:
+ void led_clicked();
+ void processor_active_changed ();
+ void processor_property_changed (const PBD::PropertyChange&);
+ std::string name (Width) const;
+ void setup_tooltip ();
+
+ boost::shared_ptr<ARDOUR::Processor> _processor;
+ Width _width;
+ Gtk::StateType _visual_state;
+ PBD::ScopedConnection active_connection;
+ PBD::ScopedConnection name_connection;
+};
+
+class SendProcessorEntry : public ProcessorEntry
+{
+public:
+ SendProcessorEntry (boost::shared_ptr<ARDOUR::Send>, Width);
+
+ static void setup_slider_pix ();
+
+ void set_enum_width (Width, int);
+ void set_pixel_width (int);
+
+private:
+ void show_gain ();
+ void gain_adjusted ();
+ void setup_gain_adjustment ();
+
+ boost::shared_ptr<ARDOUR::Send> _send;
+ Gtk::Adjustment _adjustment;
+ Gtkmm2ext::HSliderController _fader;
+ bool _ignore_gain_change;
+ PBD::ScopedConnectionList _send_connections;
+ ARDOUR::DataType _data_type;
+
+ static Glib::RefPtr<Gdk::Pixbuf> _slider;
+};
+
+class PluginInsertProcessorEntry : public ProcessorEntry
+{
+public:
+ PluginInsertProcessorEntry (boost::shared_ptr<ARDOUR::PluginInsert>, Width);
+
+ void hide_things ();
+
+private:
+ void setup_visuals ();
+ void plugin_insert_splitting_changed ();
+
+ /* XXX: this seems a little ridiculous just for a simple scaleable icon */
+ class SplittingIcon : public Gtk::DrawingArea {
+ private:
+ bool on_expose_event (GdkEventExpose *);
+ };
+
+ boost::shared_ptr<ARDOUR::PluginInsert> _plugin_insert;
+ SplittingIcon _splitting_icon;
+ PBD::ScopedConnection _splitting_connection;
+};
+
+class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARDOUR::SessionHandlePtr