From b1e13fa6fb0588d70246cf5289fcb446536bc92e Mon Sep 17 00:00:00 2001 From: falkTX Date: Tue, 17 Aug 2021 22:01:46 +0100 Subject: [PATCH] We need those things after all --- dpf/dgl/src/WindowPrivateData.cpp | 8 +++++++ dpf/dgl/src/pugl.cpp | 40 +++++++++++++++++++++++++++++++ dpf/dgl/src/pugl.hpp | 8 +++++++ 3 files changed, 56 insertions(+) diff --git a/dpf/dgl/src/WindowPrivateData.cpp b/dpf/dgl/src/WindowPrivateData.cpp index 89a7bb9..9dd7a8c 100644 --- a/dpf/dgl/src/WindowPrivateData.cpp +++ b/dpf/dgl/src/WindowPrivateData.cpp @@ -560,6 +560,10 @@ void Window::PrivateData::startModal() modal.parent->show(); show(); +#ifdef DISTRHO_OS_MAC + puglMacOSAddChildWindow(modal.parent->view, view); +#endif + DGL_DBG("Ok\n"); } @@ -576,6 +580,10 @@ void Window::PrivateData::stopModal() if (modal.parent->modal.child != this) return; +#ifdef DISTRHO_OS_MAC + puglMacOSRemoveChildWindow(modal.parent->view, view); +#endif + // stop parent from giving focus to us, so it behaves like normal modal.parent->modal.child = nullptr; diff --git a/dpf/dgl/src/pugl.cpp b/dpf/dgl/src/pugl.cpp index cff6b99..5997e22 100644 --- a/dpf/dgl/src/pugl.cpp +++ b/dpf/dgl/src/pugl.cpp @@ -407,6 +407,46 @@ void puglMacOSActivateApp() [NSApp activateIgnoringOtherApps:YES]; } +// -------------------------------------------------------------------------------------------------------------------- +// macOS specific, add another view's window as child + +PuglStatus +puglMacOSAddChildWindow(PuglView* const view, PuglView* const child) +{ + if (NSWindow* const viewWindow = view->impl->window ? view->impl->window + : [view->impl->wrapperView window]) + { + if (NSWindow* const childWindow = child->impl->window ? child->impl->window + : [child->impl->wrapperView window]) + { + [viewWindow addChildWindow:childWindow ordered:NSWindowAbove]; + return PUGL_SUCCESS; + } + } + + return PUGL_FAILURE; +} + +// -------------------------------------------------------------------------------------------------------------------- +// macOS specific, remove another view's window as child + +PuglStatus +puglMacOSRemoveChildWindow(PuglView* const view, PuglView* const child) +{ + if (NSWindow* const viewWindow = view->impl->window ? view->impl->window + : [view->impl->wrapperView window]) + { + if (NSWindow* const childWindow = child->impl->window ? child->impl->window + : [child->impl->wrapperView window]) + { + [viewWindow removeChildWindow:childWindow]; + return PUGL_SUCCESS; + } + } + + return PUGL_FAILURE; +} + // -------------------------------------------------------------------------------------------------------------------- // macOS specific, setup file browser dialog diff --git a/dpf/dgl/src/pugl.hpp b/dpf/dgl/src/pugl.hpp index c3322a1..e89539a 100644 --- a/dpf/dgl/src/pugl.hpp +++ b/dpf/dgl/src/pugl.hpp @@ -100,6 +100,14 @@ puglFallbackOnResize(PuglView* view); PUGL_API void puglMacOSActivateApp(); +// macOS specific, add another view's window as child +PUGL_API PuglStatus +puglMacOSAddChildWindow(PuglView* view, PuglView* child); + +// macOS specific, remove another view's window as child +PUGL_API PuglStatus +puglMacOSRemoveChildWindow(PuglView* view, PuglView* child); + // macOS specific, setup file browser dialog typedef void (*openPanelCallback)(PuglView* view, const char* path); bool puglMacOSFilePanelOpen(PuglView* view, const char* startDir, const char* title, uint flags, openPanelCallback callback);