@@ -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; | |||
} | |||
}; | |||