/*
- Copyright (C) 2008 Paul Davis
+ Copyright (C) 2008 Paul Davis
Author: Dave Robillard
This program is free software; you can redistribute it and/or modify
#include "ardour/lv2_plugin.h"
#include "ardour_ui.h"
+#include "gui_thread.h"
#include "lv2_plugin_ui.h"
using namespace Gtk;
using namespace ARDOUR;
using namespace PBD;
-std::vector<struct lv2_external_ui*> g_external_uis;
-
-void close_external_ui_windows()
-{
- struct lv2_external_ui* external_ui_ptr;
-
- //cout << "close_external_ui_windows" << endl;
-
- while (!g_external_uis.empty()) {
- //cout << "pop" << endl;
- external_ui_ptr = g_external_uis.back();
- LV2_EXTERNAL_UI_HIDE(external_ui_ptr);
- g_external_uis.pop_back();
- }
-}
-
void
LV2PluginUI::lv2_ui_write(
LV2UI_Controller controller,
void LV2PluginUI::on_external_ui_closed(LV2UI_Controller controller)
{
- //cout << "on_external_ui_closed" << endl;
-
LV2PluginUI* me = (LV2PluginUI*)controller;
me->_screen_update_connection.disconnect();
- //me->insert->set_gui(0);
-
- for (std::vector<struct lv2_external_ui*>::iterator it = g_external_uis.begin() ; it < g_external_uis.end(); it++) {
- if (*it == me->_external_ui_ptr) {
- g_external_uis.erase(it);
- }
- }
-
- //slv2_ui_instance_get_descriptor(me->_inst)->cleanup(me->_inst);
me->_external_ui_ptr = NULL;
}
void
LV2PluginUI::parameter_changed (uint32_t port_index, float val)
{
- //cout << "parameter_changed" << endl;
+ PlugUIBase::parameter_changed (port_index, val);
+
if (val != _values[port_index]) {
parameter_update(port_index, val);
}
{
if (!_output_ports.empty()) {
_screen_update_connection.disconnect();
- _screen_update_connection = ARDOUR_UI::instance()->RapidScreenUpdate.connect
- (mem_fun(*this, &LV2PluginUI::output_update));
+ _screen_update_connection = ARDOUR_UI::instance()->RapidScreenUpdate.connect
+ (sigc::mem_fun(*this, &LV2PluginUI::output_update));
}
return false;
}
uint32_t index = _output_ports[i];
parameter_changed(index, _lv2->get_parameter(index));
}
-
+
}
LV2PluginUI::LV2PluginUI (boost::shared_ptr<PluginInsert> pi, boost::shared_ptr<LV2Plugin> lv2p)
}
void
-LV2PluginUI::lv2ui_instantiate(const Glib::ustring& title)
+LV2PluginUI::lv2ui_instantiate(const std::string& title)
{
LV2_Feature** features;
LV2_Feature** features_src;
if (is_external_ui) {
free(features_dst);
}
-
+
uint32_t num_ports = slv2_plugin_get_num_ports(_lv2->slv2_plugin());
for (uint32_t i = 0; i < num_ports; ++i) {
if (_lv2->parameter_is_output(i) && _lv2->parameter_is_control(i) && is_update_wanted(i)) {
pack_start(*_gui_widget, true, true);
} else {
_external_ui_ptr = (struct lv2_external_ui *)slv2_ui_instance_get_widget(_inst);
- g_external_uis.push_back(_external_ui_ptr);
}
}
-
+
_values = new float[num_ports];
for (uint32_t i = 0; i < num_ports; ++i) {
bool ok;
}
}
}
-
- _lv2->ParameterChanged.connect(mem_fun(*this, &LV2PluginUI::parameter_changed));
}
LV2PluginUI::~LV2PluginUI ()
delete[] _values;
}
// plugin destructor destroys the GTK GUI
+
+
+ const LV2UI_Descriptor* ui_desc = slv2_ui_instance_get_descriptor(_inst);
+ LV2UI_Handle ui_handle = slv2_ui_instance_get_handle(_inst);
+
+ /*Call cleanup to tell the plugin to close its GUI and delete it*/
+
+ if (ui_desc) {
+ ui_desc->cleanup(ui_handle);
+ }
+
+ _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;
+ }
}
int
_win_ptr = &win;
} else {
/* forward configure events to plugin window */
- win.signal_configure_event().connect (mem_fun (*this, &LV2PluginUI::configure_handler));
- win.signal_map_event().connect (mem_fun (*this, &LV2PluginUI::start_updating));
- win.signal_unmap_event().connect (mem_fun (*this, &LV2PluginUI::stop_updating));
+ win.signal_configure_event().connect (sigc::mem_fun (*this, &LV2PluginUI::configure_handler));
+ win.signal_map_event().connect (sigc::mem_fun (*this, &LV2PluginUI::start_updating));
+ win.signal_unmap_event().connect (sigc::mem_fun (*this, &LV2PluginUI::stop_updating));
}
return 0;
}
}
bool
-LV2PluginUI::on_window_show(const Glib::ustring& title)
+LV2PluginUI::on_window_show(const std::string& title)
{
//cout << "on_window_show - " << title << endl; flush(cout);
LV2_EXTERNAL_UI_SHOW(_external_ui_ptr);
_screen_update_connection.disconnect();
- _screen_update_connection = ARDOUR_UI::instance()->RapidScreenUpdate.connect
- (mem_fun(*this, &LV2PluginUI::output_update));
+ _screen_update_connection = ARDOUR_UI::instance()->RapidScreenUpdate.connect
+ (sigc::mem_fun(*this, &LV2PluginUI::output_update));
return false;
}