add plugin parameter reset button - closes #6297
[ardour.git] / gtk2_ardour / lv2_plugin_ui.cc
index 07e8699ebc25dbdfc4b5666415d74cb0d198db66..d19c7e6f6f61133f2279f0ac7be2cd09d20f56fa 100644 (file)
@@ -21,8 +21,8 @@
 #include "ardour/session.h"
 #include "pbd/error.h"
 
-#include "ardour_ui.h"
 #include "lv2_plugin_ui.h"
+#include "timers.h"
 
 #include "lv2/lv2plug.in/ns/extensions/ui/ui.h"
 
@@ -56,7 +56,7 @@ LV2PluginUI::write_from_ui(void*       controller,
                if (ac) {
                        ac->set_value(*(const float*)buffer);
                }
-       } else if (format == me->_lv2->urids.atom_eventTransfer) {
+       } else if (format == URIMap::instance().urids.atom_eventTransfer) {
 
                const int cnt = me->_pi->get_count();
                for (int i=0; i < cnt; i++ ) {
@@ -145,7 +145,7 @@ LV2PluginUI::start_updating(GdkEventAny*)
 {
        if (!_output_ports.empty()) {
                _screen_update_connection.disconnect();
-               _screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect
+               _screen_update_connection = Timers::super_rapid_connect
                        (sigc::mem_fun(*this, &LV2PluginUI::output_update));
        }
        return false;
@@ -205,7 +205,8 @@ LV2PluginUI::LV2PluginUI(boost::shared_ptr<PluginInsert> pi,
        _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 (bypass_button, false, false, 4);
+       _ardour_buttons_box.pack_end (reset_button, false, false, 4);
        _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);
@@ -279,10 +280,27 @@ LV2PluginUI::lv2ui_instantiate(const std::string& title)
                : NS_UI "GtkUI";
 
        if (_lv2->has_message_output()) {
-               _lv2->enable_ui_emmission();
+               _lv2->enable_ui_emission();
+       }
+
+       const LilvUI*   ui     = (const LilvUI*)_lv2->c_ui();
+       const LilvNode* bundle = lilv_ui_get_bundle_uri(ui);
+       const LilvNode* binary = lilv_ui_get_binary_uri(ui);
+#ifdef HAVE_LILV_0_21_3
+       char* ui_bundle_path = lilv_file_uri_parse(lilv_node_as_uri(bundle), NULL);
+       char* ui_binary_path = lilv_file_uri_parse(lilv_node_as_uri(binary), NULL);
+#else
+       char* ui_bundle_path = strdup(lilv_uri_to_path(lilv_node_as_uri(bundle)));
+       char* ui_binary_path = strdup(lilv_uri_to_path(lilv_node_as_uri(binary)));
+#endif
+       if (!ui_bundle_path || !ui_binary_path) {
+               error << _("failed to get path for UI bindle or binary") << endmsg;
+               free(ui_bundle_path);
+               free(ui_binary_path);
+               free(features);
+               return;
        }
 
-       const LilvUI* ui = (const LilvUI*)_lv2->c_ui();
        _inst = suil_instance_new(
                ui_host,
                this,
@@ -290,10 +308,12 @@ LV2PluginUI::lv2ui_instantiate(const std::string& title)
                _lv2->uri(),
                lilv_node_as_uri(lilv_ui_get_uri(ui)),
                lilv_node_as_uri((const LilvNode*)_lv2->c_ui_type()),
-               lilv_uri_to_path(lilv_node_as_uri(lilv_ui_get_bundle_uri(ui))),
-               lilv_uri_to_path(lilv_node_as_uri(lilv_ui_get_binary_uri(ui))),
+               ui_bundle_path,
+               ui_binary_path,
                features);
 
+       free(ui_bundle_path);
+       free(ui_binary_path);
        free(features);
 
 #define GET_WIDGET(inst) suil_instance_get_widget((SuilInstance*)inst);
@@ -322,6 +342,8 @@ LV2PluginUI::lv2ui_instantiate(const std::string& title)
                                container->add(*Gtk::manage(Glib::wrap(c_widget)));
                        }
                        container->show_all();
+                       gtk_widget_set_can_focus(c_widget, true);
+                       gtk_widget_grab_focus(c_widget);
                } else {
                        _external_ui_ptr = (struct lv2_external_ui*)GET_WIDGET(_inst);
                }
@@ -344,11 +366,20 @@ LV2PluginUI::lv2ui_instantiate(const std::string& title)
        }
 
        if (_lv2->has_message_output()) {
-               _message_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect(
+               _message_update_connection = Timers::super_rapid_connect (
                        sigc::mem_fun(*this, &LV2PluginUI::update_timeout));
        }
 }
 
+void
+LV2PluginUI::grab_focus()
+{
+       if (_inst && !_lv2->is_external_ui()) {
+               GtkWidget* c_widget = (GtkWidget*)GET_WIDGET(_inst);
+               gtk_widget_grab_focus(c_widget);
+       }
+}
+
 void
 LV2PluginUI::lv2ui_free()
 {
@@ -444,10 +475,10 @@ LV2PluginUI::on_window_show(const std::string& title)
                        _screen_update_connection.disconnect();
                        _message_update_connection.disconnect();
                        LV2_EXTERNAL_UI_SHOW(_external_ui_ptr);
-                       _screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect
+                       _screen_update_connection = Timers::super_rapid_connect
                        (sigc::mem_fun(*this, &LV2PluginUI::output_update));
                        if (_lv2->has_message_output()) {
-                               _message_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect(
+                               _message_update_connection = Timers::super_rapid_connect (
                                        sigc::mem_fun(*this, &LV2PluginUI::update_timeout));
                        }
                        return false;
@@ -460,10 +491,10 @@ LV2PluginUI::on_window_show(const std::string& title)
                _screen_update_connection.disconnect();
                _message_update_connection.disconnect();
                LV2_EXTERNAL_UI_SHOW(_external_ui_ptr);
-               _screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect
+               _screen_update_connection = Timers::super_rapid_connect
                        (sigc::mem_fun(*this, &LV2PluginUI::output_update));
                if (_lv2->has_message_output()) {
-                       _message_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect(
+                       _message_update_connection = Timers::super_rapid_connect (
                                sigc::mem_fun(*this, &LV2PluginUI::update_timeout));
                }
                return false;