diff options
author | Hanspeter Portner <dev@open-music-kontrollers.ch> | 2016-10-12 22:22:17 +0200 |
---|---|---|
committer | Hanspeter Portner <dev@open-music-kontrollers.ch> | 2016-10-12 22:22:17 +0200 |
commit | 6327df6f222c64376e57399ed11c803f14c92e9b (patch) | |
tree | 7bbb9dcf47a90d0888e055cbe2b04f5633f16abc | |
download | canvas_display.lv2-6327df6f222c64376e57399ed11c803f14c92e9b.tar.xz |
initial commit.
-rw-r--r-- | CMakeLists.txt | 59 | ||||
-rw-r--r-- | COPYING | 201 | ||||
-rw-r--r-- | README.md | 44 | ||||
-rw-r--r-- | VERSION | 1 | ||||
-rw-r--r-- | canvas.c | 96 | ||||
-rw-r--r-- | canvas.h | 34 | ||||
-rw-r--r-- | canvas.ttl | 68 | ||||
-rw-r--r-- | canvas_ui.c | 274 | ||||
-rw-r--r-- | canvas_ui.ttl | 30 | ||||
-rw-r--r-- | manifest.ttl.in | 34 |
10 files changed, 841 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..78f666d --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,59 @@ +cmake_minimum_required(VERSION 2.8) + +project(canvas.lv2) + +include_directories(${PROJECT_SOURCE_DIR}) +include_directories(${PROJECT_SOURCE_DIR}/pugl) + +set(CMAKE_C_FLAGS "-std=gnu11 -Wextra -Wno-unused-parameter -ffast-math -fvisibility=hidden ${CMAKE_C_FLAGS}") +set(CMAKE_C_FLAGS "-Wshadow -Wimplicit-function-declaration -Wmissing-prototypes -Wstrict-prototypes ${CMAKE_C_FLAGS}") +set(CMAKE_MODULE_LINKER_FLAGS "-Wl,-z,nodelete ${CMAKE_MODULE_LINKER_FLAGS}") +set(CMAKE_MODULE_LINKER_FLAGS "-Wl,-z,defs ${CMAKE_MODULE_LINKER_FLAGS}") +add_definitions("-D_GNU_SOURCE=1") # asprintf + +file(STRINGS "VERSION" CANVAS_VERSION) +string(REPLACE "." ";" VERSION_LIST ${CANVAS_VERSION}) +list(GET VERSION_LIST 0 CANVAS_MAJOR_VERSION) +list(GET VERSION_LIST 1 CANVAS_MINOR_VERSION) +list(GET VERSION_LIST 2 CANVAS_MICRO_VERSION) +add_definitions("-DCANVAS_VERSION=\"${CANVAS_VERSION}\"") + +set(DEST lib/lv2/canvas.lv2) + +find_package(PkgConfig) # ${PKG_CONFIG_FOUND} + +pkg_search_module(LV2 REQUIRED lv2>=1.10) +include_directories(${LV2_INCLUDE_DIRS}) + +pkg_search_module(CAIRO REQUIRED cairo>=1.14) +include_directories(${CAIRO_INCLUDE_DIRS}) +add_definitions("-DPUGL_HAVE_CAIRO") + +pkg_search_module(X11 REQUIRED x11>=1.6) +include_directories(${X11_INCLUDE_DIRS}) + +pkg_search_module(GL REQUIRED gl>=12.0) +include_directories(${GL_INCLUDE_DIRS}) +add_definitions("-DPUGL_HAVE_GL") + +add_library(canvas MODULE + canvas.c) +target_link_libraries(canvas + ${CAIRO_LDFLAGS}) +set_target_properties(canvas PROPERTIES PREFIX "") +install(TARGETS canvas DESTINATION ${DEST}) + +add_library(canvas_ui MODULE + canvas_ui.c + pugl/pugl/pugl_x11.c) +target_link_libraries(canvas_ui + ${CAIRO_LDFLAGS} + ${X11_LDFLAGS} + ${GL_LDFLAGS}) +set_target_properties(canvas_ui PROPERTIES PREFIX "") +install(TARGETS canvas_ui DESTINATION ${DEST}) + +configure_file(${PROJECT_SOURCE_DIR}/manifest.ttl.in ${PROJECT_BINARY_DIR}/manifest.ttl) +install(FILES ${PROJECT_BINARY_DIR}/manifest.ttl DESTINATION ${DEST}) +install(FILES ${PROJECT_SOURCE_DIR}/canvas.ttl DESTINATION ${DEST}) +install(FILES ${PROJECT_SOURCE_DIR}/canvas_ui.ttl DESTINATION ${DEST}) @@ -0,0 +1,201 @@ + The Artistic License 2.0 + + Copyright (c) 2000-2006, The Perl Foundation. + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +Preamble + +This license establishes the terms under which a given free software +Package may be copied, modified, distributed, and/or redistributed. +The intent is that the Copyright Holder maintains some artistic +control over the development of that Package while still keeping the +Package available as open source and free software. + +You are always permitted to make arrangements wholly outside of this +license directly with the Copyright Holder of a given Package. If the +terms of this license do not permit the full use that you propose to +make of the Package, you should contact the Copyright Holder and seek +a different licensing arrangement. + +Definitions + + "Copyright Holder" means the individual(s) or organization(s) + named in the copyright notice for the entire Package. + + "Contributor" means any party that has contributed code or other + material to the Package, in accordance with the Copyright Holder's + procedures. + + "You" and "your" means any person who would like to copy, + distribute, or modify the Package. + + "Package" means the collection of files distributed by the + Copyright Holder, and derivatives of that collection and/or of + those files. A given Package may consist of either the Standard + Version, or a Modified Version. + + "Distribute" means providing a copy of the Package or making it + accessible to anyone else, or in the case of a company or + organization, to others outside of your company or organization. + + "Distributor Fee" means any fee that you charge for Distributing + this Package or providing support for this Package to another + party. It does not mean licensing fees. + + "Standard Version" refers to the Package if it has not been + modified, or has been modified only in ways explicitly requested + by the Copyright Holder. + + "Modified Version" means the Package, if it has been changed, and + such changes were not explicitly requested by the Copyright + Holder. + + "Original License" means this Artistic License as Distributed with + the Standard Version of the Package, in its current version or as + it may be modified by The Perl Foundation in the future. + + "Source" form means the source code, documentation source, and + configuration files for the Package. + + "Compiled" form means the compiled bytecode, object code, binary, + or any other form resulting from mechanical transformation or + translation of the Source form. + + +Permission for Use and Modification Without Distribution + +(1) You are permitted to use the Standard Version and create and use +Modified Versions for any purpose without restriction, provided that +you do not Distribute the Modified Version. + + +Permissions for Redistribution of the Standard Version + +(2) You may Distribute verbatim copies of the Source form of the +Standard Version of this Package in any medium without restriction, +either gratis or for a Distributor Fee, provided that you duplicate +all of the original copyright notices and associated disclaimers. At +your discretion, such verbatim copies may or may not include a +Compiled form of the Package. + +(3) You may apply any bug fixes, portability changes, and other +modifications made available from the Copyright Holder. The resulting +Package will still be considered the Standard Version, and as such +will be subject to the Original License. + + +Distribution of Modified Versions of the Package as Source + +(4) You may Distribute your Modified Version as Source (either gratis +or for a Distributor Fee, and with or without a Compiled form of the +Modified Version) provided that you clearly document how it differs +from the Standard Version, including, but not limited to, documenting +any non-standard features, executables, or modules, and provided that +you do at least ONE of the following: + + (a) make the Modified Version available to the Copyright Holder + of the Standard Version, under the Original License, so that the + Copyright Holder may include your modifications in the Standard + Version. + + (b) ensure that installation of your Modified Version does not + prevent the user installing or running the Standard Version. In + addition, the Modified Version must bear a name that is different + from the name of the Standard Version. + + (c) allow anyone who receives a copy of the Modified Version to + make the Source form of the Modified Version available to others + under + + (i) the Original License or + + (ii) a license that permits the licensee to freely copy, + modify and redistribute the Modified Version using the same + licensing terms that apply to the copy that the licensee + received, and requires that the Source form of the Modified + Version, and of any works derived from it, be made freely + available in that license fees are prohibited but Distributor + Fees are allowed. + + +Distribution of Compiled Forms of the Standard Version +or Modified Versions without the Source + +(5) You may Distribute Compiled forms of the Standard Version without +the Source, provided that you include complete instructions on how to +get the Source of the Standard Version. Such instructions must be +valid at the time of your distribution. If these instructions, at any +time while you are carrying out such distribution, become invalid, you +must provide new instructions on demand or cease further distribution. +If you provide valid instructions or cease distribution within thirty +days after you become aware that the instructions are invalid, then +you do not forfeit any of your rights under this license. + +(6) You may Distribute a Modified Version in Compiled form without +the Source, provided that you comply with Section 4 with respect to +the Source of the Modified Version. + + +Aggregating or Linking the Package + +(7) You may aggregate the Package (either the Standard Version or +Modified Version) with other packages and Distribute the resulting +aggregation provided that you do not charge a licensing fee for the +Package. Distributor Fees are permitted, and licensing fees for other +components in the aggregation are permitted. The terms of this license +apply to the use and Distribution of the Standard or Modified Versions +as included in the aggregation. + +(8) You are permitted to link Modified and Standard Versions with +other works, to embed the Package in a larger work of your own, or to +build stand-alone binary or bytecode versions of applications that +include the Package, and Distribute the result without restriction, +provided the result does not expose a direct interface to the Package. + + +Items That are Not Considered Part of a Modified Version + +(9) Works (including, but not limited to, modules and scripts) that +merely extend or make use of the Package, do not, by themselves, cause +the Package to be a Modified Version. In addition, such works are not +considered parts of the Package itself, and are not subject to the +terms of this license. + + +General Provisions + +(10) Any use, modification, and distribution of the Standard or +Modified Versions is governed by this Artistic License. By using, +modifying or distributing the Package, you accept this license. Do not +use, modify, or distribute the Package, if you do not accept this +license. + +(11) If your Modified Version has been derived from a Modified +Version made by someone other than you, you are nevertheless required +to ensure that your Modified Version complies with the requirements of +this license. + +(12) This license does not grant you the right to use any trademark, +service mark, tradename, or logo of the Copyright Holder. + +(13) This license includes the non-exclusive, worldwide, +free-of-charge patent license to make, have made, use, offer to sell, +sell, import and otherwise transfer the Package with respect to any +patent claims licensable by the Copyright Holder that are necessarily +infringed by the Package. If you institute patent litigation +(including a cross-claim or counterclaim) against any party alleging +that the Package constitutes direct or contributory patent +infringement, then this Artistic License to you shall terminate on the +date that such litigation is filed. + +(14) Disclaimer of Warranty: +THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS +IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR +NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL +LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..2a575d3 --- /dev/null +++ b/README.md @@ -0,0 +1,44 @@ +# Canvas + +## Canvas LV2 plugin bundle + +### Webpage + +Get more information at: [http://open-music-kontrollers.ch/lv2/canvas](http://open-music-kontrollers.ch/lv2/canvas) + +### Build status + +[](https://travis-ci.org/OpenMusicKontrollers/canvas.lv2) + +### Dependencies + +* [LV2](http://lv2plug.in) (LV2 Plugin Standard) +* [pugl](http://drobilla.net/software/pugl) (Portable API for OpenGL GUIs) +* [cairo](http://cairographics.org) (Cairo Vector Graphics Library) + +### Build / install + + git clone https://github.com/OpenMusicKontrollers/canvas.lv2.git + cd canvas.lv2 + mkdir build + cd build + cmake .. + make + sudo make install + +### License + +Copyright (c) 2016 Hanspeter Portner (dev@open-music-kontrollers.ch) + +This is free software: you can redistribute it and/or modify +it under the terms of the Artistic License 2.0 as published by +The Perl Foundation. + +This source is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +Artistic License 2.0 for more details. + +You should have received a copy of the Artistic License 2.0 +along the source as a COPYING file. If not, obtain it from +<http://www.perlfoundation.org/artistic_license_2_0>. @@ -0,0 +1 @@ +0.1.1 diff --git a/canvas.c b/canvas.c new file mode 100644 index 0000000..5091e60 --- /dev/null +++ b/canvas.c @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2016 Hanspeter Portner (dev@open-music-kontrollers.ch) + * + * This is free software: you can redistribute it and/or modify + * it under the terms of the Artistic License 2.0 as published by + * The Perl Foundation. + * + * This source is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * Artistic License 2.0 for more details. + * + * You should have received a copy of the Artistic License 2.0 + * along the source as a COPYING file. If not, obtain it from + * http://www.perlfoundation.org/artistic_license_2_0. + */ + +#include <stdlib.h> + +#include <canvas.h> + +typedef struct _plughandle_t plughandle_t; + +struct _plughandle_t { + const LV2_Atom_Sequence *control; + LV2_Atom_Sequence *notify; +}; + +static LV2_Handle +instantiate(const LV2_Descriptor* descriptor, double rate, + const char *bundle_path, const LV2_Feature *const *features) +{ + plughandle_t *handle = calloc(1, sizeof(plughandle_t)); + if(!handle) + return NULL; + + return handle; +} + +static void +connect_port(LV2_Handle instance, uint32_t port, void *data) +{ + plughandle_t *handle = instance; + + switch(port) + { + case 0: + handle->control = data; + break; + case 1: + handle->notify = data; + break; + default: + break; + } +} + +static void +run(LV2_Handle instance, uint32_t nsamples) +{ + plughandle_t *handle = instance; + + const uint32_t sz = lv2_atom_total_size(&handle->control->atom); + memcpy(handle->notify, handle->control, sz); +} + +static void +cleanup(LV2_Handle instance) +{ + plughandle_t *handle = instance; + + free(handle); +} + +const LV2_Descriptor canvas_canvas = { + .URI = CANVAS_CANVAS_URI, + .instantiate = instantiate, + .connect_port = connect_port, + .activate = NULL, + .run = run, + .deactivate = NULL, + .cleanup = cleanup, + .extension_data = NULL +}; + +LV2_SYMBOL_EXPORT const LV2_Descriptor* +lv2_descriptor(uint32_t index) +{ + switch(index) + { + case 0: + return &canvas_canvas; + default: + return NULL; + } +} diff --git a/canvas.h b/canvas.h new file mode 100644 index 0000000..4a66bb1 --- /dev/null +++ b/canvas.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2016 Hanspeter Portner (dev@open-music-kontrollers.ch) + * + * This is free software: you can redistribute it and/or modify + * it under the terms of the Artistic License 2.0 as published by + * The Perl Foundation. + * + * This source is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * Artistic License 2.0 for more details. + * + * You should have received a copy of the Artistic License 2.0 + * along the source as a COPYING file. If not, obtain it from + * http://www.perlfoundation.org/artistic_license_2_0. + */ + +#ifndef _CANVAS_LV2_H +#define _CANVAS_LV2_H + +#include "lv2/lv2plug.in/ns/ext/atom/atom.h" +#include "lv2/lv2plug.in/ns/ext/atom/forge.h" +#include "lv2/lv2plug.in/ns/extensions/ui/ui.h" +#include "lv2/lv2plug.in/ns/lv2core/lv2.h" + +#define CANVAS_URI "http://open-music-kontrollers.ch/lv2/canvas" + +#define CANVAS_CANVAS_URI CANVAS_URI"#canvas" +#define CANVAS_CANVAS_UI_URI CANVAS_URI"#canvas_ui" + +extern const LV2_Descriptor canvas_canvas; +extern const LV2UI_Descriptor canvas_canvas_ui; + +#endif // _CANVAS_LV2_H diff --git a/canvas.ttl b/canvas.ttl new file mode 100644 index 0000000..0d70d02 --- /dev/null +++ b/canvas.ttl @@ -0,0 +1,68 @@ +# Copyright (c) 2016 Hanspeter Portner (dev@open-music-kontrollers.ch) +# +# This is free software: you can redistribute it and/or modify +# it under the terms of the Artistic License 2.0 as published by +# The Perl Foundation. +# +# This source is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# Artistic License 2.0 for more details. +# +# You should have received a copy of the Artistic License 2.0 +# along the source as a COPYING file. If not, obtain it from +# http://www.perlfoundation.org/artistic_license_2_0. + +@prefix foaf: <http://xmlns.com/foaf/0.1/> . +@prefix doap: <http://usefulinc.com/ns/doap#> . +@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . +@prefix rdf: <http://www.w3.org/2000/01/rdf-schema#> . +@prefix lv2: <http://lv2plug.in/ns/lv2core#> . +@prefix atom: <http://lv2plug.in/ns/ext/atom#> . + +@prefix lic: <http://opensource.org/licenses/> . +@prefix omk: <http://open-music-kontrollers.ch/ventosus#> . +@prefix proj: <http://open-music-kontrollers.ch/lv2/> . +@prefix canvas: <http://open-music-kontrollers.ch/lv2/canvas#> . + +# Maintainer +omk:me + a foaf:Person ; + foaf:name "Hanspeter Portner" ; + foaf:mbox <mailto:dev@open-music-kontrollers.ch> ; + foaf:homepage <http://open-music-kontrollers.ch> . + +# Project +proj:canvas + a doap:Project ; + doap:maintainer omk:me ; + doap:name "Canvas Bundle" . + +# Canvas Plugin +canvas:canvas + a lv2:Plugin, + lv2:AnalyserPlugin ; + doap:name "Canvas" ; + doap:license lic:Artistic-2.0 ; + lv2:project proj:canvas ; + lv2:optionalFeature lv2:isLive, lv2:hardRTCapable ; + + lv2:port [ + a lv2:InputPort , + atom:AtomPort ; + atom:bufferType atom:Sequence ; + #atom:supports midi:MidiEvent ; + lv2:index 0 ; + lv2:symbol "control" ; + lv2:name "Control" ; + lv2:designation lv2:control ; + ] , [ + a lv2:OutputPort , + atom:AtomPort ; + atom:bufferType atom:Sequence ; + #atom:supports midi:MidiEvent ; + lv2:index 1 ; + lv2:symbol "notify" ; + lv2:name "Notify" ; + lv2:designation lv2:control ; + ] . diff --git a/canvas_ui.c b/canvas_ui.c new file mode 100644 index 0000000..b15372a --- /dev/null +++ b/canvas_ui.c @@ -0,0 +1,274 @@ +/* + * Copyright (c) 2016 Hanspeter Portner (dev@open-music-kontrollers.ch) + * + * This is free software: you can redistribute it and/or modify + * it under the terms of the Artistic License 2.0 as published by + * The Perl Foundation. + * + * This source is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * Artistic License 2.0 for more details. + * + * You should have received a copy of the Artistic License 2.0 + * along the source as a COPYING file. If not, obtain it from + * http://www.perlfoundation.org/artistic_license_2_0. + */ + +#include <stdlib.h> +#include <stdio.h> +#include <math.h> + +#include <canvas.h> + +#include <pugl/pugl.h> + +#include <cairo/cairo.h> + +typedef struct _plughandle_t plughandle_t; + +struct _plughandle_t { + PuglView *view; + double val; + int done; +}; + +static inline void +_expose(plughandle_t *handle) +{ + cairo_t *ctx = puglGetContext(handle->view); + cairo_surface_t *surf = cairo_get_target(ctx); + + // Draw background + int w, h; + puglGetSize(handle->view, &w, &h); + + cairo_surface_set_device_scale(surf, w, h); + + cairo_set_source_rgba(ctx, 0.0, 0.0, 0.0, 1.0); + cairo_rectangle(ctx, 0.0, 0.0, 1.0, 1.0); + cairo_fill(ctx); + + cairo_set_source_rgba(ctx, handle->val, handle->val, 0.0, 1.0); + cairo_arc(ctx, 0.5, 0.5, 0.4, 0.0, 2*M_PI); + cairo_fill(ctx); +} + +static inline void +_close(plughandle_t *handle) +{ + handle->done = 1; +} + +static inline void +_enter(plughandle_t *handle) +{ + puglPostRedisplay(handle->view); +} + +static inline void +_leave(plughandle_t *handle) +{ + puglPostRedisplay(handle->view); +} + +static void +_event_func(PuglView *view, const PuglEvent *ev) +{ + plughandle_t *handle = puglGetHandle(view); + + switch(ev->type) + { + case PUGL_NOTHING: + break; + case PUGL_BUTTON_PRESS: + break; + case PUGL_BUTTON_RELEASE: + break; + case PUGL_CONFIGURE: + break; + case PUGL_EXPOSE: + _expose(handle); + break; + case PUGL_CLOSE: + _close(handle); + break; + case PUGL_KEY_PRESS: + break; + case PUGL_KEY_RELEASE: + break; + case PUGL_ENTER_NOTIFY: + _enter(handle); + break; + case PUGL_LEAVE_NOTIFY: + _leave(handle); + break; + case PUGL_MOTION_NOTIFY: + break; + case PUGL_SCROLL: + break; + case PUGL_FOCUS_IN: + break; + case PUGL_FOCUS_OUT: + break; + } +} + +static LV2UI_Handle +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) +{ + plughandle_t *handle= calloc(1, sizeof(plughandle_t)); + if(!handle) + return NULL; + + void *parent = NULL; + LV2UI_Resize *host_resize = NULL; + for(int i=0; features[i]; i++) + { + if(!strcmp(features[i]->URI, LV2_UI__parent)) + parent = features[i]->data; + else if(!strcmp(features[i]->URI, LV2_UI__resize)) + host_resize = features[i]->data; + } + + if(!parent) + { + free(handle); + return NULL; + } + + handle->view = puglInit(NULL, NULL); + if(!handle->view) + { + free(handle); + return NULL; + } + + const int w = 400; + const int h = 400;; + puglInitWindowClass(handle->view, "canvas"); + puglInitWindowParent(handle->view, (intptr_t)parent); + puglInitWindowSize(handle->view, w, h); + puglInitWindowMinSize(handle->view, w, h); + puglInitWindowAspectRatio(handle->view, 1, 1, 1, 1); + puglInitResizable(handle->view, true); + puglInitTransientFor(handle->view, (intptr_t)parent); +#ifdef PUGL_HAVE_GL + puglInitContextType(handle->view, PUGL_CAIRO_GL); +#else + puglInitContextType(handle->view, PUGL_CAIRO); +#endif + puglSetHandle(handle->view, handle); + puglSetEventFunc(handle->view, _event_func); + + int stat = puglCreateWindow(handle->view, "Canvas"); + if(stat) + { + free(handle); + return NULL; + } + puglShowWindow(handle->view); + + const intptr_t child = puglGetNativeWindow(handle->view); + *(intptr_t *)widget = child; + + if(host_resize) + host_resize->ui_resize(host_resize->handle, w, h); + + return handle; +} + +static void +cleanup(LV2UI_Handle instance) +{ + plughandle_t *handle = instance; + + if(handle->view) + { + if(puglGetVisible(handle->view)) + puglHideWindow(handle->view); + puglDestroy(handle->view); + } + + free(handle); +} + +static void +port_event(LV2UI_Handle instance, uint32_t index, uint32_t size, + uint32_t protocol, const void *buf) +{ + //FIXME +} + +static int +_resize(LV2UI_Handle instance, int w, int h) +{ + plughandle_t *handle = instance; + + //FIXME + //puglInitWindowSize(handle->view, w, h); + //puglInitWindowMinSize(handle->view, w, h); + + return 0; +} + +static const LV2UI_Resize resize_ext = { + .ui_resize= _resize +}; + +static int +_idle(LV2UI_Handle instance) +{ + plughandle_t *handle = instance; + + handle->val += 0.01; + if(handle->val >= 1.0) + handle->val = 0.0; + + puglPostRedisplay(handle->view); + + if(puglProcessEvents(handle->view) != PUGL_SUCCESS) + { + //TODO + } + + return handle->done; +} + +static const LV2UI_Idle_Interface idle_ext = { + .idle = _idle +}; + +static const void * +extension_data(const char *uri) +{ + if(!strcmp(uri, LV2_UI__idleInterface)) + return &idle_ext; + else if(!strcmp(uri, LV2_UI__resize)) + return &resize_ext; + + return NULL; +} + +const LV2UI_Descriptor canvas_canvas_ui = { + .URI = CANVAS_CANVAS_UI_URI, + .instantiate = instantiate, + .cleanup = cleanup, + .port_event = port_event, + .extension_data = extension_data +}; + +LV2_SYMBOL_EXPORT const LV2UI_Descriptor* +lv2ui_descriptor(uint32_t index) +{ + switch(index) + { + case 0: + return &canvas_canvas_ui; + default: + return NULL; + } +} diff --git a/canvas_ui.ttl b/canvas_ui.ttl new file mode 100644 index 0000000..7072870 --- /dev/null +++ b/canvas_ui.ttl @@ -0,0 +1,30 @@ +# Copyright (c) 2016 Hanspeter Portner (dev@open-music-kontrollers.ch) +# +# This is free software: you can redistribute it and/or modify +# it under the terms of the Artistic License 2.0 as published by +# The Perl Foundation. +# +# This source is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# Artistic License 2.0 for more details. +# +# You should have received a copy of the Artistic License 2.0 +# along the source as a COPYING file. If not, obtain it from +# http://www.perlfoundation.org/artistic_license_2_0. + +@prefix lv2: <http://lv2plug.in/ns/lv2core#> . +@prefix ui: <http://lv2plug.in/ns/extensions/ui#> . +@prefix atom: <http://lv2plug.in/ns/ext/atom#> . + +@prefix canvas: <http://open-music-kontrollers.ch/lv2/canvas#> . + +canvas:canvas_ui + a ui:X11UI ; + ui:portNotification [ + ui:plugin canvas:canvas ; + lv2:symbol "notify" ; + ui:protocol atom:eventTransfer + ] ; + lv2:requiredFeature ui:idleInterface ; + lv2:extensionData ui:idleInterface, ui:showInterface . diff --git a/manifest.ttl.in b/manifest.ttl.in new file mode 100644 index 0000000..4bcd3ef --- /dev/null +++ b/manifest.ttl.in @@ -0,0 +1,34 @@ +# Copyright (c) 2016 Hanspeter Portner (dev@open-music-kontrollers.ch) +# +# This is free software: you can redistribute it and/or modify +# it under the terms of the Artistic License 2.0 as published by +# The Perl Foundation. +# +# This source is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# Artistic License 2.0 for more details. +# +# You should have received a copy of the Artistic License 2.0 +# along the source as a COPYING file. If not, obtain it from +# http://www.perlfoundation.org/artistic_license_2_0. + +@prefix lv2: <http://lv2plug.in/ns/lv2core#> . +@prefix owl: <http://www.w3.org/2002/07/owl#> . +@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . +@prefix ui: <http://lv2plug.in/ns/extensions/ui#> . + +@prefix canvas: <http://open-music-kontrollers.ch/lv2/canvas#> . + +canvas:canvas + a lv2:Plugin ; + lv2:minorVersion @CANVAS_MINOR_VERSION@ ; + lv2:microVersion @CANVAS_MICRO_VERSION@ ; + lv2:binary <canvas@CMAKE_SHARED_MODULE_SUFFIX@> ; + ui:ui canvas:canvas_ui ; + rdfs:seeAlso <canvas.ttl> . + +canvas:canvas_ui + a ui:X11UI ; + ui:binary <canvas_ui@CMAKE_SHARED_MODULE_SUFFIX@> ; + rdfs:seeAlso <canvas_ui.ttl> . |