win32 gui :-)

This commit is contained in:
Stefano D'Angelo 2024-05-31 17:27:58 +02:00
parent d8b5016960
commit 7c6589302a
2 changed files with 38 additions and 7 deletions

View File

@ -868,7 +868,9 @@ typedef struct controller {
static Steinberg_Vst_IEditControllerVtbl controllerVtblIEditController; static Steinberg_Vst_IEditControllerVtbl controllerVtblIEditController;
#ifdef DATA_UI #ifdef DATA_UI
# ifdef __linux__ # ifdef __linux__
# include <X11/Xlib.h> # include <X11/Xlib.h>
typedef struct { typedef struct {
@ -933,11 +935,18 @@ static Steinberg_ITimerHandlerVtbl timerHandlerVtblITimerHandler = {
/* ITimerHandler */ /* ITimerHandler */
/* .onTimer = */ timerHandlerOnTimer /* .onTimer = */ timerHandlerOnTimer
}; };
# elif defined(__APPLE__) # elif defined(__APPLE__)
# include <CoreFoundation/CoreFoundation.h> # include <CoreFoundation/CoreFoundation.h>
# include <objc/objc.h> # include <objc/objc.h>
# include <objc/runtime.h> # include <objc/runtime.h>
# include <objc/message.h> # include <objc/message.h>
# elif defined(_WIN32) || defined(__CYGWIN__)
# include <windows.h>
# endif # endif
typedef struct plugView { typedef struct plugView {
@ -952,6 +961,8 @@ typedef struct plugView {
Display * display; Display * display;
# elif defined(__APPLE__) # elif defined(__APPLE__)
CFRunLoopTimerRef timer; CFRunLoopTimerRef timer;
# elif defined(_WIN32) || defined(__CYGWIN__)
UINT_PTR timer;
# endif # endif
} plugView; } plugView;
@ -1008,7 +1019,7 @@ static Steinberg_tresult plugViewIsPlatformTypeSupported(void* thisInterface, St
(void)thisInterface; (void)thisInterface;
TRACE("plugView isPlatformTypeSupported %p %s\n", thisInterface, type); TRACE("plugView isPlatformTypeSupported %p %s\n", thisInterface, type);
# if defined(_WIN32) # if defined(_WIN32) || defined(__CYGWIN__)
return strcmp(type, "HWND") ? Steinberg_kResultFalse : Steinberg_kResultTrue; return strcmp(type, "HWND") ? Steinberg_kResultFalse : Steinberg_kResultTrue;
# elif defined(__APPLE__) && defined(__MACH__) # elif defined(__APPLE__) && defined(__MACH__)
return strcmp(type, "NSView") ? Steinberg_kResultFalse : Steinberg_kResultTrue; return strcmp(type, "NSView") ? Steinberg_kResultFalse : Steinberg_kResultTrue;
@ -1051,6 +1062,14 @@ static void plugViewTimerCb(CFRunLoopTimerRef timer, void *info) {
plugin_ui_idle(((plugView *)info)->ui); plugin_ui_idle(((plugView *)info)->ui);
} }
# elif defined(_WIN32) || defined(__CYGWIN__)
static void plugViewTimerCb(HWND p1, UINT p2, UINT_PTR p3, DWORD p4) {
(void)p1;
(void)p2;
(void)p4;
plugin_ui_idle(((plugView *)p3)->ui);
}
# endif # endif
static Steinberg_tresult plugViewAttached(void* thisInterface, void* parent, Steinberg_FIDString type) { static Steinberg_tresult plugViewAttached(void* thisInterface, void* parent, Steinberg_FIDString type) {
@ -1097,6 +1116,13 @@ static Steinberg_tresult plugViewAttached(void* thisInterface, void* parent, Ste
}; };
v->timer = CFRunLoopTimerCreate(NULL, CFAbsoluteTimeGetCurrent(), 20.0 / 1000.0, 0, 0, plugViewTimerCb, &ctx); v->timer = CFRunLoopTimerCreate(NULL, CFAbsoluteTimeGetCurrent(), 20.0 / 1000.0, 0, 0, plugViewTimerCb, &ctx);
CFRunLoopAddTimer(CFRunLoopGetCurrent(), v->timer, kCFRunLoopCommonModes); CFRunLoopAddTimer(CFRunLoopGetCurrent(), v->timer, kCFRunLoopCommonModes);
# elif defined(_WIN32) || defined(__CYGWIN__)
v->timer = SetTimer((HWND)*((char **)v->ui), (UINT_PTR)v, 20, (TIMERPROC)plugViewTimerCb);
if (v->timer == 0) {
plugin_ui_free(v->ui);
v->ui = NULL;
return Steinberg_kResultFalse;
}
# endif # endif
# if DATA_PRODUCT_PARAMETERS_N > 0 # if DATA_PRODUCT_PARAMETERS_N > 0
plugViewUpdateAllParameters(v); plugViewUpdateAllParameters(v);
@ -1113,6 +1139,8 @@ static Steinberg_tresult plugViewRemoved(void* thisInterface) {
# elif defined(__APPLE__) # elif defined(__APPLE__)
CFRunLoopTimerInvalidate(v->timer); CFRunLoopTimerInvalidate(v->timer);
CFRelease(v->timer); CFRelease(v->timer);
# elif defined(_WIN32) || defined(__CYGWIN__)
KillTimer((HWND)(*((char **)v->ui)), (UINT_PTR)v);
# endif # endif
plugin_ui_free(v->ui); plugin_ui_free(v->ui);
v->ui = NULL; v->ui = NULL;
@ -1187,7 +1215,9 @@ static Steinberg_tresult plugViewOnSize(void* thisInterface, struct Steinberg_Vi
# elif defined(__APPLE__) # elif defined(__APPLE__)
CGSize size = { newSize->right - newSize->left, newSize->bottom - newSize->top }; CGSize size = { newSize->right - newSize->left, newSize->bottom - newSize->top };
void (*f)(id, SEL, CGSize) = (void (*)(id, SEL, CGSize))objc_msgSend; void (*f)(id, SEL, CGSize) = (void (*)(id, SEL, CGSize))objc_msgSend;
f((id)(*((char**)v->ui)), sel_getUid("setFrameSize:"), size); f((id)(*((char **)v->ui)), sel_getUid("setFrameSize:"), size);
# elif defined(_WIN32) || defined(__CYGWIN__)
SetWindowPos((HWND)*((char **)v->ui), HWND_TOP, 0, 0, newSize->right - newSize->left, newSize->bottom - newSize->top, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER);
# endif # endif
return Steinberg_kResultTrue; return Steinberg_kResultTrue;
} }
@ -2021,10 +2051,10 @@ static Steinberg_IPluginFactory3Vtbl factoryVtbl = {
}; };
static Steinberg_IPluginFactory3 factory = { &factoryVtbl }; static Steinberg_IPluginFactory3 factory = { &factoryVtbl };
#ifdef _WIN32 #if defined(_WIN32) || defined(__CYGWIN__)
#define EXPORT __declspec(dllexport) # define EXPORT __declspec(dllexport)
#else #else
#define EXPORT __attribute__((visibility("default"))) # define EXPORT __attribute__((visibility("default")))
#endif #endif
EXPORT EXPORT
@ -2032,7 +2062,7 @@ Steinberg_IPluginFactory * GetPluginFactory(void) {
return (Steinberg_IPluginFactory *)&factory; return (Steinberg_IPluginFactory *)&factory;
} }
#ifndef _WIN32 #if !defined(_WIN32) && !defined(__CYGWIN__)
# if defined(__APPLE__) # if defined(__APPLE__)
# define ENTRY bundleEntry # define ENTRY bundleEntry
# define EXIT bundleExit # define EXIT bundleExit

View File

@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with Tibia. If not, see <http://www.gnu.org/licenses/>. * along with Tibia. If not, see <http://www.gnu.org/licenses/>.
* *
* File author: Stefano D'Angelo * File author: Stefano D'Angelo, Paolo Marrone
*/ */
#include <pugl/pugl.h> #include <pugl/pugl.h>
@ -141,6 +141,7 @@ static PuglStatus plugin_ui_on_event(PuglView *view, const PuglEvent *event) {
{ {
plugin_ui *instance = (plugin_ui *)puglGetHandle(view); plugin_ui *instance = (plugin_ui *)puglGetHandle(view);
plugin_ui_update_geometry(instance); plugin_ui_update_geometry(instance);
puglPostRedisplay(instance->view);
} }
break; break;
case PUGL_BUTTON_RELEASE: case PUGL_BUTTON_RELEASE: