summaryrefslogtreecommitdiffstats
path: root/src/client/PluginUI.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/PluginUI.cpp')
-rw-r--r--src/client/PluginUI.cpp119
1 files changed, 64 insertions, 55 deletions
diff --git a/src/client/PluginUI.cpp b/src/client/PluginUI.cpp
index a997d716..c4aa748f 100644
--- a/src/client/PluginUI.cpp
+++ b/src/client/PluginUI.cpp
@@ -14,33 +14,44 @@
along with Ingen. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "ingen/client/PluginUI.hpp"
-
-#include "ingen/Interface.hpp"
-#include "ingen/Log.hpp"
-#include "ingen/URIs.hpp"
-#include "ingen/client/BlockModel.hpp"
-#include "ingen/client/PortModel.hpp"
-#include "lv2/atom/atom.h"
-#include "lv2/ui/ui.h"
+#include <ingen/client/PluginUI.hpp>
+
+#include <ingen/Atom.hpp>
+#include <ingen/Forge.hpp>
+#include <ingen/LV2Features.hpp>
+#include <ingen/Log.hpp>
+#include <ingen/Resource.hpp>
+#include <ingen/URI.hpp>
+#include <ingen/URIs.hpp>
+#include <ingen/World.hpp>
+#include <ingen/client/BlockModel.hpp>
+#include <ingen/client/PortModel.hpp>
+#include <lilv/lilv.h>
+#include <lv2/atom/atom.h>
+#include <lv2/core/lv2.h>
+#include <lv2/ui/ui.h>
+#include <raul/Symbol.hpp>
+#include <suil/suil.h>
+
+#include <sigc++/signal.h>
#include <cstring>
+#include <memory>
#include <string>
#include <utility>
-namespace ingen {
-namespace client {
+namespace ingen::client {
SuilHost* PluginUI::ui_host = nullptr;
-static SPtr<const PortModel>
+static std::shared_ptr<const PortModel>
get_port(PluginUI* ui, uint32_t port_index)
{
if (port_index >= ui->block()->ports().size()) {
ui->world().log().error("%1% UI tried to access invalid port %2%\n",
ui->block()->plugin()->uri().c_str(),
port_index);
- return SPtr<const PortModel>();
+ return nullptr;
}
return ui->block()->ports()[port_index];
}
@@ -52,9 +63,9 @@ lv2_ui_write(SuilController controller,
uint32_t format,
const void* buffer)
{
- PluginUI* const ui = (PluginUI*)controller;
- const URIs& uris = ui->world().uris();
- SPtr<const PortModel> port = get_port(ui, port_index);
+ auto* const ui = static_cast<PluginUI*>(controller);
+ const URIs& uris = ui->world().uris();
+ auto port = get_port(ui, port_index);
if (!port) {
return;
}
@@ -67,10 +78,10 @@ lv2_ui_write(SuilController controller,
ui->block()->plugin()->uri().c_str());
return;
}
- const float value = *(const float*)buffer;
+ const float value = *static_cast<const float*>(buffer);
if (port->value().type() == uris.atom_Float &&
value == port->value().get<float>()) {
- return; // Ignore feedback
+ return; // Ignore feedback
}
ui->signal_property_changed()(
@@ -79,10 +90,11 @@ lv2_ui_write(SuilController controller,
ui->world().forge().make(value),
Resource::Graph::DEFAULT);
- } else if (format == uris.atom_eventTransfer.urid.get<LV2_URID>()) {
- const LV2_Atom* atom = (const LV2_Atom*)buffer;
- Atom val = ui->world().forge().alloc(
- atom->size, atom->type, LV2_ATOM_BODY_CONST(atom));
+ } else if (format == uris.atom_eventTransfer.urid()) {
+ const auto* atom = static_cast<const LV2_Atom*>(buffer);
+ const Atom val =
+ Forge::alloc(atom->size, atom->type, LV2_ATOM_BODY_CONST(atom));
+
ui->signal_property_changed()(port->uri(),
uris.ingen_activity,
val,
@@ -97,7 +109,7 @@ lv2_ui_write(SuilController controller,
static uint32_t
lv2_ui_port_index(SuilController controller, const char* port_symbol)
{
- PluginUI* const ui = (PluginUI*)controller;
+ auto* const ui = static_cast<PluginUI*>(controller);
const BlockModel::Ports& ports = ui->block()->ports();
for (uint32_t i = 0; i < ports.size(); ++i) {
@@ -114,8 +126,8 @@ lv2_ui_subscribe(SuilController controller,
uint32_t protocol,
const LV2_Feature* const* features)
{
- PluginUI* const ui = (PluginUI*)controller;
- SPtr<const PortModel> port = get_port(ui, port_index);
+ auto* const ui = static_cast<PluginUI*>(controller);
+ const std::shared_ptr<const PortModel> port = get_port(ui, port_index);
if (!port) {
return 1;
}
@@ -135,8 +147,8 @@ lv2_ui_unsubscribe(SuilController controller,
uint32_t protocol,
const LV2_Feature* const* features)
{
- PluginUI* const ui = (PluginUI*)controller;
- SPtr<const PortModel> port = get_port(ui, port_index);
+ auto* const ui = static_cast<PluginUI*>(controller);
+ auto port = get_port(ui, port_index);
if (!port) {
return 1;
}
@@ -150,24 +162,22 @@ lv2_ui_unsubscribe(SuilController controller,
return 0;
}
-PluginUI::PluginUI(ingen::World& world,
- SPtr<const BlockModel> block,
- LilvUIs* uis,
- const LilvUI* ui,
- const LilvNode* ui_type)
- : _world(world)
- , _block(std::move(block))
- , _instance(nullptr)
- , _uis(uis)
- , _ui(ui)
- , _ui_node(lilv_node_duplicate(lilv_ui_get_uri(ui)))
- , _ui_type(lilv_node_duplicate(ui_type))
-{
-}
+PluginUI::PluginUI(ingen::World& world,
+ std::shared_ptr<const BlockModel> block,
+ LilvUIs* uis,
+ const LilvUI* ui,
+ const LilvNode* ui_type)
+ : _world(world)
+ , _block(std::move(block))
+ , _uis(uis)
+ , _ui(ui)
+ , _ui_node(lilv_node_duplicate(lilv_ui_get_uri(ui)))
+ , _ui_type(lilv_node_duplicate(ui_type))
+{}
PluginUI::~PluginUI()
{
- for (uint32_t i : _subscribed_ports) {
+ for (const uint32_t i : _subscribed_ports) {
lv2_ui_unsubscribe(this, i, 0, nullptr);
}
suil_instance_free(_instance);
@@ -177,10 +187,10 @@ PluginUI::~PluginUI()
lilv_world_unload_resource(_world.lilv_world(), lilv_ui_get_uri(_ui));
}
-SPtr<PluginUI>
-PluginUI::create(ingen::World& world,
- SPtr<const BlockModel> block,
- const LilvPlugin* plugin)
+std::shared_ptr<PluginUI>
+PluginUI::create(ingen::World& world,
+ const std::shared_ptr<const BlockModel>& block,
+ const LilvPlugin* plugin)
{
if (!PluginUI::ui_host) {
PluginUI::ui_host = suil_host_new(lv2_ui_write,
@@ -196,7 +206,7 @@ PluginUI::create(ingen::World& world,
LilvUIs* uis = lilv_plugin_get_uis(plugin);
const LilvUI* ui = nullptr;
const LilvNode* ui_type = nullptr;
- LILV_FOREACH(uis, u, uis) {
+ LILV_FOREACH (uis, u, uis) {
const LilvUI* this_ui = lilv_uis_get(uis, u);
if (lilv_ui_is_supported(this_ui,
suil_ui_supported,
@@ -210,11 +220,11 @@ PluginUI::create(ingen::World& world,
if (!ui) {
lilv_node_free(gtk_ui);
- return SPtr<PluginUI>();
+ return nullptr;
}
// Create the PluginUI, but don't instantiate yet
- SPtr<PluginUI> ret(new PluginUI(world, block, uis, ui, ui_type));
+ std::shared_ptr<PluginUI> ret(new PluginUI(world, block, uis, ui, ui_type));
ret->_features = world.lv2_features().lv2_features(
world, const_cast<BlockModel*>(block.get()));
@@ -238,7 +248,7 @@ PluginUI::instantiate()
LilvNode* ui_plugin = lilv_new_uri(lworld, LV2_UI__plugin);
LilvNodes* notes = lilv_world_find_nodes(
lworld, lilv_ui_get_uri(_ui), ui_portNotification, nullptr);
- LILV_FOREACH(nodes, n, notes) {
+ LILV_FOREACH (nodes, n, notes) {
const LilvNode* note = lilv_nodes_get(notes, n);
const LilvNode* sym = lilv_world_get(lworld, note, uris.lv2_symbol, nullptr);
const LilvNode* plug = lilv_world_get(lworld, note, ui_plugin, nullptr);
@@ -253,7 +263,7 @@ PluginUI::instantiate()
plugin_uri, lilv_node_as_string(_ui_node));
} else if (!strcmp(lilv_node_as_uri(plug), plugin_uri.c_str())) {
// Notification is valid and for this plugin
- uint32_t index = lv2_ui_port_index(this, lilv_node_as_string(sym));
+ const uint32_t index = lv2_ui_port_index(this, lilv_node_as_string(sym));
if (index != LV2UI_INVALID_PORT_INDEX) {
lv2_ui_subscribe(this, index, 0, nullptr);
_subscribed_ports.insert(index);
@@ -287,7 +297,7 @@ PluginUI::instantiate()
if (!_instance) {
_world.log().error("Failed to instantiate LV2 UI\n");
// Cancel any subscriptions
- for (uint32_t i : _subscribed_ports) {
+ for (const uint32_t i : _subscribed_ports) {
lv2_ui_unsubscribe(this, i, 0, nullptr);
}
return false;
@@ -299,7 +309,7 @@ PluginUI::instantiate()
SuilWidget
PluginUI::get_widget()
{
- return (SuilWidget*)suil_instance_get_widget(_instance);
+ return suil_instance_get_widget(_instance);
}
void
@@ -337,5 +347,4 @@ PluginUI::is_resizable() const
return !fs_matches && !nrs_matches;
}
-} // namespace client
-} // namespace ingen
+} // namespace ingen::client