11#include "IPlugAPP_host.h"
17extern float GetScaleForHWND(HWND hWnd);
18#define GET_MENU() GetMenu(gHWND)
20#define GET_MENU() SWELL_GetCurrentMenu()
25#if !defined NO_IGRAPHICS
27using namespace igraphics;
32void IPlugAPPHost::PopulateSampleRateList(HWND hwndDlg, RtAudio::DeviceInfo* inputDevInfo, RtAudio::DeviceInfo* outputDevInfo)
36 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_SR,CB_RESETCONTENT,0,0);
38 std::vector<int> matchedSRs;
40 for (
int i=0; i<inputDevInfo->sampleRates.size(); i++)
42 for (
int j=0; j<outputDevInfo->sampleRates.size(); j++)
44 if (inputDevInfo->sampleRates[i] == outputDevInfo->sampleRates[j])
45 matchedSRs.push_back(inputDevInfo->sampleRates[i]);
49 for (
int k=0; k<matchedSRs.size(); k++)
51 buf.SetFormatted(20,
"%i", matchedSRs[k]);
52 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_SR,CB_ADDSTRING,0,(LPARAM)buf.Get());
53 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_SR,CB_SETITEMDATA,k,(LPARAM)matchedSRs[k]);
57 str.SetFormatted(32,
"%i", mState.mAudioSR);
59 LRESULT sridx = SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_SR, CB_FINDSTRINGEXACT, -1, (LPARAM) str.Get());
60 SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_SR, CB_SETCURSEL, sridx, 0);
63void IPlugAPPHost::PopulateAudioInputList(HWND hwndDlg, RtAudio::DeviceInfo* info)
67 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_L,CB_RESETCONTENT,0,0);
68 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_R,CB_RESETCONTENT,0,0);
72 for (i=0; i<info->inputChannels -1; i++)
74 buf.SetFormatted(20,
"%i", i+1);
75 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_L,CB_ADDSTRING,0,(LPARAM)buf.Get());
76 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_R,CB_ADDSTRING,0,(LPARAM)buf.Get());
80 buf.SetFormatted(20,
"%i", i+1);
81 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_R,CB_ADDSTRING,0,(LPARAM)buf.Get());
83 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_L,CB_SETCURSEL, mState.mAudioInChanL - 1, 0);
84 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_R,CB_SETCURSEL, mState.mAudioInChanR - 1, 0);
87void IPlugAPPHost::PopulateAudioOutputList(HWND hwndDlg, RtAudio::DeviceInfo* info)
91 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_L,CB_RESETCONTENT,0,0);
92 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_R,CB_RESETCONTENT,0,0);
96 for (i=0; i<info->outputChannels -1; i++)
98 buf.SetFormatted(20,
"%i", i+1);
99 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_L,CB_ADDSTRING,0,(LPARAM)buf.Get());
100 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_R,CB_ADDSTRING,0,(LPARAM)buf.Get());
104 buf.SetFormatted(20,
"%i", i+1);
105 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_R,CB_ADDSTRING,0,(LPARAM)buf.Get());
107 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_L,CB_SETCURSEL, mState.mAudioOutChanL - 1, 0);
108 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_R,CB_SETCURSEL, mState.mAudioOutChanR - 1, 0);
112void IPlugAPPHost::PopulateDriverSpecificControls(HWND hwndDlg)
115 int driverType = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_DRIVER, CB_GETCURSEL, 0, 0);
116 if (driverType == kDeviceASIO)
118 ComboBox_Enable(GetDlgItem(hwndDlg, IDC_COMBO_AUDIO_IN_DEV), FALSE);
119 Button_Enable(GetDlgItem(hwndDlg, IDC_BUTTON_OS_DEV_SETTINGS), TRUE);
123 ComboBox_Enable(GetDlgItem(hwndDlg, IDC_COMBO_AUDIO_IN_DEV), TRUE);
124 Button_Enable(GetDlgItem(hwndDlg, IDC_BUTTON_OS_DEV_SETTINGS), FALSE);
131 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_DEV,CB_RESETCONTENT,0,0);
132 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_DEV,CB_RESETCONTENT,0,0);
134 for (
int i = 0; i<mAudioInputDevIDs.size(); i++)
136 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_DEV,CB_ADDSTRING,0,(LPARAM)
GetAudioDeviceName(mAudioInputDevIDs[i]).c_str());
138 if (std::string_view(
GetAudioDeviceName(mAudioInputDevIDs[i])) == mState.mAudioInDev.Get())
142 for (
int i = 0; i<mAudioOutputDevIDs.size(); i++)
144 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_DEV,CB_ADDSTRING,0,(LPARAM)
GetAudioDeviceName(mAudioOutputDevIDs[i]).c_str());
146 if (std::string_view(
GetAudioDeviceName(mAudioOutputDevIDs[i])) == mState.mAudioOutDev.Get())
151 if (driverType == kDeviceASIO)
152 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_DEV,CB_SETCURSEL, outdevidx, 0);
155 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_DEV,CB_SETCURSEL, indevidx, 0);
157 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_DEV,CB_SETCURSEL, outdevidx, 0);
159 RtAudio::DeviceInfo inputDevInfo;
160 RtAudio::DeviceInfo outputDevInfo;
162 if (mAudioInputDevIDs.size())
164 inputDevInfo = mDAC->getDeviceInfo(mAudioInputDevIDs[indevidx]);
165 PopulateAudioInputList(hwndDlg, &inputDevInfo);
168 if (mAudioOutputDevIDs.size())
170 outputDevInfo = mDAC->getDeviceInfo(mAudioOutputDevIDs[outdevidx]);
171 PopulateAudioOutputList(hwndDlg, &outputDevInfo);
174 PopulateSampleRateList(hwndDlg, &inputDevInfo, &outputDevInfo);
177void IPlugAPPHost::PopulateAudioDialogs(HWND hwndDlg)
179 PopulateDriverSpecificControls(hwndDlg);
191 for (
int i = 0; i< kNumBufferSizeOptions; i++)
193 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_BUF_SIZE,CB_ADDSTRING,0,(LPARAM)kBufferSizeOptions[i].c_str());
197 str.SetFormatted(32,
"%i", mState.mBufferSize);
199 LRESULT iovsidx = SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_BUF_SIZE, CB_FINDSTRINGEXACT, -1, (LPARAM) str.Get());
200 SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_BUF_SIZE, CB_SETCURSEL, iovsidx, 0);
203bool IPlugAPPHost::PopulateMidiDialogs(HWND hwndDlg)
205 if ( !mMidiIn || !mMidiOut )
209 for (
int i=0; i<mMidiInputDevNames.size(); i++)
211 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_IN_DEV,CB_ADDSTRING,0,(LPARAM)mMidiInputDevNames[i].c_str());
214 LRESULT indevidx = SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_IN_DEV,CB_FINDSTRINGEXACT, -1, (LPARAM)mState.mMidiInDev.Get());
219 mState.mMidiInDev.Set(
"off");
224 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_IN_DEV,CB_SETCURSEL, indevidx, 0);
226 for (
int i=0; i<mMidiOutputDevNames.size(); i++)
228 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_OUT_DEV,CB_ADDSTRING,0,(LPARAM)mMidiOutputDevNames[i].c_str());
231 LRESULT outdevidx = SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_OUT_DEV,CB_FINDSTRINGEXACT, -1, (LPARAM)mState.mMidiOutDev.Get());
236 mState.mMidiOutDev.Set(
"off");
241 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_OUT_DEV,CB_SETCURSEL, outdevidx, 0);
245 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_IN_CHAN,CB_ADDSTRING,0,(LPARAM)
"all");
246 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_OUT_CHAN,CB_ADDSTRING,0,(LPARAM)
"all");
250 for (
int i=0; i<16; i++)
252 buf.SetFormatted(20,
"%i", i+1);
253 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_IN_CHAN,CB_ADDSTRING,0,(LPARAM)buf.Get());
254 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_OUT_CHAN,CB_ADDSTRING,0,(LPARAM)buf.Get());
257 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_IN_CHAN,CB_SETCURSEL, (LPARAM)mState.mMidiInChan, 0);
258 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_OUT_CHAN,CB_SETCURSEL, (LPARAM)mState.mMidiOutChan, 0);
265void IPlugAPPHost::PopulatePreferencesDialog(HWND hwndDlg)
267 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_DRIVER,CB_ADDSTRING,0,(LPARAM)
"DirectSound");
268 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_DRIVER,CB_ADDSTRING,0,(LPARAM)
"ASIO");
269 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_DRIVER,CB_SETCURSEL, mState.mAudioDriverType, 0);
271 PopulateAudioDialogs(hwndDlg);
272 PopulateMidiDialogs(hwndDlg);
276void IPlugAPPHost::PopulatePreferencesDialog(HWND hwndDlg)
278 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_DRIVER,CB_ADDSTRING,0,(LPARAM)
"CoreAudio");
280 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_DRIVER,CB_SETCURSEL, mState.mAudioDriverType, 0);
282 PopulateAudioDialogs(hwndDlg);
283 PopulateMidiDialogs(hwndDlg);
286 #error NOT IMPLEMENTED
289WDL_DLGRET IPlugAPPHost::PreferencesDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
292 AppState& mState = _this->mState;
293 AppState& mTempState = _this->mTempState;
294 AppState& mActiveState = _this->mActiveState;
296 auto getComboString = [&](WDL_String& str,
int item, WPARAM idx) {
297 std::string tempString;
298 long len = (long) SendDlgItemMessage(hwndDlg, item, CB_GETLBTEXTLEN, idx, 0) + 1;
299 tempString.reserve(len);
300 SendDlgItemMessage(hwndDlg, item, CB_GETLBTEXT, idx, (LPARAM) tempString.data());
301 str.Set(tempString.c_str());
308 _this->PopulatePreferencesDialog(hwndDlg);
314 switch (LOWORD(wParam))
317 if (mActiveState != mState)
318 _this->TryToChangeAudio();
320 EndDialog(hwndDlg, IDOK);
323 _this->TryToChangeAudio();
326 EndDialog(hwndDlg, IDCANCEL);
329 if (!_this->AudioSettingsInStateAreEqual(mState, mTempState)
330 || !_this->MIDISettingsInStateAreEqual(mState, mTempState))
334 _this->TryToChangeAudioDriverType();
335 _this->ProbeAudioIO();
336 _this->TryToChangeAudio();
341 case IDC_COMBO_AUDIO_DRIVER:
342 if (HIWORD(wParam) == CBN_SELCHANGE)
344 v = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_DRIVER, CB_GETCURSEL, 0, 0);
346 if (v != mState.mAudioDriverType)
348 mState.mAudioDriverType = v;
350 _this->TryToChangeAudioDriverType();
351 _this->ProbeAudioIO();
353 if (_this->mAudioInputDevIDs.size())
354 mState.mAudioInDev.Set(_this->
GetAudioDeviceName(_this->mAudioInputDevIDs[0]).c_str());
356 if (_this->mAudioOutputDevIDs.size())
357 mState.mAudioOutDev.Set(_this->
GetAudioDeviceName(_this->mAudioOutputDevIDs[0]).c_str());
360 mState.mAudioOutChanL = 1;
361 mState.mAudioOutChanR = 2;
363 _this->PopulateAudioDialogs(hwndDlg);
368 case IDC_COMBO_AUDIO_IN_DEV:
369 if (HIWORD(wParam) == CBN_SELCHANGE)
371 int idx = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_IN_DEV, CB_GETCURSEL, 0, 0);
372 getComboString(mState.mAudioInDev, IDC_COMBO_AUDIO_IN_DEV, idx);
375 mState.mAudioInChanL = 1;
376 mState.mAudioInChanR = 2;
378 _this->PopulateDriverSpecificControls(hwndDlg);
382 case IDC_COMBO_AUDIO_OUT_DEV:
383 if (HIWORD(wParam) == CBN_SELCHANGE)
385 int idx = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_OUT_DEV, CB_GETCURSEL, 0, 0);
386 getComboString(mState.mAudioOutDev, IDC_COMBO_AUDIO_OUT_DEV, idx);
389 mState.mAudioOutChanL = 1;
390 mState.mAudioOutChanR = 2;
392 _this->PopulateDriverSpecificControls(hwndDlg);
396 case IDC_COMBO_AUDIO_IN_L:
397 if (HIWORD(wParam) == CBN_SELCHANGE)
399 mState.mAudioInChanL = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_IN_L, CB_GETCURSEL, 0, 0) + 1;
402 mState.mAudioInChanR = mState.mAudioInChanL + 1;
403 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_R,CB_SETCURSEL, mState.mAudioInChanR - 1, 0);
408 case IDC_COMBO_AUDIO_IN_R:
409 if (HIWORD(wParam) == CBN_SELCHANGE)
410 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_R,CB_SETCURSEL, mState.mAudioInChanR - 1, 0);
411 mState.mAudioInChanR = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_IN_R, CB_GETCURSEL, 0, 0);
414 case IDC_COMBO_AUDIO_OUT_L:
415 if (HIWORD(wParam) == CBN_SELCHANGE)
417 mState.mAudioOutChanL = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_OUT_L, CB_GETCURSEL, 0, 0) + 1;
420 mState.mAudioOutChanR = mState.mAudioOutChanL + 1;
421 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_R,CB_SETCURSEL, mState.mAudioOutChanR - 1, 0);
426 case IDC_COMBO_AUDIO_OUT_R:
427 if (HIWORD(wParam) == CBN_SELCHANGE)
428 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_R,CB_SETCURSEL, mState.mAudioOutChanR - 1, 0);
429 mState.mAudioOutChanR = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_OUT_R, CB_GETCURSEL, 0, 0);
439 case IDC_COMBO_AUDIO_BUF_SIZE:
440 if (HIWORD(wParam) == CBN_SELCHANGE)
442 int iovsidx = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_BUF_SIZE, CB_GETCURSEL, 0, 0);
443 mState.mBufferSize = atoi(kBufferSizeOptions[iovsidx].c_str());
446 case IDC_COMBO_AUDIO_SR:
447 if (HIWORD(wParam) == CBN_SELCHANGE)
449 int idx = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_SR, CB_GETCURSEL, 0, 0);
450 mState.mAudioSR = (uint32_t) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_SR, CB_GETITEMDATA, idx, 0);
454 case IDC_BUTTON_OS_DEV_SETTINGS:
455 if (HIWORD(wParam) == BN_CLICKED)
458 if ( (_this->mState.mAudioDriverType == kDeviceASIO) && (_this->mDAC->isStreamRunning() ==
true))
461 if (SWELL_GetOSXVersion() >= 0x1200)
463 system(
"open \"/System/Applications/Utilities/Audio MIDI Setup.app\"");
467 system(
"open \"/Applications/Utilities/Audio MIDI Setup.app\"");
470 #error NOT IMPLEMENTED
475 case IDC_COMBO_MIDI_IN_DEV:
476 if (HIWORD(wParam) == CBN_SELCHANGE)
478 int idx = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_MIDI_IN_DEV, CB_GETCURSEL, 0, 0);
479 getComboString(mState.mMidiInDev, IDC_COMBO_MIDI_IN_DEV, idx);
480 _this->SelectMIDIDevice(ERoute::kInput, mState.mMidiInDev.Get());
484 case IDC_COMBO_MIDI_OUT_DEV:
485 if (HIWORD(wParam) == CBN_SELCHANGE)
487 int idx = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_MIDI_OUT_DEV, CB_GETCURSEL, 0, 0);
488 getComboString(mState.mMidiOutDev, IDC_COMBO_MIDI_OUT_DEV, idx);
489 _this->SelectMIDIDevice(ERoute::kOutput, mState.mMidiOutDev.Get());
493 case IDC_COMBO_MIDI_IN_CHAN:
494 if (HIWORD(wParam) == CBN_SELCHANGE)
495 mState.mMidiInChan = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_MIDI_IN_CHAN, CB_GETCURSEL, 0, 0);
498 case IDC_COMBO_MIDI_OUT_CHAN:
499 if (HIWORD(wParam) == CBN_SELCHANGE)
500 mState.mMidiOutChan = (
int) SendDlgItemMessage(hwndDlg, IDC_COMBO_MIDI_OUT_CHAN, CB_GETCURSEL, 0, 0);
513static void ClientResize(HWND hWnd,
int width,
int height)
515 RECT rcClient, rcWindow;
517 int screenwidth, screenheight;
520 screenwidth = GetSystemMetrics(SM_CXSCREEN);
521 screenheight = GetSystemMetrics(SM_CYSCREEN);
522 x = (screenwidth / 2) - (width / 2);
523 y = (screenheight / 2) - (height / 2);
525 GetClientRect(hWnd, &rcClient);
526 GetWindowRect(hWnd, &rcWindow);
528 ptDiff.x = (rcWindow.right - rcWindow.left) - rcClient.right;
529 ptDiff.y = (rcWindow.bottom - rcWindow.top) - rcClient.bottom;
531 SetWindowPos(hWnd, 0, x, y, width + ptDiff.x, height + ptDiff.y, 0);
535WDL_DLGRET IPlugAPPHost::MainDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
544 IPlugAPP* pPlug = pAppHost->GetPlug();
546 if (!pAppHost->OpenWindow(gHWND))
548 DBGMSG(
"couldn't attach gui\n");
551 ClientResize(hwndDlg, pPlug->GetEditorWidth(), pPlug->GetEditorHeight());
553 ShowWindow(hwndDlg, SW_SHOW);
557 pAppHost->CloseWindow();
559 IPlugAPPHost::sInstance =
nullptr;
564 SWELL_PostQuitMessage(hwndDlg);
569 DestroyWindow(hwndDlg);
572 switch (LOWORD(wParam))
576 DestroyWindow(hwndDlg);
581 IPlugAPP* pPlug = pAppHost->GetPlug();
583 bool pluginOpensAboutBox = pPlug->OnHostRequestingAboutBox();
585 if (pluginOpensAboutBox ==
false)
588 info.Append(PLUG_COPYRIGHT_STR
"\nBuilt on " __DATE__);
589 MessageBox(hwndDlg, info.Get(), PLUG_NAME, MB_OK);
596 IPlugAPP* pPlug = pAppHost->GetPlug();
598 bool pluginOpensHelp = pPlug->OnHostRequestingProductHelp();
600 if (pluginOpensHelp ==
false)
602 MessageBox(hwndDlg,
"See the manual", PLUG_NAME, MB_OK);
608 INT_PTR ret = DialogBox(gHINSTANCE, MAKEINTRESOURCE(IDD_DIALOG_PREF), hwndDlg, IPlugAPPHost::PreferencesDlgProc);
611 pAppHost->UpdateINI();
615#if defined _DEBUG && !defined NO_IGRAPHICS
628 CheckMenuItem(GET_MENU(), ID_LIVE_EDIT, (MF_BYCOMMAND | enabled) ? MF_UNCHECKED : MF_CHECKED);
646 CheckMenuItem(GET_MENU(), ID_SHOW_DRAWN, (MF_BYCOMMAND | enabled) ? MF_UNCHECKED : MF_CHECKED);
664 CheckMenuItem(GET_MENU(), ID_SHOW_BOUNDS, (MF_BYCOMMAND | enabled) ? MF_UNCHECKED : MF_CHECKED);
682 CheckMenuItem(GET_MENU(), ID_SHOW_FPS, (MF_BYCOMMAND | enabled) ? MF_UNCHECKED : MF_CHECKED);
691 case WM_GETMINMAXINFO:
696 IPlugAPP* pPlug = pAppHost->GetPlug();
698 MINMAXINFO* mmi = (MINMAXINFO*) lParam;
699 mmi->ptMinTrackSize.x = pPlug->GetMinWidth();
700 mmi->ptMinTrackSize.y = pPlug->GetMinHeight();
701 mmi->ptMaxTrackSize.x = pPlug->GetMaxWidth();
702 mmi->ptMaxTrackSize.y = pPlug->GetMaxHeight();
705 float scale = GetScaleForHWND(hwndDlg);
706 mmi->ptMinTrackSize.x =
static_cast<LONG
>(
static_cast<float>(mmi->ptMinTrackSize.x) * scale);
707 mmi->ptMinTrackSize.y =
static_cast<LONG
>(
static_cast<float>(mmi->ptMinTrackSize.y) * scale);
708 mmi->ptMaxTrackSize.x =
static_cast<LONG
>(
static_cast<float>(mmi->ptMaxTrackSize.x) * scale);
709 mmi->ptMaxTrackSize.y =
static_cast<LONG
>(
static_cast<float>(mmi->ptMaxTrackSize.y) * scale);
717 WORD dpi = HIWORD(wParam);
718 RECT* rect = (RECT*)lParam;
719 float scale = GetScaleForHWND(hwndDlg);
725 GetClientRect(hwndDlg, &rcClient);
726 GetWindowRect(hwndDlg, &rcWindow);
728 ptDiff.x = (rcWindow.right - rcWindow.left) - rcClient.right;
729 ptDiff.y = (rcWindow.bottom - rcWindow.top) - rcClient.bottom;
750 SetWindowPos(hwndDlg, 0, rect->left, rect->top, w + ptDiff.x, h + ptDiff.y, 0);
757 IPlugAPP* pPlug = pAppHost->GetPlug();
759 switch (LOWORD(wParam))
767 GetClientRect(hwndDlg, &r);
768 pPlug->OnParentWindowResize(
static_cast<int>(r.right),
static_cast<int>(r.bottom));
This pure virtual interface delegates communication in both directions between a UI editor and someth...
int GetEditorHeight() const
int GetEditorWidth() const
An editor delegate base class that uses IGraphics for the UI.
IGraphics * GetUI()
Get a pointer to the IGraphics context.
The lowest level base class of an IGraphics context.
void ShowControlBounds(bool enable)
void EnableLiveEdit(bool enable)
Live edit mode allows you to relocate controls at runtime in debug builds.
bool ShowAreaDrawnEnabled() const
bool LiveEditEnabled() const
bool ShowControlBoundsEnabled() const
void ShowFPSDisplay(bool enable)
Shows a control to display the frame rate of drawing.
void ShowAreaDrawn(bool enable)
void SetScreenScale(float scale)
Called by the platform IGraphics class when moving to a new screen to set DPI.
A class that hosts an IPlug as a standalone app and provides Audio/Midi I/O.
std::string GetAudioDeviceName(uint32_t deviceID) const
Returns the name of the audio device with a given RTAudio device ID.
Standalone application base class for an IPlug plug-in.
bool GetHostResizeEnabled() const