view.h (5268B)
1 /* 2 * travesty, pure C VST3-compatible interface 3 * Copyright (C) 2021-2023 Filipe Coelho <falktx@falktx.com> 4 * 5 * Permission to use, copy, modify, and/or distribute this software for any purpose with 6 * or without fee is hereby granted, provided that the above copyright notice and this 7 * permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD 10 * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN 11 * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 12 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER 13 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 #pragma once 18 19 #include "base.h" 20 21 /** 22 * base view stuff 23 */ 24 25 struct v3_view_rect { 26 int32_t left; 27 int32_t top; 28 int32_t right; 29 int32_t bottom; 30 }; 31 32 #define V3_VIEW_PLATFORM_TYPE_HWND "HWND" 33 #define V3_VIEW_PLATFORM_TYPE_NSVIEW "NSView" 34 #define V3_VIEW_PLATFORM_TYPE_X11 "X11EmbedWindowID" 35 36 #if defined(__APPLE__) 37 # define V3_VIEW_PLATFORM_TYPE_NATIVE V3_VIEW_PLATFORM_TYPE_NSVIEW 38 #elif defined(_WIN32) 39 # define V3_VIEW_PLATFORM_TYPE_NATIVE V3_VIEW_PLATFORM_TYPE_HWND 40 #elif !defined(__EMSCRIPTEN__) 41 # define V3_VIEW_PLATFORM_TYPE_NATIVE V3_VIEW_PLATFORM_TYPE_X11 42 #endif 43 44 /** 45 * plugin view 46 */ 47 48 struct v3_plugin_frame; 49 50 struct v3_plugin_view { 51 #ifndef __cplusplus 52 struct v3_funknown; 53 #endif 54 v3_result (V3_API* is_platform_type_supported)(void* self, const char* platform_type); 55 v3_result (V3_API* attached)(void* self, void* parent, const char* platform_type); 56 v3_result (V3_API* removed)(void* self); 57 v3_result (V3_API* on_wheel)(void* self, float distance); 58 v3_result (V3_API* on_key_down)(void* self, int16_t key_char, int16_t key_code, int16_t modifiers); 59 v3_result (V3_API* on_key_up)(void* self, int16_t key_char, int16_t key_code, int16_t modifiers); 60 v3_result (V3_API* get_size)(void* self, struct v3_view_rect*); 61 v3_result (V3_API* on_size)(void* self, struct v3_view_rect*); 62 v3_result (V3_API* on_focus)(void* self, v3_bool state); 63 v3_result (V3_API* set_frame)(void* self, struct v3_plugin_frame**); 64 v3_result (V3_API* can_resize)(void* self); 65 v3_result (V3_API* check_size_constraint)(void* self, struct v3_view_rect*); 66 }; 67 68 static constexpr const v3_tuid v3_plugin_view_iid = 69 V3_ID(0x5BC32507, 0xD06049EA, 0xA6151B52, 0x2B755B29); 70 71 /** 72 * plugin frame 73 */ 74 75 struct v3_plugin_frame { 76 #ifndef __cplusplus 77 struct v3_funknown; 78 #endif 79 v3_result (V3_API* resize_view)(void* self, struct v3_plugin_view**, struct v3_view_rect*); 80 }; 81 82 static constexpr const v3_tuid v3_plugin_frame_iid = 83 V3_ID(0x367FAF01, 0xAFA94693, 0x8D4DA2A0, 0xED0882A3); 84 85 /** 86 * steinberg content scaling support 87 * (same IID/iface as presonus view scaling) 88 */ 89 90 struct v3_plugin_view_content_scale { 91 #ifndef __cplusplus 92 struct v3_funknown; 93 #endif 94 v3_result (V3_API* set_content_scale_factor)(void* self, float factor); 95 }; 96 97 static constexpr const v3_tuid v3_plugin_view_content_scale_iid = 98 V3_ID(0x65ED9690, 0x8AC44525, 0x8AADEF7A, 0x72EA703F); 99 100 /** 101 * support for querying the view to find what control is underneath the mouse 102 */ 103 104 struct v3_plugin_view_parameter_finder { 105 #ifndef __cplusplus 106 struct v3_funknown; 107 #endif 108 v3_result (V3_API* find_parameter)(void* self, int32_t x, int32_t y, v3_param_id *); 109 }; 110 111 static constexpr const v3_tuid v3_plugin_view_parameter_finder_iid = 112 V3_ID(0x0F618302, 0x215D4587, 0xA512073C, 0x77B9D383); 113 114 /** 115 * linux event handler 116 */ 117 118 struct v3_event_handler { 119 #ifndef __cplusplus 120 struct v3_funknown; 121 #endif 122 void (V3_API* on_fd_is_set)(void* self, int fd); 123 }; 124 125 static constexpr const v3_tuid v3_event_handler_iid = 126 V3_ID(0x561E65C9, 0x13A0496F, 0x813A2C35, 0x654D7983); 127 128 /** 129 * linux timer handler 130 */ 131 132 struct v3_timer_handler { 133 #ifndef __cplusplus 134 struct v3_funknown; 135 #endif 136 void (V3_API* on_timer)(void* self); 137 }; 138 139 static constexpr const v3_tuid v3_timer_handler_iid = 140 V3_ID(0x10BDD94F, 0x41424774, 0x821FAD8F, 0xECA72CA9); 141 142 /** 143 * linux host run loop 144 */ 145 146 struct v3_run_loop { 147 #ifndef __cplusplus 148 struct v3_funknown; 149 #endif 150 v3_result (V3_API* register_event_handler)(void* self, v3_event_handler** handler, int fd); 151 v3_result (V3_API* unregister_event_handler)(void* self, v3_event_handler** handler); 152 v3_result (V3_API* register_timer)(void* self, v3_timer_handler** handler, uint64_t ms); 153 v3_result (V3_API* unregister_timer)(void* self, v3_timer_handler** handler); 154 }; 155 156 static constexpr const v3_tuid v3_run_loop_iid = 157 V3_ID(0x18C35366, 0x97764F1A, 0x9C5B8385, 0x7A871389); 158 159 #ifdef __cplusplus 160 161 /** 162 * C++ variants 163 */ 164 165 struct v3_plugin_view_cpp : v3_funknown { 166 v3_plugin_view view; 167 }; 168 169 struct v3_plugin_frame_cpp : v3_funknown { 170 v3_plugin_frame frame; 171 }; 172 173 struct v3_plugin_view_content_scale_cpp : v3_funknown { 174 v3_plugin_view_content_scale scale; 175 }; 176 177 struct v3_plugin_view_parameter_finder_cpp : v3_funknown { 178 v3_plugin_view_parameter_finder finder; 179 }; 180 181 struct v3_event_handler_cpp : v3_funknown { 182 v3_event_handler handler; 183 }; 184 185 struct v3_timer_handler_cpp : v3_funknown { 186 v3_timer_handler timer; 187 }; 188 189 struct v3_run_loop_cpp : v3_funknown { 190 v3_run_loop loop; 191 }; 192 193 #endif