more lv2 gui (w/ pugl example)
This commit is contained in:
parent
292e83dcea
commit
8c5fe9cb84
@ -124,5 +124,6 @@
|
|||||||
{{?it.lv2.ui}}
|
{{?it.lv2.ui}}
|
||||||
{{=it.tibia.lv2.ttlURI(it.lv2.ui.uri)}}
|
{{=it.tibia.lv2.ttlURI(it.lv2.ui.uri)}}
|
||||||
a ui:@UI_TYPE@ ;
|
a ui:@UI_TYPE@ ;
|
||||||
ui:binary <{{=it.product.bundleName}}@DLL_SUFFIX@> .
|
ui:binary <{{=it.product.bundleName}}@DLL_SUFFIX@> ;
|
||||||
|
lv2:requiredFeature ui:idleInterface .
|
||||||
{{?}}
|
{{?}}
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define TEMPLATE_HAS_UI
|
||||||
#include "data.h"
|
#include "data.h"
|
||||||
#include "plugin.h"
|
#include "plugin.h"
|
||||||
|
|
||||||
@ -301,48 +302,40 @@ typedef struct {
|
|||||||
} ui_instance;
|
} ui_instance;
|
||||||
|
|
||||||
static LV2UI_Handle ui_instantiate(const LV2UI_Descriptor * descriptor, const char * plugin_uri, const char * bundle_path, LV2UI_Write_Function write_function, LV2UI_Controller controller, LV2UI_Widget * widget, const LV2_Feature * const * features) {
|
static LV2UI_Handle ui_instantiate(const LV2UI_Descriptor * descriptor, const char * plugin_uri, const char * bundle_path, LV2UI_Write_Function write_function, LV2UI_Controller controller, LV2UI_Widget * widget, const LV2_Feature * const * features) {
|
||||||
*widget = NULL;
|
char has_parent = 0;
|
||||||
|
void *parent = NULL;
|
||||||
|
for (size_t i = 0; features[i] != NULL; i++)
|
||||||
|
if (!strcmp(features[i]->URI, LV2_UI__parent)) {
|
||||||
|
has_parent = 1;
|
||||||
|
parent = features[i]->data;
|
||||||
|
}
|
||||||
|
|
||||||
ui_instance *instance = malloc(sizeof(ui_instance));
|
plugin_ui *instance = plugin_ui_create(has_parent, parent);
|
||||||
if (instance == NULL)
|
if (instance == NULL) {
|
||||||
return NULL;
|
*widget = NULL;
|
||||||
|
|
||||||
instance->display = XOpenDisplay(NULL);
|
|
||||||
if (instance->display == NULL) {
|
|
||||||
free(instance);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
*widget = instance->widget;
|
||||||
Window parent;
|
|
||||||
const char* missing = lv2_features_query(features,
|
|
||||||
LV2_UI__parent, &parent, false,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
int screen = DefaultScreen(instance->display);
|
|
||||||
instance->window = XCreateSimpleWindow(instance->display, missing ? RootWindow(instance->display, screen) : parent, 0, 0, 400, 200, 5, BlackPixel(instance->display, screen), WhitePixel(instance->display, screen));
|
|
||||||
//XSelectInput(instance->display, instance->window, ExposureMask | KeyPressMask);
|
|
||||||
XMapWindow(instance->display, instance->window);
|
|
||||||
XEvent ev;
|
|
||||||
while (XPending(instance->display))
|
|
||||||
XNextEvent(instance->display, &ev);
|
|
||||||
*widget = instance->window;
|
|
||||||
|
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ui_cleanup(LV2UI_Handle handle) {
|
static void ui_cleanup(LV2UI_Handle handle) {
|
||||||
ui_instance *instance = (ui_instance *)handle;
|
plugin_ui_free((plugin_ui *)handle);
|
||||||
XDestroyWindow(instance->display, instance->window);
|
|
||||||
XCloseDisplay(instance->display);
|
|
||||||
free(instance);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ui_port_event(LV2UI_Handle handle, uint32_t port_index, uint32_t buffer_size, uint32_t format, const void * buffer) {
|
static void ui_port_event(LV2UI_Handle handle, uint32_t port_index, uint32_t buffer_size, uint32_t format, const void * buffer) {
|
||||||
//TODO
|
//TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ui_idle(LV2UI_Handle handle) {
|
||||||
|
plugin_ui_idle((plugin_ui *)handle);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static const void * ui_extension_data(const char * uri) {
|
static const void * ui_extension_data(const char * uri) {
|
||||||
//TODO
|
static const LV2UI_Idle_Interface idle = { ui_idle };
|
||||||
|
if (!strcmp(uri, LV2_UI__idleInterface))
|
||||||
|
return &idle;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,7 +26,9 @@
|
|||||||
#pragma GCC diagnostic ignored "-Wpedantic"
|
#pragma GCC diagnostic ignored "-Wpedantic"
|
||||||
#include "vst3_c_api.h"
|
#include "vst3_c_api.h"
|
||||||
#pragma GCC diagnostic pop
|
#pragma GCC diagnostic pop
|
||||||
|
|
||||||
#include "data.h"
|
#include "data.h"
|
||||||
|
#define TEMPLATE_HAS_UI
|
||||||
#include "plugin.h"
|
#include "plugin.h"
|
||||||
|
|
||||||
#if defined(__i386__) || defined(__x86_64__)
|
#if defined(__i386__) || defined(__x86_64__)
|
||||||
@ -931,8 +933,8 @@ static Steinberg_tresult plugViewGetSize(void* thisInterface, struct Steinberg_V
|
|||||||
//TODO
|
//TODO
|
||||||
size->left = 0;
|
size->left = 0;
|
||||||
size->top = 0;
|
size->top = 0;
|
||||||
size->right = 0;
|
size->right = 600;
|
||||||
size->bottom = 0;
|
size->bottom = 400;
|
||||||
return Steinberg_kResultTrue;
|
return Steinberg_kResultTrue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
6
test/lv2-make.json
Normal file
6
test/lv2-make.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"lv2_make": {
|
||||||
|
"cflags": "$(shell pkg-config --cflags pugl-cairo-0)",
|
||||||
|
"ldflags": "$(shell pkg-config --libs pugl-cairo-0)"
|
||||||
|
}
|
||||||
|
}
|
@ -116,4 +116,67 @@ static void plugin_midi_msg_in(plugin *instance, size_t index, const uint8_t * d
|
|||||||
instance->cutoff_k = data[1] < 64 ? (-0.19558034980097166f * data[1] - 2.361735109225749f) / (data[1] - 75.57552349522389f) : (393.95397927344214f - 7.660826245588588f * data[1]) / (data[1] - 139.0755234952239f);
|
instance->cutoff_k = data[1] < 64 ? (-0.19558034980097166f * data[1] - 2.361735109225749f) / (data[1] - 75.57552349522389f) : (393.95397927344214f - 7.660826245588588f * data[1]) / (data[1] - 139.0755234952239f);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define PLUGIN_UI
|
#ifdef TEMPLATE_HAS_UI
|
||||||
|
# define PLUGIN_UI
|
||||||
|
|
||||||
|
# include <pugl/pugl.h>
|
||||||
|
# include <pugl/cairo.h>
|
||||||
|
# include <cairo.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
void * widget;
|
||||||
|
PuglWorld * world;
|
||||||
|
PuglView * view;
|
||||||
|
} plugin_ui;
|
||||||
|
|
||||||
|
static PuglStatus onEvent(PuglView *view, const PuglEvent *event) {
|
||||||
|
switch (event->type) {
|
||||||
|
case PUGL_EXPOSE:
|
||||||
|
{
|
||||||
|
cairo_t *cr = (cairo_t *)puglGetContext(view);
|
||||||
|
cairo_set_source_rgb(cr, 1, 0.5, 0);
|
||||||
|
cairo_paint(cr);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return PUGL_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static plugin_ui *plugin_ui_create(char has_parent, void *parent) {
|
||||||
|
plugin_ui *instance = malloc(sizeof(plugin_ui));
|
||||||
|
if (instance == NULL)
|
||||||
|
return NULL;
|
||||||
|
instance->world = puglNewWorld(PUGL_MODULE, 0);
|
||||||
|
instance->view = puglNewView(instance->world);
|
||||||
|
puglSetSizeHint(instance->view, PUGL_DEFAULT_SIZE, 600, 400);
|
||||||
|
puglSetViewHint(instance->view, PUGL_RESIZABLE, 0);
|
||||||
|
puglSetBackend(instance->view, puglCairoBackend());
|
||||||
|
PuglRect frame = { 0, 0, 600, 400 };
|
||||||
|
puglSetFrame(instance->view, frame);
|
||||||
|
puglSetEventFunc(instance->view, onEvent);
|
||||||
|
if (has_parent) {
|
||||||
|
puglSetParentWindow(instance->view, (PuglNativeView)parent);
|
||||||
|
}
|
||||||
|
if (puglRealize(instance->view)) {
|
||||||
|
puglFreeView(instance->view);
|
||||||
|
puglFreeWorld(instance->world);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
puglShow(instance->view, PUGL_SHOW_RAISE);
|
||||||
|
instance->widget = (void *)puglGetNativeView(instance->view);
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void plugin_ui_free(plugin_ui *instance) {
|
||||||
|
puglFreeView(instance->view);
|
||||||
|
puglFreeWorld(instance->world);
|
||||||
|
free(instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void plugin_ui_idle(plugin_ui *instance) {
|
||||||
|
puglUpdate(instance->world, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
@ -6,7 +6,7 @@ $dir/../tibia $dir/product.json,$dir/company.json,$dir/vst3.json,$dir/vst3-make.
|
|||||||
cp $dir/plugin.h $dir/../out/vst3/src
|
cp $dir/plugin.h $dir/../out/vst3/src
|
||||||
|
|
||||||
$dir/../tibia $dir/product.json,$dir/company.json,$dir/lv2.json $dir/../templates/lv2 $dir/../out/lv2
|
$dir/../tibia $dir/product.json,$dir/company.json,$dir/lv2.json $dir/../templates/lv2 $dir/../out/lv2
|
||||||
$dir/../tibia $dir/product.json,$dir/company.json,$dir/lv2.json $dir/../templates/lv2-make $dir/../out/lv2
|
$dir/../tibia $dir/product.json,$dir/company.json,$dir/lv2.json,$dir/lv2-make.json $dir/../templates/lv2-make $dir/../out/lv2
|
||||||
cp $dir/plugin.h $dir/../out/lv2/src
|
cp $dir/plugin.h $dir/../out/lv2/src
|
||||||
|
|
||||||
$dir/../tibia $dir/product.json,$dir/company.json $dir/../templates/web $dir/../out/web
|
$dir/../tibia $dir/product.json,$dir/company.json $dir/../templates/web $dir/../out/web
|
||||||
|
Loading…
Reference in New Issue
Block a user