diff --git a/dgl/src/Window.cpp b/dgl/src/Window.cpp index c1e2b890..4a716c28 100644 --- a/dgl/src/Window.cpp +++ b/dgl/src/Window.cpp @@ -74,6 +74,7 @@ public: fFirstInit(true), fVisible(false), fResizable(true), + fUsingEmbed(false), #if DGL_OS_WINDOWS hwnd(0) #elif DGL_OS_LINUX @@ -83,7 +84,7 @@ public: _dummy('\0') #endif { - DBG("Creating simple window without parent..."); DBGF; + DBG("Creating window without parent..."); DBGF; init(); } @@ -94,6 +95,7 @@ public: fFirstInit(true), fVisible(false), fResizable(true), + fUsingEmbed(false), fModal(parent.pData), #if DGL_OS_WINDOWS hwnd(0) @@ -108,10 +110,9 @@ public: init(); #if DGL_OS_LINUX - PuglInternals* const parentImpl = parent.pData->fView->impl; + const PuglInternals* const parentImpl(parent.pData->fView->impl); XSetTransientForHint(xDisplay, xWindow, parentImpl->win); - XFlush(xDisplay); #endif } @@ -122,6 +123,7 @@ public: fFirstInit(true), fVisible(true), fResizable(false), + fUsingEmbed(true), #if DGL_OS_WINDOWS hwnd(0) #elif DGL_OS_LINUX @@ -131,10 +133,10 @@ public: _dummy('\0') #endif { - DBG("Creating window embedded with parent Id..."); DBGF; + DBG("Creating embedded window..."); DBGF; init(); - DBG("Embed window always visible\n"); + DBG("NOTE: Embed window is always visible and non-resizable\n"); fApp._oneShown(); fFirstInit = false; } @@ -186,12 +188,25 @@ public: //fOnModal = false; fWidgets.clear(); - if (fSelf != nullptr && fView != nullptr) + if (fSelf != nullptr) { fApp._removeWindow(fSelf); + fSelf = nullptr; + } + + if (fView != nullptr) + { puglDestroy(fView); + fView = nullptr; } +#if DGL_OS_WINDOWS + hwnd = 0; +#elif DGL_OS_LINUX + xDisplay = nullptr; + xWindow = 0; +#endif + DBG("Success!\n"); } @@ -216,7 +231,7 @@ public: if (lockWait) { - while (fVisible && fModal.enabled) + for (; fVisible && fModal.enabled;) { // idle() puglProcessEvents(fView); @@ -270,7 +285,12 @@ public: { if (fVisible == yesNo) { - DBG("Window setVisible ignored!\n"); + DBG("Window setVisible matches current state, ignoring request\n"); + return; + } + if (fUsingEmbed) + { + DBG("Window setVisible cannot be called when embedded\n"); return; } @@ -283,16 +303,9 @@ public: #if DGL_OS_WINDOWS if (yesNo) - { - if (fFirstInit) - ShowWindow(hwnd, SW_SHOWNORMAL); - else - ShowWindow(hwnd, SW_RESTORE); - } + ShowWindow(hwnd, fFirstInit ? SW_SHOWNORMAL : SW_RESTORE); else - { ShowWindow(hwnd, SW_HIDE); - } UpdateWindow(hwnd); #elif DGL_OS_MAC @@ -329,7 +342,12 @@ public: { if (fResizable == yesNo) { - DBG("Window setResizable ignored!\n"); + DBG("Window setResizable matches current state, ignoring request\n"); + return; + } + if (fUsingEmbed) + { + DBG("Window setResizable cannot be called when embedded\n"); return; } @@ -359,21 +377,22 @@ public: void setSize(unsigned int width, unsigned int height, const bool forced = false) { - if (width == 0) - width = 1; - if (height == 0) - height = 1; + if (width == 0 || height == 0) + { + DBGp("Window setSize called with invalid value(s) %i %i, ignoring request\n", width, height); + return; + } - if (fView->width == (int)width && fView->height == (int)height && ! forced) + if (fView->width == static_cast(width) && fView->height == static_cast(height) && ! forced) { - DBG("Window setSize ignored!\n"); + DBG("Window setSize matches current size, ignoring request\n"); return; } fView->width = width; fView->height = height; - DBG("Window setSize called\n"); + DBGp("Window setSize called %s\n", forced ? "(forced)" : "(not forced)"); #if DGL_OS_WINDOWS int winFlags = WS_POPUPWINDOW | WS_CAPTION; @@ -381,13 +400,15 @@ public: if (fResizable) winFlags |= WS_SIZEBOX; - RECT wr = { 0, 0, (long)width, (long)height }; + RECT wr = { 0, 0, static_cast(width), static_cast(height) }; AdjustWindowRectEx(&wr, winFlags, FALSE, WS_EX_TOPMOST); SetWindowPos(hwnd, 0, 0, 0, wr.right-wr.left, wr.bottom-wr.top, SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOOWNERZORDER|SWP_NOZORDER); - UpdateWindow(hwnd); + + if (! forced) + UpdateWindow(hwnd); #elif DGL_OS_MAC - puglImplSetSize(fView, width, height); + puglImplSetSize(fView, width, height, forced); #elif DGL_OS_LINUX XResizeWindow(xDisplay, xWindow, width, height); @@ -405,7 +426,8 @@ public: XSetNormalHints(xDisplay, xWindow, &sizeHints); } - XFlush(xDisplay); + if (! forced) + XFlush(xDisplay); #endif repaint(); @@ -415,14 +437,14 @@ public: void setTitle(const char* const title) { - DBG("Window setTitle\n"); + DBGp("Window setTitle \"%s\"\n", title); + #if DGL_OS_WINDOWS SetWindowTextA(hwnd, title); #elif DGL_OS_MAC puglImplSetTitle(fView, title); #elif DGL_OS_LINUX XStoreName(xDisplay, xWindow, title); - XFlush(xDisplay); #endif } @@ -645,13 +667,14 @@ protected: // ------------------------------------------------------------------- private: - App& fApp; - Window* const fSelf; - PuglView* const fView; + App& fApp; + Window* fSelf; + PuglView* fView; bool fFirstInit; bool fVisible; bool fResizable; + bool fUsingEmbed; std::list fWidgets; struct Modal { diff --git a/dgl/src/pugl/pugl_osx_extended.h b/dgl/src/pugl/pugl_osx_extended.h index 6d22cf9b..10f944ed 100644 --- a/dgl/src/pugl/pugl_osx_extended.h +++ b/dgl/src/pugl/pugl_osx_extended.h @@ -28,7 +28,7 @@ extern "C" { #endif void puglImplFocus(PuglView* view); -void puglImplSetSize(PuglView* view, unsigned int width, unsigned int height); +void puglImplSetSize(PuglView* view, unsigned int width, unsigned int height, bool forced); void puglImplSetTitle(PuglView* view, const char* title); void puglImplSetVisible(PuglView* view, bool yesNo); diff --git a/dgl/src/pugl/pugl_osx_extended.m b/dgl/src/pugl/pugl_osx_extended.m index dff47186..886de058 100644 --- a/dgl/src/pugl/pugl_osx_extended.m +++ b/dgl/src/pugl/pugl_osx_extended.m @@ -32,7 +32,7 @@ void puglImplFocus(PuglView* view) [window makeKeyAndOrderFront:window]; } -void puglImplSetSize(PuglView* view, unsigned int width, unsigned int height) +void puglImplSetSize(PuglView* view, unsigned int width, unsigned int height, bool forced) { id window = view->impl->window; @@ -41,7 +41,11 @@ void puglImplSetSize(PuglView* view, unsigned int width, unsigned int height) frame.size.width = width; frame.size.height = height+20; - [window setFrame:frame]; + if (forced) { + [window setFrame:frame]; + } else { + [window setFrame:frame display:YES animate:NO]; + } } void puglImplSetTitle(PuglView* view, const char* title) diff --git a/distrho/src/DistrhoPluginVST.cpp b/distrho/src/DistrhoPluginVST.cpp index 76839e69..86afc147 100644 --- a/distrho/src/DistrhoPluginVST.cpp +++ b/distrho/src/DistrhoPluginVST.cpp @@ -438,7 +438,7 @@ public: case effEditOpen: if (fVstUi == nullptr) { -# if defined(DISTRHO_OS_MAC) && ! defined(__LP64__) +# if DISTRHO_OS_MAC && ! defined(__LP64__) if ((fEffect->dispatcher(fEffect, effCanDo, 0, 0, (void*)"hasCockosViewAsConfig", 0.0f) & 0xffff0000) != 0xbeef0000) return 0; # endif