|
|
@@ -1,6 +1,6 @@ |
|
|
|
/* |
|
|
|
LV2 UI Extension |
|
|
|
Copyright 2009-2014 David Robillard <d@drobilla.net> |
|
|
|
Copyright 2009-2016 David Robillard <d@drobilla.net> |
|
|
|
Copyright 2006-2011 Lars Luthman <lars.luthman@gmail.com> |
|
|
|
|
|
|
|
Permission to use, copy, modify, and/or distribute this software for any |
|
|
@@ -17,9 +17,12 @@ |
|
|
|
*/ |
|
|
|
|
|
|
|
/** |
|
|
|
@file ui.h User Interface API. |
|
|
|
@defgroup ui User Interfaces |
|
|
|
|
|
|
|
For high-level documentation, see <http://lv2plug.in/ns/extensions/ui>. |
|
|
|
User interfaces of any type for plugins, |
|
|
|
<http://lv2plug.in/ns/extensions/ui> for details. |
|
|
|
|
|
|
|
@{ |
|
|
|
*/ |
|
|
|
|
|
|
|
#ifndef LV2_UI_H |
|
|
@@ -28,39 +31,48 @@ |
|
|
|
#include <stdint.h> |
|
|
|
|
|
|
|
#include "lv2.h" |
|
|
|
|
|
|
|
#define LV2_UI_URI "http://lv2plug.in/ns/extensions/ui" |
|
|
|
#define LV2_UI_PREFIX LV2_UI_URI "#" |
|
|
|
|
|
|
|
#define LV2_UI__CocoaUI LV2_UI_PREFIX "CocoaUI" |
|
|
|
#define LV2_UI__Gtk3UI LV2_UI_PREFIX "Gtk3UI" |
|
|
|
#define LV2_UI__GtkUI LV2_UI_PREFIX "GtkUI" |
|
|
|
#define LV2_UI__PortNotification LV2_UI_PREFIX "PortNotification" |
|
|
|
#define LV2_UI__Qt4UI LV2_UI_PREFIX "Qt4UI" |
|
|
|
#define LV2_UI__UI LV2_UI_PREFIX "UI" |
|
|
|
#define LV2_UI__WindowsUI LV2_UI_PREFIX "WindowsUI" |
|
|
|
#define LV2_UI__X11UI LV2_UI_PREFIX "X11UI" |
|
|
|
#define LV2_UI__binary LV2_UI_PREFIX "binary" |
|
|
|
#define LV2_UI__fixedSize LV2_UI_PREFIX "fixedSize" |
|
|
|
#define LV2_UI__idleInterface LV2_UI_PREFIX "idleInterface" |
|
|
|
#define LV2_UI__noUserResize LV2_UI_PREFIX "noUserResize" |
|
|
|
#define LV2_UI__notifyType LV2_UI_PREFIX "notifyType" |
|
|
|
#define LV2_UI__parent LV2_UI_PREFIX "parent" |
|
|
|
#define LV2_UI__plugin LV2_UI_PREFIX "plugin" |
|
|
|
#define LV2_UI__portIndex LV2_UI_PREFIX "portIndex" |
|
|
|
#define LV2_UI__portMap LV2_UI_PREFIX "portMap" |
|
|
|
#define LV2_UI__portNotification LV2_UI_PREFIX "portNotification" |
|
|
|
#define LV2_UI__portSubscribe LV2_UI_PREFIX "portSubscribe" |
|
|
|
#define LV2_UI__resize LV2_UI_PREFIX "resize" |
|
|
|
#define LV2_UI__scaleFactor LV2_UI_PREFIX "scaleFactor" |
|
|
|
#define LV2_UI__showInterface LV2_UI_PREFIX "showInterface" |
|
|
|
#define LV2_UI__touch LV2_UI_PREFIX "touch" |
|
|
|
#define LV2_UI__ui LV2_UI_PREFIX "ui" |
|
|
|
#define LV2_UI__updateRate LV2_UI_PREFIX "updateRate" |
|
|
|
#define LV2_UI__windowTitle LV2_UI_PREFIX "windowTitle" |
|
|
|
#include "urid.h" |
|
|
|
|
|
|
|
#define LV2_UI_URI "http://lv2plug.in/ns/extensions/ui" ///< http://lv2plug.in/ns/extensions/ui |
|
|
|
#define LV2_UI_PREFIX LV2_UI_URI "#" ///< http://lv2plug.in/ns/extensions/ui# |
|
|
|
|
|
|
|
#define LV2_UI__CocoaUI LV2_UI_PREFIX "CocoaUI" ///< http://lv2plug.in/ns/extensions/ui#CocoaUI |
|
|
|
#define LV2_UI__Gtk3UI LV2_UI_PREFIX "Gtk3UI" ///< http://lv2plug.in/ns/extensions/ui#Gtk3UI |
|
|
|
#define LV2_UI__GtkUI LV2_UI_PREFIX "GtkUI" ///< http://lv2plug.in/ns/extensions/ui#GtkUI |
|
|
|
#define LV2_UI__PortNotification LV2_UI_PREFIX "PortNotification" ///< http://lv2plug.in/ns/extensions/ui#PortNotification |
|
|
|
#define LV2_UI__PortProtocol LV2_UI_PREFIX "PortProtocol" ///< http://lv2plug.in/ns/extensions/ui#PortProtocol |
|
|
|
#define LV2_UI__Qt4UI LV2_UI_PREFIX "Qt4UI" ///< http://lv2plug.in/ns/extensions/ui#Qt4UI |
|
|
|
#define LV2_UI__Qt5UI LV2_UI_PREFIX "Qt5UI" ///< http://lv2plug.in/ns/extensions/ui#Qt5UI |
|
|
|
#define LV2_UI__UI LV2_UI_PREFIX "UI" ///< http://lv2plug.in/ns/extensions/ui#UI |
|
|
|
#define LV2_UI__WindowsUI LV2_UI_PREFIX "WindowsUI" ///< http://lv2plug.in/ns/extensions/ui#WindowsUI |
|
|
|
#define LV2_UI__X11UI LV2_UI_PREFIX "X11UI" ///< http://lv2plug.in/ns/extensions/ui#X11UI |
|
|
|
#define LV2_UI__backgroundColor LV2_UI_PREFIX "backgroundColor" ///< http://lv2plug.in/ns/extensions/ui#backgroundColor |
|
|
|
#define LV2_UI__binary LV2_UI_PREFIX "binary" ///< http://lv2plug.in/ns/extensions/ui#binary |
|
|
|
#define LV2_UI__fixedSize LV2_UI_PREFIX "fixedSize" ///< http://lv2plug.in/ns/extensions/ui#fixedSize |
|
|
|
#define LV2_UI__foregroundColor LV2_UI_PREFIX "foregroundColor" ///< http://lv2plug.in/ns/extensions/ui#foregroundColor |
|
|
|
#define LV2_UI__idleInterface LV2_UI_PREFIX "idleInterface" ///< http://lv2plug.in/ns/extensions/ui#idleInterface |
|
|
|
#define LV2_UI__noUserResize LV2_UI_PREFIX "noUserResize" ///< http://lv2plug.in/ns/extensions/ui#noUserResize |
|
|
|
#define LV2_UI__notifyType LV2_UI_PREFIX "notifyType" ///< http://lv2plug.in/ns/extensions/ui#notifyType |
|
|
|
#define LV2_UI__parent LV2_UI_PREFIX "parent" ///< http://lv2plug.in/ns/extensions/ui#parent |
|
|
|
#define LV2_UI__plugin LV2_UI_PREFIX "plugin" ///< http://lv2plug.in/ns/extensions/ui#plugin |
|
|
|
#define LV2_UI__portIndex LV2_UI_PREFIX "portIndex" ///< http://lv2plug.in/ns/extensions/ui#portIndex |
|
|
|
#define LV2_UI__portMap LV2_UI_PREFIX "portMap" ///< http://lv2plug.in/ns/extensions/ui#portMap |
|
|
|
#define LV2_UI__portNotification LV2_UI_PREFIX "portNotification" ///< http://lv2plug.in/ns/extensions/ui#portNotification |
|
|
|
#define LV2_UI__portSubscribe LV2_UI_PREFIX "portSubscribe" ///< http://lv2plug.in/ns/extensions/ui#portSubscribe |
|
|
|
#define LV2_UI__protocol LV2_UI_PREFIX "protocol" ///< http://lv2plug.in/ns/extensions/ui#protocol |
|
|
|
#define LV2_UI__floatProtocol LV2_UI_PREFIX "floatProtocol" ///< http://lv2plug.in/ns/extensions/ui#floatProtocol |
|
|
|
#define LV2_UI__peakProtocol LV2_UI_PREFIX "peakProtocol" ///< http://lv2plug.in/ns/extensions/ui#peakProtocol |
|
|
|
#define LV2_UI__requestValue LV2_UI_PREFIX "requestValue" ///< http://lv2plug.in/ns/extensions/ui#requestValue |
|
|
|
#define LV2_UI__resize LV2_UI_PREFIX "resize" ///< http://lv2plug.in/ns/extensions/ui#resize |
|
|
|
#define LV2_UI__scaleFactor LV2_UI_PREFIX "scaleFactor" ///< http://lv2plug.in/ns/extensions/ui#scaleFactor |
|
|
|
#define LV2_UI__showInterface LV2_UI_PREFIX "showInterface" ///< http://lv2plug.in/ns/extensions/ui#showInterface |
|
|
|
#define LV2_UI__touch LV2_UI_PREFIX "touch" ///< http://lv2plug.in/ns/extensions/ui#touch |
|
|
|
#define LV2_UI__ui LV2_UI_PREFIX "ui" ///< http://lv2plug.in/ns/extensions/ui#ui |
|
|
|
#define LV2_UI__updateRate LV2_UI_PREFIX "updateRate" ///< http://lv2plug.in/ns/extensions/ui#updateRate |
|
|
|
#define LV2_UI__windowTitle LV2_UI_PREFIX "windowTitle" ///< http://lv2plug.in/ns/extensions/ui#windowTitle |
|
|
|
|
|
|
|
/** |
|
|
|
The index returned by LV2_UI_Port_Port::port_index() for unknown ports. |
|
|
|
The index returned by LV2UI_Port_Map::port_index() for unknown ports. |
|
|
|
*/ |
|
|
|
#define LV2UI_INVALID_PORT_INDEX ((uint32_t)-1) |
|
|
|
|
|
|
@@ -99,18 +111,21 @@ typedef void* LV2UI_Feature_Handle; |
|
|
|
/** |
|
|
|
A host-provided function that sends data to a plugin's input ports. |
|
|
|
|
|
|
|
The @p buffer parameter must point to a block of data, @p buffer_size bytes |
|
|
|
large. The format of this data and how the host should use it is defined by |
|
|
|
the @p port_protocol. This buffer is owned by the UI and is only valid for |
|
|
|
the duration of this call. |
|
|
|
@param controller The opaque controller pointer passed to |
|
|
|
LV2UI_Descriptor::instantiate(). |
|
|
|
|
|
|
|
@param port_index Index of the port to update. |
|
|
|
|
|
|
|
The @p port_protocol parameter should either be 0 or the URID for a |
|
|
|
ui:PortProtocol. If it is 0, the protocol is implicitly ui:floatProtocol, |
|
|
|
the port MUST be an lv2:ControlPort input, @p buffer MUST point to a single |
|
|
|
float value, and @p buffer_size MUST be sizeof(float). |
|
|
|
@param buffer Buffer containing `buffer_size` bytes of data. |
|
|
|
|
|
|
|
The UI SHOULD NOT use a protocol not supported by the host, but the host |
|
|
|
MUST gracefully ignore any protocol it does not understand. |
|
|
|
@param buffer_size Size of `buffer` in bytes. |
|
|
|
|
|
|
|
@param port_protocol Either 0 or the URID for a ui:PortProtocol. If 0, the |
|
|
|
protocol is implicitly ui:floatProtocol, the port MUST be an lv2:ControlPort |
|
|
|
input, `buffer` MUST point to a single float value, and `buffer_size` MUST |
|
|
|
be sizeof(float). The UI SHOULD NOT use a protocol not supported by the |
|
|
|
host, but the host MUST gracefully ignore any protocol it does not |
|
|
|
understand. |
|
|
|
*/ |
|
|
|
typedef void (*LV2UI_Write_Function)(LV2UI_Controller controller, |
|
|
|
uint32_t port_index, |
|
|
@@ -144,7 +159,7 @@ typedef struct _LV2UI_Descriptor { |
|
|
|
@param write_function A function that the UI can use to send data to the |
|
|
|
plugin's input ports. |
|
|
|
|
|
|
|
@param controller A handle for the plugin instance to be passed as the |
|
|
|
@param controller A handle for the UI instance to be passed as the |
|
|
|
first parameter of UI methods. |
|
|
|
|
|
|
|
@param widget (output) widget pointer. The UI points this at its main |
|
|
@@ -174,18 +189,18 @@ typedef struct _LV2UI_Descriptor { |
|
|
|
/** |
|
|
|
Tell the UI that something interesting has happened at a plugin port. |
|
|
|
|
|
|
|
What is "interesting" and how it is written to @p buffer is defined by |
|
|
|
@p format, which has the same meaning as in LV2UI_Write_Function(). |
|
|
|
What is "interesting" and how it is written to `buffer` is defined by |
|
|
|
`format`, which has the same meaning as in LV2UI_Write_Function(). |
|
|
|
Format 0 is a special case for lv2:ControlPort, where this function |
|
|
|
should be called when the port value changes (but not necessarily for |
|
|
|
every change), @p buffer_size must be sizeof(float), and @p buffer |
|
|
|
every change), `buffer_size` must be sizeof(float), and `buffer` |
|
|
|
points to a single IEEE-754 float. |
|
|
|
|
|
|
|
By default, the host should only call this function for lv2:ControlPort |
|
|
|
inputs. However, the UI can request updates for other ports statically |
|
|
|
with ui:portNotification or dynamicaly with ui:portSubscribe. |
|
|
|
|
|
|
|
The UI MUST NOT retain any reference to @p buffer after this function |
|
|
|
The UI MUST NOT retain any reference to `buffer` after this function |
|
|
|
returns, it is only valid for the duration of the call. |
|
|
|
|
|
|
|
This member may be NULL if the UI is not interested in any port events. |
|
|
@@ -202,7 +217,7 @@ typedef struct _LV2UI_Descriptor { |
|
|
|
|
|
|
|
This member may be set to NULL if the UI is not interested in supporting |
|
|
|
any extensions. This is similar to LV2_Descriptor::extension_data(). |
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
const void* (*extension_data)(const char* uri); |
|
|
|
} LV2UI_Descriptor; |
|
|
@@ -227,7 +242,8 @@ typedef struct _LV2UI_Resize { |
|
|
|
host about the size of the UI. |
|
|
|
|
|
|
|
When provided by the UI, the host may call this function to notify the |
|
|
|
UI that it should change its size accordingly. |
|
|
|
UI that it should change its size accordingly. In this case, the host |
|
|
|
must pass the LV2UI_Handle to provide access to the UI instance. |
|
|
|
|
|
|
|
@return 0 on success. |
|
|
|
*/ |
|
|
@@ -248,7 +264,7 @@ typedef struct _LV2UI_Port_Map { |
|
|
|
LV2UI_Feature_Handle handle; |
|
|
|
|
|
|
|
/** |
|
|
|
Get the index for the port with the given @p symbol. |
|
|
|
Get the index for the port with the given `symbol`. |
|
|
|
|
|
|
|
@return The index of the port, or LV2UI_INVALID_PORT_INDEX if no such |
|
|
|
port is found. |
|
|
@@ -272,7 +288,7 @@ typedef struct _LV2UI_Port_Subscribe { |
|
|
|
This means that the host will call the UI's port_event() function when |
|
|
|
the port value changes (as defined by protocol). |
|
|
|
|
|
|
|
Calling this function with the same @p port_index and @p port_protocol |
|
|
|
Calling this function with the same `port_index` and `port_protocol` |
|
|
|
as an already active subscription has no effect. |
|
|
|
|
|
|
|
@param handle The handle field of this struct. |
|
|
@@ -292,7 +308,7 @@ typedef struct _LV2UI_Port_Subscribe { |
|
|
|
This means that the host will cease calling calling port_event() when |
|
|
|
the port value changes. |
|
|
|
|
|
|
|
Calling this function with a @p port_index and @p port_protocol that |
|
|
|
Calling this function with a `port_index` and `port_protocol` that |
|
|
|
does not refer to an active port subscription has no effect. |
|
|
|
|
|
|
|
@param handle The handle field of this struct. |
|
|
@@ -332,6 +348,94 @@ typedef struct _LV2UI_Touch { |
|
|
|
bool grabbed); |
|
|
|
} LV2UI_Touch; |
|
|
|
|
|
|
|
/** |
|
|
|
A status code for LV2UI_Request_Value::request. |
|
|
|
*/ |
|
|
|
typedef enum { |
|
|
|
/** |
|
|
|
Completed successfully. |
|
|
|
|
|
|
|
The host will set the parameter later if the user choses a new value. |
|
|
|
*/ |
|
|
|
LV2UI_REQUEST_VALUE_SUCCESS, |
|
|
|
|
|
|
|
/** |
|
|
|
Parameter already being requested. |
|
|
|
|
|
|
|
The host is already requesting a parameter from the user (for example, a |
|
|
|
dialog is visible), or the UI is otherwise busy and can not make this |
|
|
|
request. |
|
|
|
*/ |
|
|
|
LV2UI_REQUEST_VALUE_BUSY, |
|
|
|
|
|
|
|
/** |
|
|
|
Unknown parameter. |
|
|
|
|
|
|
|
The host is not aware of this parameter, and is not able to set a new |
|
|
|
value for it. |
|
|
|
*/ |
|
|
|
LV2UI_REQUEST_VALUE_ERR_UNKNOWN, |
|
|
|
|
|
|
|
/** |
|
|
|
Unsupported parameter. |
|
|
|
|
|
|
|
The host knows about this parameter, but does not support requesting a |
|
|
|
new value for it from the user. This is likely because the host does |
|
|
|
not have UI support for choosing a value with the appropriate type. |
|
|
|
*/ |
|
|
|
LV2UI_REQUEST_VALUE_ERR_UNSUPPORTED |
|
|
|
} LV2UI_Request_Value_Status; |
|
|
|
|
|
|
|
/** |
|
|
|
A feature to request a new parameter value from the host. |
|
|
|
*/ |
|
|
|
typedef struct { |
|
|
|
/** |
|
|
|
Pointer to opaque data which must be passed to request(). |
|
|
|
*/ |
|
|
|
LV2UI_Feature_Handle handle; |
|
|
|
|
|
|
|
/** |
|
|
|
Request a value for a parameter from the host. |
|
|
|
|
|
|
|
This is mainly used by UIs to request values for complex parameters that |
|
|
|
don't change often, such as file paths, but it may be used to request |
|
|
|
any parameter value. |
|
|
|
|
|
|
|
This function returns immediately, and the return value indicates |
|
|
|
whether the host can fulfill the request. The host may notify the |
|
|
|
plugin about the new parameter value, for example when a file is |
|
|
|
selected by the user, via the usual mechanism. Typically, the host will |
|
|
|
send a message to the plugin that sets the new parameter value, and the |
|
|
|
plugin will notify the UI via a message as usual for any other parameter |
|
|
|
change. |
|
|
|
|
|
|
|
To provide an appropriate UI, the host can determine details about the |
|
|
|
parameter from the plugin data as usual. The additional parameters of |
|
|
|
this function provide support for more advanced use cases, but in the |
|
|
|
simple common case, the plugin will simply pass the key of the desired |
|
|
|
parameter and zero for everything else. |
|
|
|
|
|
|
|
@param handle The handle field of this struct. |
|
|
|
|
|
|
|
@param key The URID of the parameter. |
|
|
|
|
|
|
|
@param type The optional type of the value to request. This can be used |
|
|
|
to request a specific value type for parameters that support several. |
|
|
|
If non-zero, it must be the URID of an instance of rdfs:Class or |
|
|
|
rdfs:Datatype. |
|
|
|
|
|
|
|
@param features Additional features for this request, or NULL. |
|
|
|
|
|
|
|
@return A status code which is 0 on success. |
|
|
|
*/ |
|
|
|
LV2UI_Request_Value_Status (*request)(LV2UI_Feature_Handle handle, |
|
|
|
LV2_URID key, |
|
|
|
LV2_URID type, |
|
|
|
const LV2_Feature* const* features); |
|
|
|
|
|
|
|
} LV2UI_Request_Value; |
|
|
|
|
|
|
|
/** |
|
|
|
UI Idle Interface (LV2_UI__idleInterface) |
|
|
|
|
|
|
@@ -429,3 +533,7 @@ typedef const LV2UI_Descriptor* (*LV2UI_DescriptorFunction)(uint32_t index); |
|
|
|
#endif |
|
|
|
|
|
|
|
#endif /* LV2_UI_H */ |
|
|
|
|
|
|
|
/** |
|
|
|
@} |
|
|
|
*/ |