7 #include "pluginlv2client.h"
8 #include "pluginlv2gui.h"
10 static void lilv_destroy(GtkWidget* widget, gpointer data)
12 PluginLV2GUI *the = (PluginLV2GUI*)data;
16 void PluginLV2GUI::start()
18 GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
19 g_signal_connect(window, "destroy", G_CALLBACK(lilv_destroy), this);
20 gtk_window_set_title(GTK_WINDOW(window), title);
22 GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
23 gtk_window_set_role(GTK_WINDOW(window), "plugin_ui");
24 gtk_container_add(GTK_CONTAINER(window), vbox);
26 GtkWidget *alignment = gtk_alignment_new(0.5, 0.5, 1.0, 1.0);
27 gtk_box_pack_start(GTK_BOX(vbox), alignment, TRUE, TRUE, 0);
28 gtk_widget_show(alignment);
29 lv2ui_instantiate(alignment);
30 GtkWidget* widget = (GtkWidget*)suil_instance_get_widget(sinst);
31 gtk_container_add(GTK_CONTAINER(alignment), widget);
32 gtk_window_set_resizable(GTK_WINDOW(window), lv2ui_resizable());
33 gtk_widget_show_all(vbox);
34 gtk_widget_grab_focus(widget);
36 gtk_window_present(GTK_WINDOW(window));
40 void PluginLV2GUI::stop()
45 void PluginLV2GUI::host_update(PluginLV2ChildGUI *child)
50 // ignore reset update
51 if( child->lv2_gui->running < 0 ) { child->lv2_gui->running = 1; return; }
52 child->send_parent(LV2_UPDATE, config.ctls, sizeof(float)*config.nb_ports);
55 void PluginLV2GUI::run_gui(PluginLV2ChildGUI *child)
58 if( gtk_events_pending() ) {
62 if( running && updates != last )
66 update_lv2(config.ctls, 1);
68 if( !child ) usleep(10000);
69 else if( child->child_iteration() < 0 )
74 int PluginLV2ChildGUI::handle_child()
76 if( !lv2_gui ) return 0;
78 switch( child_token ) {
80 char *path = (char *)child_data;
81 if( lv2_gui->init_gui(path) ) exit(1);
84 lv2_gui->update_lv2((float*)child_data, 1);
87 lv2_gui->update_lv2((float*)child_data, 0);
94 control_t *bfr = (control_t *)child_data;
95 lv2_gui->config.ctls[bfr->idx] = bfr->value;
106 int PluginLV2GUI::run(int ac, char **av)
109 if( init_gui(av[1]) ) {
110 fprintf(stderr," init_ui failed\n");
118 PluginLV2ChildGUI child;
119 child.lv2_gui = this;
120 child.child_fd = atoi(av[1]);
121 child.parent_fd = atoi(av[2]);
129 int main(int ac, char **av)
132 if( getenv("BC_TRAP_LV2_SEGV") ) {
133 signals.initialize("/tmp/lv2ui_%d.dmp");
134 BC_Signals::set_catch_segv(1);
138 // to grab this task in the debugger
139 //static int zbug = 1; volatile int bug = zbug;
140 //while( bug ) usleep(10000);
141 return PluginLV2GUI().run(ac, av);