| @@ -1 +1 @@ | |||
| Subproject commit 51028655d09c9a21fc51cadd7bc48210295aa791 | |||
| Subproject commit 37b294bdd2a340a0a8a7e05523c95c46789f32a6 | |||
| @@ -37,6 +37,9 @@ static bool host_is_offline(NativeHostHandle); | |||
| static const NativeTimeInfo* host_get_time_info(NativeHostHandle handle); | |||
| static bool host_write_midi_event(NativeHostHandle handle, const NativeMidiEvent* event); | |||
| static void host_ui_parameter_changed(NativeHostHandle handle, uint32_t index, float value); | |||
| static void host_ui_midi_program_changed(NativeHostHandle handle, uint8_t channel, uint32_t bank, uint32_t program); | |||
| static void host_ui_custom_data_changed(NativeHostHandle handle, const char* key, const char* value); | |||
| static void host_ui_closed(NativeHostHandle handle); | |||
| static const char* host_ui_open_file(NativeHostHandle handle, bool isDir, const char* title, const char* filter); | |||
| static const char* host_ui_save_file(NativeHostHandle handle, bool isDir, const char* title, const char* filter); | |||
| static intptr_t host_dispatcher(NativeHostHandle handle, NativeHostDispatcherOpcode opcode, int32_t index, intptr_t value, void* ptr, float opt); | |||
| @@ -102,9 +105,9 @@ public: | |||
| fCarlaHostDescriptor.get_time_info = host_get_time_info; | |||
| fCarlaHostDescriptor.write_midi_event = host_write_midi_event; | |||
| fCarlaHostDescriptor.ui_parameter_changed = host_ui_parameter_changed; | |||
| fCarlaHostDescriptor.ui_midi_program_changed = nullptr; | |||
| fCarlaHostDescriptor.ui_custom_data_changed = nullptr; | |||
| fCarlaHostDescriptor.ui_closed = nullptr; | |||
| fCarlaHostDescriptor.ui_midi_program_changed = host_ui_midi_program_changed; | |||
| fCarlaHostDescriptor.ui_custom_data_changed = host_ui_custom_data_changed; | |||
| fCarlaHostDescriptor.ui_closed = host_ui_closed; | |||
| fCarlaHostDescriptor.ui_open_file = host_ui_open_file; | |||
| fCarlaHostDescriptor.ui_save_file = host_ui_save_file; | |||
| fCarlaHostDescriptor.dispatcher = host_dispatcher; | |||
| @@ -484,6 +487,21 @@ static void host_ui_parameter_changed(const NativeHostHandle handle, const uint3 | |||
| ildaeilParameterChangeForUI(static_cast<IldaeilPlugin*>(handle)->fUI, index, value); | |||
| } | |||
| static void host_ui_midi_program_changed(NativeHostHandle handle, uint8_t channel, uint32_t bank, uint32_t program) | |||
| { | |||
| d_stdout("%s %p %u %u %u", __FUNCTION__, handle, channel, bank, program); | |||
| } | |||
| static void host_ui_custom_data_changed(NativeHostHandle handle, const char* key, const char* value) | |||
| { | |||
| d_stdout("%s %p %s %s", __FUNCTION__, handle, key, value); | |||
| } | |||
| static void host_ui_closed(NativeHostHandle handle) | |||
| { | |||
| d_stdout("%s %p", __FUNCTION__, handle); | |||
| } | |||
| static const char* host_ui_open_file(const NativeHostHandle handle, const bool isDir, const char* const title, const char* const filter) | |||
| { | |||
| return ildaeilOpenFileForUI(static_cast<IldaeilPlugin*>(handle)->fUI, isDir, title, filter); | |||
| @@ -170,6 +170,8 @@ class IldaeilUI : public UI, | |||
| String fPopupError; | |||
| Size<uint> fNextSize; | |||
| public: | |||
| IldaeilUI() | |||
| : UI(kInitialWidth, kInitialHeight), | |||
| @@ -303,7 +305,7 @@ public: | |||
| updatePluginGenericUI(handle); | |||
| ImGuiStyle& style(ImGui::GetStyle()); | |||
| const double scaleFactor = getScaleFactor(); | |||
| setSize(kGenericWidth * scaleFactor, (kGenericHeight + style.FramePadding.x) * scaleFactor); | |||
| fNextSize = Size<uint>(kGenericWidth * scaleFactor, (kGenericHeight + style.FramePadding.x) * scaleFactor); | |||
| } | |||
| repaint(); | |||
| @@ -433,9 +435,10 @@ public: | |||
| } | |||
| protected: | |||
| void pluginWindowResized(uint width, uint height) override | |||
| void pluginWindowResized(const uint width, const uint height) override | |||
| { | |||
| setSize(width, height + kButtonHeight * getScaleFactor() + ImGui::GetStyle().WindowPadding.y * 2); | |||
| fNextSize = Size<uint>(width, | |||
| height + kButtonHeight * getScaleFactor() + ImGui::GetStyle().WindowPadding.y * 2); | |||
| } | |||
| void uiIdle() override | |||
| @@ -465,6 +468,13 @@ protected: | |||
| default: | |||
| break; | |||
| } | |||
| if (fNextSize.isValid()) | |||
| { | |||
| setSize(fNextSize); | |||
| fNextSize = Size<uint>(); | |||
| return; | |||
| } | |||
| } | |||
| void uiFileBrowserSelected(const char* const filename) override | |||
| @@ -554,7 +564,6 @@ protected: | |||
| drawTopBar(); | |||
| break; | |||
| } | |||
| } | |||
| void drawError(const bool open) | |||
| @@ -619,7 +628,7 @@ protected: | |||
| fDrawingState = kDrawingPluginList; | |||
| const double scaleFactor = getScaleFactor(); | |||
| setSize(kInitialWidth * scaleFactor, kInitialHeight * scaleFactor); | |||
| fNextSize = Size<uint>(kInitialWidth * scaleFactor, kInitialHeight * scaleFactor); | |||
| } | |||
| ImGui::SameLine(); | |||
| @@ -666,8 +675,8 @@ protected: | |||
| const double scaleFactor = getScaleFactor(); | |||
| const double padding = ImGui::GetStyle().WindowPadding.y * 2; | |||
| setSize(std::max(getWidth(), static_cast<uint>(kGenericWidth * scaleFactor + 0.5)), | |||
| (kGenericHeight + kButtonHeight) * scaleFactor + padding); | |||
| fNextSize = Size<uint>(std::max(getWidth(), static_cast<uint>(kGenericWidth * scaleFactor + 0.5)), | |||
| (kGenericHeight + kButtonHeight) * scaleFactor + padding); | |||
| } | |||
| } | |||
| } | |||
| @@ -21,6 +21,8 @@ | |||
| #elif defined(DISTRHO_OS_MAC) | |||
| # import <Cocoa/Cocoa.h> | |||
| #elif defined(DISTRHO_OS_WINDOWS) | |||
| # define WIN32_LEAN_AND_MEAN | |||
| # include <windows.h> | |||
| #else | |||
| # define ILDAEIL_X11 | |||
| # include <X11/Xlib.h> | |||
| @@ -67,11 +69,12 @@ struct PluginHostWindow::PrivateData | |||
| #elif defined(DISTRHO_OS_MAC) | |||
| IldaeilPluginView* view; | |||
| #elif defined(DISTRHO_OS_WINDOWS) | |||
| ::HWND pluginWindow; | |||
| #else | |||
| ::Display* display; | |||
| ::Window pluginWindow; | |||
| uint xOffset, yOffset; | |||
| #endif | |||
| uint xOffset, yOffset; | |||
| bool lookingForChildren; | |||
| @@ -83,12 +86,13 @@ struct PluginHostWindow::PrivateData | |||
| #elif defined(DISTRHO_OS_MAC) | |||
| view(nullptr), | |||
| #elif defined(DISTRHO_OS_WINDOWS) | |||
| pluginWindow(nullptr), | |||
| #else | |||
| display(nullptr), | |||
| pluginWindow(0), | |||
| #endif | |||
| xOffset(0), | |||
| yOffset(0), | |||
| #endif | |||
| lookingForChildren(false) | |||
| { | |||
| #if defined(DISTRHO_OS_HAIKU) | |||
| @@ -128,7 +132,8 @@ struct PluginHostWindow::PrivateData | |||
| #elif defined(DISTRHO_OS_MAC) | |||
| return view; | |||
| #elif defined(DISTRHO_OS_WINDOWS) | |||
| return nullptr; | |||
| pluginWindow = nullptr; | |||
| return (void*)parentWindowId; | |||
| #else | |||
| pluginWindow = 0; | |||
| return (void*)parentWindowId; | |||
| @@ -143,6 +148,11 @@ struct PluginHostWindow::PrivateData | |||
| [view setHidden:YES]; | |||
| [NSOpenGLContext clearCurrentContext]; | |||
| #elif defined(DISTRHO_OS_WINDOWS) | |||
| if (pluginWindow != nullptr) | |||
| { | |||
| ShowWindow(pluginWindow, SW_HIDE); | |||
| pluginWindow = nullptr; | |||
| } | |||
| #else | |||
| pluginWindow = 0; | |||
| #endif | |||
| @@ -175,6 +185,31 @@ struct PluginHostWindow::PrivateData | |||
| break; | |||
| } | |||
| #elif defined(DISTRHO_OS_WINDOWS) | |||
| if (pluginWindow == nullptr) | |||
| pluginWindow = FindWindowExA((::HWND)parentWindowId, nullptr, nullptr, nullptr); | |||
| if (pluginWindow != nullptr) | |||
| { | |||
| int width = 0; | |||
| int height = 0; | |||
| RECT rect; | |||
| if (GetWindowRect(pluginWindow, &rect)) | |||
| { | |||
| width = rect.right - rect.left; | |||
| height = rect.bottom - rect.top; | |||
| } | |||
| d_stdout("child window bounds %u %u | offset %u %u", width, height, xOffset, yOffset); | |||
| if (width > 1 && height > 1) | |||
| { | |||
| lookingForChildren = false; | |||
| SetWindowPos(pluginWindow, 0, xOffset, yOffset, 0, 0, | |||
| SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOOWNERZORDER | SWP_NOZORDER); | |||
| pluginWindowCallbacks->pluginWindowResized(width, height); | |||
| } | |||
| } | |||
| #else | |||
| if (pluginWindow == 0) | |||
| { | |||
| @@ -260,13 +295,16 @@ struct PluginHostWindow::PrivateData | |||
| [view setFrame:NSMakeRect(x / scaleFactor, y / scaleFactor, width / scaleFactor, height / scaleFactor)]; | |||
| } | |||
| #elif defined(DISTRHO_OS_WINDOWS) | |||
| // unused | |||
| (void)width; | |||
| (void)height; | |||
| #else | |||
| xOffset = x; | |||
| yOffset = y; | |||
| // unused | |||
| (void)width; | |||
| (void)height; | |||
| #endif | |||
| xOffset = x; | |||
| yOffset = y; | |||
| } | |||
| }; | |||