From 4b982ef895e1e5d36b0be0b20e7a2810e3f16945 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 7 Mar 2017 03:22:13 +0100 Subject: Prepare moving to a dedicated x-thread signal for VST UI resizing (this changes the internal API, pending follow-up GUI update) --- libs/ardour/ardour/vst_plugin.h | 1 + libs/ardour/ardour/vst_types.h | 72 +++++++++++++++++++---------------------- libs/ardour/session_vst.cc | 11 +++++-- libs/fst/vstwin.c | 33 +++++++++++++++++-- 4 files changed, 73 insertions(+), 44 deletions(-) diff --git a/libs/ardour/ardour/vst_plugin.h b/libs/ardour/ardour/vst_plugin.h index b35ef6b25e..bb172d9efd 100644 --- a/libs/ardour/ardour/vst_plugin.h +++ b/libs/ardour/ardour/vst_plugin.h @@ -62,6 +62,7 @@ public: std::set automatable() const; PBD::Signal0 LoadPresetProgram; + PBD::Signal0 VSTSizeWindow; bool parameter_is_audio (uint32_t) const { return false; } bool parameter_is_control (uint32_t) const { return true; } diff --git a/libs/ardour/ardour/vst_types.h b/libs/ardour/ardour/vst_types.h index 21e9ea01fc..9e9269e5c0 100644 --- a/libs/ardour/ardour/vst_types.h +++ b/libs/ardour/ardour/vst_types.h @@ -77,24 +77,21 @@ typedef struct _VSTHandle VSTHandle; struct LIBARDOUR_API _VSTState { - AEffect* plugin; + AEffect* plugin; + VSTHandle* handle; + audioMasterCallback amc; + + void* gtk_window_parent; + int xid; ///< X11 XWindow (wine + lxvst) - /* Linux */ + /* LXVST/X11 */ int linux_window; ///< The plugin's parent X11 XWindow int linux_plugin_ui_window; ///< The ID of the plugin UI window created by the plugin + void (* eventProc) (void * event); ///< X11 UI _XEventProc /* Windows */ void* windows_window; - int xid; ///< X11 XWindow - - int want_resize; ///< Set to signal the plugin resized its UI - void* extra_data; ///< Pointer to any extra data - - void * event_callback_thisptr; - void (* eventProc) (void * event); - - VSTHandle* handle; int width; int height; @@ -107,33 +104,32 @@ struct LIBARDOUR_API _VSTState int vst_version; int has_editor; - int program_set_without_editor; - - int want_program; - int want_chunk; - int n_pending_keys; - unsigned char * wanted_chunk; - int wanted_chunk_size; - float * want_params; - float * set_params; - - VSTKey pending_keys[16]; - - int dispatcher_wantcall; - int dispatcher_opcode; - int dispatcher_index; - int dispatcher_val; - void * dispatcher_ptr; - float dispatcher_opt; - int dispatcher_retval; - - struct _VSTState * next; - pthread_mutex_t lock; - pthread_mutex_t state_lock; - pthread_cond_t window_status_change; - pthread_cond_t plugin_dispatcher_called; - pthread_cond_t window_created; - int been_activated; + int program_set_without_editor; + int want_program; + int want_chunk; + int n_pending_keys; + unsigned char* wanted_chunk; + int wanted_chunk_size; + float* want_params; + float* set_params; + + VSTKey pending_keys[16]; + + int dispatcher_wantcall; + int dispatcher_opcode; + int dispatcher_index; + int dispatcher_val; + void* dispatcher_ptr; + float dispatcher_opt; + int dispatcher_retval; + + struct _VSTState* next; + pthread_mutex_t lock; + pthread_mutex_t state_lock; + pthread_cond_t window_status_change; + pthread_cond_t plugin_dispatcher_called; + pthread_cond_t window_created; + int been_activated; }; typedef struct _VSTState VSTState; diff --git a/libs/ardour/session_vst.cc b/libs/ardour/session_vst.cc index db097fa5b0..5ba77a9a6e 100644 --- a/libs/ardour/session_vst.cc +++ b/libs/ardour/session_vst.cc @@ -337,9 +337,14 @@ intptr_t Session::vst_callback ( case audioMasterSizeWindow: SHOW_CALLBACK ("audioMasterSizeWindow"); if (plug && plug->state()) { - plug->state()->width = index; - plug->state()->height = value; - plug->state()->want_resize = 1; + if (plug->state()->width != index || plug->state()->height != value) { + plug->state()->width = index; + plug->state()->height = value; +#ifndef NDEBUG + printf ("audioMasterSizeWindow %d %d\n", plug->state()->width, plug->state()->height); +#endif + plug->VSTSizeWindow (); /* EMIT SIGNAL */ + } } return 0; diff --git a/libs/fst/vstwin.c b/libs/fst/vstwin.c index 0668bbf033..065f50e954 100644 --- a/libs/fst/vstwin.c +++ b/libs/fst/vstwin.c @@ -48,6 +48,27 @@ vstedit_wndproc (HWND w, UINT msg, WPARAM wp, LPARAM lp) case WM_KEYDOWN: break; + case WM_SIZE: +#ifdef PLATFORM_WINDOWS + { + LRESULT rv = DefWindowProcA (w, msg, wp, lp); + RECT rect; + GetClientRect(w, &rect); +#ifndef NDEBUG + printf("VST WM_SIZE.. %ld %ld %ld %ld\n", rect.top, rect.left, (rect.right - rect.left), (rect.bottom - rect.top)); +#endif + VSTState* fst = (VSTState*) GetProp (w, "fst_ptr"); + if (fst) { + int32_t width = (rect.right - rect.left); + int32_t height = (rect.bottom - rect.top); + if (width > 0 && height > 0) { + fst->amc (fst->plugin, 15 /*audioMasterSizeWindow */, width, height, NULL, 0); + } + } + return rv; + } +#endif + break; case WM_CLOSE: /* we don't care about windows closing ... * WM_CLOSE is used for minimizing the window. @@ -68,7 +89,7 @@ vstedit_wndproc (HWND w, UINT msg, WPARAM wp, LPARAM lp) break; } - return DefWindowProcA (w, msg, wp, lp ); + return DefWindowProcA (w, msg, wp, lp); } @@ -196,7 +217,7 @@ fst_new (void) vststate_init (fst); #ifdef PLATFORM_WINDOWS - fst->voffset = 50; + fst->voffset = 45; fst->hoffset = 0; #else /* linux + wine */ fst->voffset = 24; @@ -441,11 +462,16 @@ fst_move_window_into_view (VSTState* fst) { if (fst->windows_window) { #ifdef PLATFORM_WINDOWS - SetWindowPos ((HWND)(fst->windows_window), 0, fst->hoffset, fst->voffset, fst->width + fst->hoffset, fst->height + fst->voffset, 0); + SetWindowPos ((HWND)(fst->windows_window), + HWND_TOP /*0*/, + fst->hoffset, fst->voffset, + fst->width, fst->height, + SWP_NOACTIVATE|SWP_NOOWNERZORDER); #else /* linux + wine */ SetWindowPos ((HWND)(fst->windows_window), 0, 0, 0, fst->width + fst->hoffset, fst->height + fst->voffset, 0); #endif ShowWindow ((HWND)(fst->windows_window), SW_SHOWNA); + UpdateWindow ((HWND)(fst->windows_window)); } } @@ -534,6 +560,7 @@ fst_instantiate (VSTHandle* fhandle, audioMasterCallback amc, void* userptr) } fst = fst_new (); + fst->amc = amc; if ((fst->plugin = fhandle->main_entry (amc)) == NULL) { fst_error ("fst_instantiate: %s could not be instantiated\n", fhandle->name); -- cgit v1.2.3