Remove internal edit mode and add "content" tool.
[ardour.git] / gtk2_ardour / lv2_plugin_ui.cc
index 0c4ea8f0d9b74521771e32ae73f371965a904a56..9f6f650f56fabc93b50fcf1aaa95968fa3f50530 100644 (file)
@@ -56,9 +56,13 @@ LV2PluginUI::write_from_ui(void*       controller,
                if (ac) {
                        ac->set_value(*(const float*)buffer);
                }
-       } else if (format == me->_lv2->atom_eventTransfer()) {
-               me->_lv2->write_from_ui(port_index, format, buffer_size,
-                                       (const uint8_t*)buffer);
+       } else if (format == URIMap::instance().urids.atom_eventTransfer) {
+
+               const int cnt = me->_pi->get_count();
+               for (int i=0; i < cnt; i++ ) {
+                       boost::shared_ptr<LV2Plugin> lv2i = boost::dynamic_pointer_cast<LV2Plugin> (me->_pi->plugin(i));
+                       lv2i->write_from_ui(port_index, format, buffer_size, (const uint8_t*)buffer);
+               }
        }
 }
 
@@ -109,6 +113,7 @@ LV2PluginUI::update_timeout()
 void
 LV2PluginUI::on_external_ui_closed(void* controller)
 {
+       //printf("LV2PluginUI::on_external_ui_closed\n");
        LV2PluginUI* me = (LV2PluginUI*)controller;
        me->_screen_update_connection.disconnect();
        me->_external_ui_ptr = NULL;
@@ -140,7 +145,7 @@ LV2PluginUI::start_updating(GdkEventAny*)
 {
        if (!_output_ports.empty()) {
                _screen_update_connection.disconnect();
-               _screen_update_connection = ARDOUR_UI::instance()->RapidScreenUpdate.connect
+               _screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect
                        (sigc::mem_fun(*this, &LV2PluginUI::output_update));
        }
        return false;
@@ -163,6 +168,19 @@ LV2PluginUI::output_update()
        //cout << "output_update" << endl;
        if (_external_ui_ptr) {
                LV2_EXTERNAL_UI_RUN(_external_ui_ptr);
+               if (_lv2->is_external_kx() && !_external_ui_ptr) {
+                       // clean up external UI if it closes itself via
+                       // on_external_ui_closed() during run()
+                       //printf("LV2PluginUI::output_update -- UI was closed\n");
+                       //_screen_update_connection.disconnect();
+                       _message_update_connection.disconnect();
+                       if (_inst) {
+                               suil_instance_free((SuilInstance*)_inst);
+                       }
+                       _inst = NULL;
+                       _external_ui_ptr = NULL;
+                       return;
+               }
        }
 
        /* FIXME only works with control output ports (which is all we support now anyway) */
@@ -177,13 +195,22 @@ LV2PluginUI::output_update()
 LV2PluginUI::LV2PluginUI(boost::shared_ptr<PluginInsert> pi,
                          boost::shared_ptr<LV2Plugin>    lv2p)
        : PlugUIBase(pi)
+       , _pi(pi)
        , _lv2(lv2p)
        , _gui_widget(NULL)
-       , _ardour_buttons_box(NULL)
        , _values(NULL)
        , _external_ui_ptr(NULL)
        , _inst(NULL)
 {
+       _ardour_buttons_box.set_spacing (6);
+       _ardour_buttons_box.set_border_width (6);
+       _ardour_buttons_box.pack_end (focus_button, false, false);
+       _ardour_buttons_box.pack_end (bypass_button, false, false, 10);
+       _ardour_buttons_box.pack_end (delete_button, false, false);
+       _ardour_buttons_box.pack_end (save_button, false, false);
+       _ardour_buttons_box.pack_end (add_button, false, false);
+       _ardour_buttons_box.pack_end (_preset_combo, false, false);
+       _ardour_buttons_box.pack_end (_preset_modified, false, false);
 }
 
 void
@@ -205,27 +232,24 @@ LV2PluginUI::lv2ui_instantiate(const std::string& title)
                _external_ui_feature.URI  = LV2_EXTERNAL_UI_URI;
                _external_ui_feature.data = &_external_ui_host;
 
+               _external_kxui_feature.URI  = LV2_EXTERNAL_UI_KX__Host;
+               _external_kxui_feature.data = &_external_ui_host;
+
                ++features_count;
                features = (LV2_Feature**)malloc(
-                       sizeof(LV2_Feature*) * (features_count + 1));
-               for (size_t i = 0; i < features_count - 1; ++i) {
+                       sizeof(LV2_Feature*) * (features_count + 2));
+               for (size_t i = 0; i < features_count - 2; ++i) {
                        features[i] = features_src[i];
                }
+               features[features_count - 2] = &_external_kxui_feature;
                features[features_count - 1] = &_external_ui_feature;
                features[features_count]     = NULL;
        } else {
-               _ardour_buttons_box = manage (new Gtk::HBox);
-               _ardour_buttons_box->set_spacing (6);
-               _ardour_buttons_box->set_border_width (6);
-               _ardour_buttons_box->pack_end (focus_button, false, false);
-               _ardour_buttons_box->pack_end (bypass_button, false, false, 10);
-               _ardour_buttons_box->pack_end (delete_button, false, false);
-               _ardour_buttons_box->pack_end (save_button, false, false);
-               _ardour_buttons_box->pack_end (add_button, false, false);
-               _ardour_buttons_box->pack_end (_preset_combo, false, false);
-               _ardour_buttons_box->pack_end (_preset_modified, false, false);
-               _ardour_buttons_box->show_all();
-               pack_start(*_ardour_buttons_box, false, false);
+               if (_ardour_buttons_box.get_parent()) {
+                       _ardour_buttons_box.get_parent()->remove(_ardour_buttons_box);
+               }
+               pack_start(_ardour_buttons_box, false, false);
+               _ardour_buttons_box.show_all();
 
                _gui_widget = Gtk::manage((container = new Gtk::Alignment()));
                pack_start(*_gui_widget, true, true);
@@ -254,6 +278,10 @@ LV2PluginUI::lv2ui_instantiate(const std::string& title)
                ? NS_UI "external"
                : NS_UI "GtkUI";
 
+       if (_lv2->has_message_output()) {
+               _lv2->enable_ui_emission();
+       }
+
        const LilvUI* ui = (const LilvUI*)_lv2->c_ui();
        _inst = suil_instance_new(
                ui_host,
@@ -316,8 +344,7 @@ LV2PluginUI::lv2ui_instantiate(const std::string& title)
        }
 
        if (_lv2->has_message_output()) {
-               _lv2->enable_ui_emmission();
-               ARDOUR_UI::instance()->RapidScreenUpdate.connect(
+               _message_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect(
                        sigc::mem_fun(*this, &LV2PluginUI::update_timeout));
        }
 }
@@ -344,17 +371,14 @@ LV2PluginUI::~LV2PluginUI ()
                delete[] _values;
        }
 
-       /* Close and delete GUI. */
-       lv2ui_free();
-
+       _message_update_connection.disconnect();
        _screen_update_connection.disconnect();
 
-       if (_lv2->is_external_ui()) {
-               /* External UI is no longer valid.
-                  on_window_hide() will not try to use it if is NULL.
-               */
-               _external_ui_ptr = NULL;
+       if (_external_ui_ptr && _lv2->is_external_kx()) {
+               LV2_EXTERNAL_UI_HIDE(_external_ui_ptr);
        }
+       lv2ui_free();
+       _external_ui_ptr = NULL;
 }
 
 int
@@ -417,7 +441,15 @@ LV2PluginUI::on_window_show(const std::string& title)
 
        if (_lv2->is_external_ui()) {
                if (_external_ui_ptr) {
+                       _screen_update_connection.disconnect();
+                       _message_update_connection.disconnect();
                        LV2_EXTERNAL_UI_SHOW(_external_ui_ptr);
+                       _screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect
+                       (sigc::mem_fun(*this, &LV2PluginUI::output_update));
+                       if (_lv2->has_message_output()) {
+                               _message_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect(
+                                       sigc::mem_fun(*this, &LV2PluginUI::update_timeout));
+                       }
                        return false;
                }
                lv2ui_instantiate(title);
@@ -425,10 +457,15 @@ LV2PluginUI::on_window_show(const std::string& title)
                        return false;
                }
 
-               LV2_EXTERNAL_UI_SHOW(_external_ui_ptr);
                _screen_update_connection.disconnect();
-               _screen_update_connection = ARDOUR_UI::instance()->RapidScreenUpdate.connect
-                       (sigc::mem_fun(*this, &LV2PluginUI::output_update));
+               _message_update_connection.disconnect();
+               LV2_EXTERNAL_UI_SHOW(_external_ui_ptr);
+               _screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect
+                       (sigc::mem_fun(*this, &LV2PluginUI::output_update));
+               if (_lv2->has_message_output()) {
+                       _message_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect(
+                               sigc::mem_fun(*this, &LV2PluginUI::update_timeout));
+               }
                return false;
        } else {
                lv2ui_instantiate("gtk2gui");
@@ -440,13 +477,17 @@ LV2PluginUI::on_window_show(const std::string& title)
 void
 LV2PluginUI::on_window_hide()
 {
-       //cout << "on_window_hide" << endl; flush(cout);
+       //printf("LV2PluginUI::on_window_hide\n");
 
-       if (_external_ui_ptr) {
+       if (_lv2->is_external_ui()) {
+               if (!_external_ui_ptr) { return; }
                LV2_EXTERNAL_UI_HIDE(_external_ui_ptr);
-               //slv2_ui_instance_get_descriptor(_inst)->cleanup(_inst);
-               //_external_ui_ptr = NULL;
-               //_screen_update_connection.disconnect();
+               if (!_lv2->is_external_kx()) { return ; }
+               _message_update_connection.disconnect();
+               _screen_update_connection.disconnect();
+               _external_ui_ptr = NULL;
+               suil_instance_free((SuilInstance*)_inst);
+               _inst = NULL;
        } else {
                lv2ui_free();
        }