// This file is part of VSTGUI. It is subject to the license terms // in the LICENSE file found in the top-level directory of this // distribution and at http://github.com/steinbergmedia/vstgui/LICENSE #ifndef __aeffguieditor__ #include "aeffguieditor.h" #endif #ifndef __audioeffectx__ #include "public.sdk/source/vst2.x/audioeffectx.h" #endif #include "../lib/platform/iplatformframe.h" #if WINDOWS #include #include "../lib/platform/win32/win32support.h" #endif namespace VSTGUI { //----------------------------------------------------------------------------- // AEffGUIEditor Implementation //----------------------------------------------------------------------------- AEffGUIEditor::AEffGUIEditor (void* pEffect) : AEffEditor ((AudioEffect*)pEffect) { ((AudioEffect*)pEffect)->setEditor (this); systemWindow = 0; #if WINDOWS OleInitialize (nullptr); #endif } //----------------------------------------------------------------------------- AEffGUIEditor::~AEffGUIEditor () { #if WINDOWS OleUninitialize (); #endif } //----------------------------------------------------------------------------- #if VST_2_1_EXTENSIONS bool AEffGUIEditor::onKeyDown (VstKeyCode& keyCode) { return false; } //----------------------------------------------------------------------------- bool AEffGUIEditor::onKeyUp (VstKeyCode& keyCode) { return false; } #endif //----------------------------------------------------------------------------- bool AEffGUIEditor::open (void* ptr) { return AEffEditor::open (ptr); } //----------------------------------------------------------------------------- void AEffGUIEditor::idle () { AEffEditor::idle (); if (frame) frame->idle (); } //----------------------------------------------------------------------------- int32_t AEffGUIEditor::knobMode = kCircularMode; //----------------------------------------------------------------------------- bool AEffGUIEditor::setKnobMode (int32_t val) { AEffGUIEditor::knobMode = val; return true; } //----------------------------------------------------------------------------- bool AEffGUIEditor::onWheel (float distance) { return false; } //----------------------------------------------------------------------------- void AEffGUIEditor::doIdleStuff () { vstgui_assert (false, "unexpected call"); } //----------------------------------------------------------------------------- bool AEffGUIEditor::getRect (ERect **ppErect) { *ppErect = ▭ return true; } // ----------------------------------------------------------------------------- bool AEffGUIEditor::beforeSizeChange (const CRect& newSize, const CRect& oldSize) { AudioEffectX* eX = (AudioEffectX*)effect; if (eX && eX->canHostDo ((char*)"sizeWindow")) { if (eX->sizeWindow ((VstInt32)newSize.getWidth (), (VstInt32)newSize.getHeight ())) { return true; } return false; } #if WINDOWS // old hack to size the window of the host. Very ugly stuff ... if (getFrame () == 0) return true; RECT rctTempWnd, rctParentWnd; HWND hTempWnd; long iFrame = (2 * GetSystemMetrics (SM_CYFIXEDFRAME)); long diffWidth = 0; long diffHeight = 0; hTempWnd = (HWND)getFrame ()->getPlatformFrame ()->getPlatformRepresentation (); while ((diffWidth != iFrame) && (hTempWnd != nullptr)) // look for FrameWindow { HWND hTempParentWnd = GetParent (hTempWnd); TCHAR buffer[1024]; GetClassName (hTempParentWnd, buffer, 1024); if (!hTempParentWnd || !VSTGUI_STRCMP (buffer, TEXT("MDIClient"))) break; GetWindowRect (hTempWnd, &rctTempWnd); GetWindowRect (hTempParentWnd, &rctParentWnd); SetWindowPos (hTempWnd, HWND_TOP, 0, 0, (int)newSize.getWidth () + diffWidth, (int)newSize.getHeight () + diffHeight, SWP_NOMOVE); diffWidth += (rctParentWnd.right - rctParentWnd.left) - (rctTempWnd.right - rctTempWnd.left); diffHeight += (rctParentWnd.bottom - rctParentWnd.top) - (rctTempWnd.bottom - rctTempWnd.top); if ((diffWidth > 80) || (diffHeight > 80)) // parent belongs to host return true; if (diffWidth < 0) diffWidth = 0; if (diffHeight < 0) diffHeight = 0; hTempWnd = hTempParentWnd; } if (hTempWnd) SetWindowPos (hTempWnd, HWND_TOP, 0, 0, (int)newSize.getWidth () + diffWidth, (int)newSize.getHeight () + diffHeight, SWP_NOMOVE); #endif return true; } } // VSTGUI