|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581 |
- /*
- * Juce Plugin Window Helper
- * Copyright (C) 2013-2021 Filipe Coelho <falktx@falktx.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * For a full copy of the GNU General Public License see the doc/GPL.txt file.
- */
-
- #ifndef JUCE_PLUGIN_WINDOW_HPP_INCLUDED
- #define JUCE_PLUGIN_WINDOW_HPP_INCLUDED
-
- #include "CarlaJuceUtils.hpp"
- #include "CarlaVst2Utils.hpp"
- #include "CarlaVst3Utils.hpp"
-
- #include "AppConfig.h"
- #include "juce_gui_basics/juce_gui_basics.h"
-
- #if defined(CARLA_OS_LINUX) && defined(HAVE_X11)
- # include <X11/Xlib.h>
- #elif defined(CARLA_OS_MAC)
- # define Component CocoaComponent
- # define MemoryBlock CocoaMemoryBlock
- # define Point CocoaPoint
- # import <Cocoa/Cocoa.h>
- # undef Component
- # undef MemoryBlock
- # undef Point
- #endif
-
- // -----------------------------------------------------------------------
-
- namespace juce {
-
- class JucePluginWindow : public DialogWindow
- {
- public:
- JucePluginWindow(const uintptr_t parentId, const bool isStandalone,
- AEffect* const vst2effect, v3_plugin_view** const vst3view)
- : DialogWindow("JucePluginWindow", Colour(50, 50, 200), true, false),
- fIsStandalone(isStandalone),
- fClosed(false),
- fShown(false),
- fTransientId(parentId),
- fLastKeys(),
- fVst2Effect(vst2effect),
- fVst3View(vst3view)
- {
- carla_zeroStruct(fLastKeys);
- setVisible(false);
- setOpaque(true);
- setResizable(false, false);
- setUsingNativeTitleBar(true);
- }
-
- void show(Component* const comp)
- {
- fClosed = false;
- fShown = true;
-
- centreWithSize(comp->getWidth(), comp->getHeight());
- setContentNonOwned(comp, true);
-
- if (! isOnDesktop())
- addToDesktop();
-
- #ifndef CARLA_OS_LINUX
- setAlwaysOnTop(true);
- #endif
- setTransient();
- setVisible(true);
- toFront(true);
-
- #ifndef CARLA_OS_LINUX
- postCommandMessage(0);
- #endif
- }
-
- bool keyPressed (const KeyPress& key) override
- {
- if (DialogWindow::keyPressed (key))
- return true;
-
- if (fVst2Effect != nullptr)
- {
- const int juceKeyCode = key.getKeyCode();
- int vstKeyIndex = 0;
- int vstKeyValue = 0;
-
- do {
- /**/ if (juceKeyCode == KeyPress::spaceKey) vstKeyValue = 7;
- else if (juceKeyCode == KeyPress::escapeKey) vstKeyValue = 6;
- else if (juceKeyCode == KeyPress::returnKey) vstKeyValue = 19; // NOTE: 4 is '\r' while 19 is '\n'
- else if (juceKeyCode == KeyPress::tabKey) vstKeyValue = 2;
-
- else if (juceKeyCode == KeyPress::deleteKey) vstKeyValue = 22;
- else if (juceKeyCode == KeyPress::backspaceKey) vstKeyValue = 1;
- else if (juceKeyCode == KeyPress::insertKey) vstKeyValue = 21;
-
- else if (juceKeyCode == KeyPress::upKey) vstKeyValue = 12;
- else if (juceKeyCode == KeyPress::downKey) vstKeyValue = 14;
- else if (juceKeyCode == KeyPress::leftKey) vstKeyValue = 11;
- else if (juceKeyCode == KeyPress::rightKey) vstKeyValue = 13;
- else if (juceKeyCode == KeyPress::pageUpKey) vstKeyValue = 15;
- else if (juceKeyCode == KeyPress::pageDownKey) vstKeyValue = 16;
- else if (juceKeyCode == KeyPress::homeKey) vstKeyValue = 10;
- else if (juceKeyCode == KeyPress::endKey) vstKeyValue = 9;
-
- else if (juceKeyCode == KeyPress::F1Key) vstKeyValue = 40;
- else if (juceKeyCode == KeyPress::F2Key) vstKeyValue = 41;
- else if (juceKeyCode == KeyPress::F3Key) vstKeyValue = 42;
- else if (juceKeyCode == KeyPress::F4Key) vstKeyValue = 43;
- else if (juceKeyCode == KeyPress::F5Key) vstKeyValue = 44;
- else if (juceKeyCode == KeyPress::F6Key) vstKeyValue = 45;
- else if (juceKeyCode == KeyPress::F7Key) vstKeyValue = 46;
- else if (juceKeyCode == KeyPress::F8Key) vstKeyValue = 47;
- else if (juceKeyCode == KeyPress::F9Key) vstKeyValue = 48;
- else if (juceKeyCode == KeyPress::F10Key) vstKeyValue = 49;
- else if (juceKeyCode == KeyPress::F11Key) vstKeyValue = 50;
- else if (juceKeyCode == KeyPress::F12Key) vstKeyValue = 51;
-
- else if (juceKeyCode == KeyPress::F13Key) break;
- else if (juceKeyCode == KeyPress::F14Key) break;
- else if (juceKeyCode == KeyPress::F15Key) break;
- else if (juceKeyCode == KeyPress::F16Key) break;
- else if (juceKeyCode == KeyPress::F17Key) break;
- else if (juceKeyCode == KeyPress::F18Key) break;
- else if (juceKeyCode == KeyPress::F19Key) break;
- else if (juceKeyCode == KeyPress::F20Key) break;
- else if (juceKeyCode == KeyPress::F21Key) break;
- else if (juceKeyCode == KeyPress::F22Key) break;
- else if (juceKeyCode == KeyPress::F23Key) break;
- else if (juceKeyCode == KeyPress::F24Key) break;
- else if (juceKeyCode == KeyPress::F25Key) break;
- else if (juceKeyCode == KeyPress::F26Key) break;
- else if (juceKeyCode == KeyPress::F27Key) break;
- else if (juceKeyCode == KeyPress::F28Key) break;
- else if (juceKeyCode == KeyPress::F29Key) break;
- else if (juceKeyCode == KeyPress::F30Key) break;
- else if (juceKeyCode == KeyPress::F31Key) break;
- else if (juceKeyCode == KeyPress::F32Key) break;
- else if (juceKeyCode == KeyPress::F33Key) break;
- else if (juceKeyCode == KeyPress::F34Key) break;
- else if (juceKeyCode == KeyPress::F35Key) break;
-
- else if (juceKeyCode == KeyPress::numberPad0) vstKeyValue = 24;
- else if (juceKeyCode == KeyPress::numberPad1) vstKeyValue = 25;
- else if (juceKeyCode == KeyPress::numberPad2) vstKeyValue = 26;
- else if (juceKeyCode == KeyPress::numberPad3) vstKeyValue = 27;
- else if (juceKeyCode == KeyPress::numberPad4) vstKeyValue = 28;
- else if (juceKeyCode == KeyPress::numberPad5) vstKeyValue = 29;
- else if (juceKeyCode == KeyPress::numberPad6) vstKeyValue = 30;
- else if (juceKeyCode == KeyPress::numberPad7) vstKeyValue = 31;
- else if (juceKeyCode == KeyPress::numberPad8) vstKeyValue = 32;
- else if (juceKeyCode == KeyPress::numberPad9) vstKeyValue = 33;
-
- else if (juceKeyCode == KeyPress::numberPadAdd) vstKeyValue = 35;
- else if (juceKeyCode == KeyPress::numberPadSubtract) vstKeyValue = 37;
- else if (juceKeyCode == KeyPress::numberPadMultiply) vstKeyValue = 34;
- else if (juceKeyCode == KeyPress::numberPadDivide) vstKeyValue = 39;
- else if (juceKeyCode == KeyPress::numberPadSeparator) vstKeyValue = 36;
- else if (juceKeyCode == KeyPress::numberPadDecimalPoint) vstKeyValue = 38;
- else if (juceKeyCode == KeyPress::numberPadEquals) vstKeyValue = 57;
-
- else if (juceKeyCode == KeyPress::numberPadDelete) break;
-
- else if (juceKeyCode == KeyPress::playKey) break;
- else if (juceKeyCode == KeyPress::stopKey) break;
- else if (juceKeyCode == KeyPress::fastForwardKey) break;
- else if (juceKeyCode == KeyPress::rewindKey) break;
-
- else vstKeyIndex = juceKeyCode;
- } while (false);
-
- fLastKeys.vst2.index = vstKeyIndex;
- fLastKeys.vst2.value = vstKeyValue;
- return fVst2Effect->dispatcher (fVst2Effect, effEditKeyDown, vstKeyIndex, vstKeyValue, nullptr, 0.0f) != 0;
- }
-
- if (fVst3View != nullptr)
- {
- const int juceKeyCode = key.getKeyCode();
- const int juceKeyMods = key.getModifiers().getRawFlags();
- int16_t vst3KeyChar = 0;
- int16_t vst3KeyCode = 0;
- int16_t vst3KeyMods = 0;
-
- // KEY_NEXT 8
- // KEY_SELECT 17
- // KEY_SELECT 18
- // KEY_SNAPSHOT 20
- // KEY_HELP 23
- // KEY_NUMLOCK 52
- // KEY_SCROLL 53
- // KEY_VOLUME_UP 63
- // KEY_VOLUME_DOWN 64
-
- do {
- /**/ if (juceKeyCode == KeyPress::spaceKey)
- {
- vst3KeyChar = ' ';
- vst3KeyCode = 7;
- }
- else if (juceKeyCode == KeyPress::escapeKey)
- {
- vst3KeyCode = 6;
- }
- else if (juceKeyCode == KeyPress::returnKey)
- {
- vst3KeyChar = '\n';
- vst3KeyCode = 19; // NOTE: 4 is '\r' while 19 is '\n'
- }
- else if (juceKeyCode == KeyPress::tabKey)
- {
- vst3KeyChar = '\t';
- vst3KeyCode = 2;
- }
-
- else if (juceKeyCode == KeyPress::deleteKey) vst3KeyCode = 22;
- else if (juceKeyCode == KeyPress::backspaceKey) vst3KeyCode = 1;
- else if (juceKeyCode == KeyPress::insertKey) vst3KeyCode = 21;
-
- else if (juceKeyCode == KeyPress::upKey) vst3KeyCode = 12;
- else if (juceKeyCode == KeyPress::downKey) vst3KeyCode = 14;
- else if (juceKeyCode == KeyPress::leftKey) vst3KeyCode = 11;
- else if (juceKeyCode == KeyPress::rightKey) vst3KeyCode = 13;
- else if (juceKeyCode == KeyPress::pageUpKey) vst3KeyCode = 15;
- else if (juceKeyCode == KeyPress::pageDownKey) vst3KeyCode = 16;
- else if (juceKeyCode == KeyPress::homeKey) vst3KeyCode = 10;
- else if (juceKeyCode == KeyPress::endKey) vst3KeyCode = 9;
-
- else if (juceKeyCode == KeyPress::F1Key) vst3KeyCode = 40;
- else if (juceKeyCode == KeyPress::F2Key) vst3KeyCode = 41;
- else if (juceKeyCode == KeyPress::F3Key) vst3KeyCode = 42;
- else if (juceKeyCode == KeyPress::F4Key) vst3KeyCode = 43;
- else if (juceKeyCode == KeyPress::F5Key) vst3KeyCode = 44;
- else if (juceKeyCode == KeyPress::F6Key) vst3KeyCode = 45;
- else if (juceKeyCode == KeyPress::F7Key) vst3KeyCode = 46;
- else if (juceKeyCode == KeyPress::F8Key) vst3KeyCode = 47;
- else if (juceKeyCode == KeyPress::F9Key) vst3KeyCode = 48;
- else if (juceKeyCode == KeyPress::F10Key) vst3KeyCode = 49;
- else if (juceKeyCode == KeyPress::F11Key) vst3KeyCode = 50;
- else if (juceKeyCode == KeyPress::F12Key) vst3KeyCode = 51;
-
- else if (juceKeyCode == KeyPress::F13Key) vst3KeyCode = 65;
- else if (juceKeyCode == KeyPress::F14Key) vst3KeyCode = 66;
- else if (juceKeyCode == KeyPress::F15Key) vst3KeyCode = 67;
- else if (juceKeyCode == KeyPress::F16Key) vst3KeyCode = 68;
- else if (juceKeyCode == KeyPress::F17Key) vst3KeyCode = 69;
- else if (juceKeyCode == KeyPress::F18Key) vst3KeyCode = 70;
- else if (juceKeyCode == KeyPress::F19Key) vst3KeyCode = 71;
- else if (juceKeyCode == KeyPress::F20Key) break;
- else if (juceKeyCode == KeyPress::F21Key) break;
- else if (juceKeyCode == KeyPress::F22Key) break;
- else if (juceKeyCode == KeyPress::F23Key) break;
- else if (juceKeyCode == KeyPress::F24Key) break;
- else if (juceKeyCode == KeyPress::F25Key) break;
- else if (juceKeyCode == KeyPress::F26Key) break;
- else if (juceKeyCode == KeyPress::F27Key) break;
- else if (juceKeyCode == KeyPress::F28Key) break;
- else if (juceKeyCode == KeyPress::F29Key) break;
- else if (juceKeyCode == KeyPress::F30Key) break;
- else if (juceKeyCode == KeyPress::F31Key) break;
- else if (juceKeyCode == KeyPress::F32Key) break;
- else if (juceKeyCode == KeyPress::F33Key) break;
- else if (juceKeyCode == KeyPress::F34Key) break;
- else if (juceKeyCode == KeyPress::F35Key) break;
-
- else if (juceKeyCode == KeyPress::numberPad0) vst3KeyCode = 24;
- else if (juceKeyCode == KeyPress::numberPad1) vst3KeyCode = 25;
- else if (juceKeyCode == KeyPress::numberPad2) vst3KeyCode = 26;
- else if (juceKeyCode == KeyPress::numberPad3) vst3KeyCode = 27;
- else if (juceKeyCode == KeyPress::numberPad4) vst3KeyCode = 28;
- else if (juceKeyCode == KeyPress::numberPad5) vst3KeyCode = 29;
- else if (juceKeyCode == KeyPress::numberPad6) vst3KeyCode = 30;
- else if (juceKeyCode == KeyPress::numberPad7) vst3KeyCode = 31;
- else if (juceKeyCode == KeyPress::numberPad8) vst3KeyCode = 32;
- else if (juceKeyCode == KeyPress::numberPad9) vst3KeyCode = 33;
-
- else if (juceKeyCode == KeyPress::numberPadAdd) vst3KeyCode = 35;
- else if (juceKeyCode == KeyPress::numberPadSubtract) vst3KeyCode = 37;
- else if (juceKeyCode == KeyPress::numberPadMultiply) vst3KeyCode = 34;
- else if (juceKeyCode == KeyPress::numberPadDivide) vst3KeyCode = 39;
- else if (juceKeyCode == KeyPress::numberPadSeparator) vst3KeyCode = 36;
- else if (juceKeyCode == KeyPress::numberPadDecimalPoint) vst3KeyCode = 38;
- else if (juceKeyCode == KeyPress::numberPadEquals) vst3KeyCode = 57;
-
- else if (juceKeyCode == KeyPress::numberPadDelete) break;
-
- else if (juceKeyCode == KeyPress::playKey) vst3KeyCode = 59;
- else if (juceKeyCode == KeyPress::stopKey) vst3KeyCode = 60;
- else if (juceKeyCode == KeyPress::fastForwardKey) vst3KeyCode = 62;
- else if (juceKeyCode == KeyPress::rewindKey) vst3KeyCode = 61;
-
- else
- {
- vst3KeyChar = static_cast<int16_t>(juceKeyCode);
-
- if ((juceKeyCode >= 0x30 && juceKeyCode <= 0x39) || (juceKeyCode >= 0x41 && juceKeyCode <= 0x5A))
- vst3KeyCode = static_cast<int16_t>(juceKeyCode - 0x30 + 128);
- }
- } while (false);
-
- if (juceKeyMods & ModifierKeys::shiftModifier)
- vst3KeyMods |= 1 << 0;
- if (juceKeyMods & ModifierKeys::altModifier)
- vst3KeyMods |= 1 << 1;
- if (juceKeyMods & ModifierKeys::commandModifier)
- vst3KeyMods |= 1 << 2;
- #if JUCE_MAC || JUCE_IOS
- if (juceKeyMods & ModifierKeys::ctrlModifier)
- vst3KeyMods |= 1 << 3;
- #endif
-
- fLastKeys.vst3.keychar = vst3KeyChar;
- fLastKeys.vst3.keycode = vst3KeyCode;
- fLastKeys.vst3.keymods = vst3KeyMods;
- return v3_cpp_obj(fVst3View)->on_key_down (fVst3View, vst3KeyChar, vst3KeyCode, vst3KeyMods) == V3_TRUE;
- }
-
- if (Component* const comp = getContentComponent())
- return comp->keyPressed (key);
-
- return false;
- }
-
- bool keyStateChanged (bool isKeyDown) override
- {
- if (DialogWindow::keyStateChanged (isKeyDown))
- return true;
-
- if (fVst2Effect != nullptr && (fLastKeys.vst2.index != 0 || fLastKeys.vst2.value != 0) && ! isKeyDown)
- {
- const int vstKeyIndex = fLastKeys.vst2.index;
- const int vstKeyValue = fLastKeys.vst2.value;
- fLastKeys.vst2.index = fLastKeys.vst2.value = 0;
- return fVst2Effect->dispatcher (fVst2Effect, effEditKeyUp, vstKeyIndex, vstKeyValue, nullptr, 0.0f) != 0;
- }
-
- if (fVst3View != nullptr && (fLastKeys.vst3.keychar != 0 || fLastKeys.vst3.keycode != 0) && ! isKeyDown)
- {
- const int16_t vst3KeyChar = fLastKeys.vst3.keychar;
- const int16_t vst3KeyCode = fLastKeys.vst3.keycode;
- const int16_t vst3KeyMods = fLastKeys.vst3.keymods;
- fLastKeys.vst3.keychar = fLastKeys.vst3.keycode = fLastKeys.vst3.keymods = 0;
- return v3_cpp_obj(fVst3View)->on_key_up (fVst3View, vst3KeyChar, vst3KeyCode, vst3KeyMods) == V3_TRUE;
- }
-
- if (Component* const comp = getContentComponent())
- return comp->keyStateChanged (isKeyDown);
-
- return false;
- }
-
- void modifierKeysChanged (const ModifierKeys& modifiers) override
- {
- DialogWindow::modifierKeysChanged (modifiers);
-
- if (fVst2Effect != nullptr)
- {
- const int oldRawFlags = fLastKeys.vst2.rmods;
- const int newRawFlags = modifiers.getRawFlags();
-
- if ((oldRawFlags & ModifierKeys::shiftModifier) != (newRawFlags & ModifierKeys::shiftModifier))
- {
- fVst2Effect->dispatcher (fVst2Effect,
- (newRawFlags & ModifierKeys::shiftModifier) ? effEditKeyDown : effEditKeyUp,
- 0, 54, nullptr, 0.0f);
- }
-
- if ((oldRawFlags & ModifierKeys::ctrlModifier) != (newRawFlags & ModifierKeys::ctrlModifier))
- {
- fVst2Effect->dispatcher (fVst2Effect,
- (newRawFlags & ModifierKeys::ctrlModifier) ? effEditKeyDown : effEditKeyUp,
- 0, 55, nullptr, 0.0f);
- }
-
- if ((oldRawFlags & ModifierKeys::altModifier) != (newRawFlags & ModifierKeys::altModifier))
- {
- fVst2Effect->dispatcher (fVst2Effect,
- (newRawFlags & ModifierKeys::altModifier) ? effEditKeyDown : effEditKeyUp,
- 0, 56, nullptr, 0.0f);
- }
-
- if ((oldRawFlags & ModifierKeys::popupMenuClickModifier) != (newRawFlags & ModifierKeys::popupMenuClickModifier))
- {
- fVst2Effect->dispatcher (fVst2Effect,
- (newRawFlags & ModifierKeys::popupMenuClickModifier) ? effEditKeyDown : effEditKeyUp,
- 0, 58, nullptr, 0.0f);
- }
-
- fLastKeys.vst2.rmods = newRawFlags;
- }
-
- if (fVst3View != nullptr)
- {
- const int oldRawFlags = fLastKeys.vst3.rmods;
- const int newRawFlags = modifiers.getRawFlags();
-
- if ((oldRawFlags & ModifierKeys::shiftModifier) != (newRawFlags & ModifierKeys::shiftModifier))
- {
- if (newRawFlags & ModifierKeys::shiftModifier)
- v3_cpp_obj(fVst3View)->on_key_down (fVst3View, 0, 54, fLastKeys.vst3.keymods);
- else
- v3_cpp_obj(fVst3View)->on_key_up (fVst3View, 0, 54, fLastKeys.vst3.keymods);
- }
-
- if ((oldRawFlags & ModifierKeys::ctrlModifier) != (newRawFlags & ModifierKeys::ctrlModifier))
- {
- if (newRawFlags & ModifierKeys::ctrlModifier)
- v3_cpp_obj(fVst3View)->on_key_down (fVst3View, 0, 55, fLastKeys.vst3.keymods);
- else
- v3_cpp_obj(fVst3View)->on_key_up (fVst3View, 0, 55, fLastKeys.vst3.keymods);
- }
-
- if ((oldRawFlags & ModifierKeys::altModifier) != (newRawFlags & ModifierKeys::altModifier))
- {
- if (newRawFlags & ModifierKeys::altModifier)
- v3_cpp_obj(fVst3View)->on_key_down (fVst3View, 0, 56, fLastKeys.vst3.keymods);
- else
- v3_cpp_obj(fVst3View)->on_key_up (fVst3View, 0, 56, fLastKeys.vst3.keymods);
- }
-
- if ((oldRawFlags & ModifierKeys::popupMenuClickModifier) != (newRawFlags & ModifierKeys::popupMenuClickModifier))
- {
- if (newRawFlags & ModifierKeys::popupMenuClickModifier)
- v3_cpp_obj(fVst3View)->on_key_down (fVst3View, 0, 58, fLastKeys.vst3.keymods);
- else
- v3_cpp_obj(fVst3View)->on_key_up (fVst3View, 0, 58, fLastKeys.vst3.keymods);
- }
-
- fLastKeys.vst3.rmods = newRawFlags;
- }
- }
-
- void focusGained (const FocusChangeType cause) override
- {
- DialogWindow::focusGained (cause);
-
- if (fVst3View != nullptr)
- v3_cpp_obj(fVst3View)->on_focus (fVst3View, true);
- }
-
- void focusLost (const FocusChangeType cause) override
- {
- if (fVst3View != nullptr)
- v3_cpp_obj(fVst3View)->on_focus (fVst3View, false);
-
- DialogWindow::focusLost (cause);
- }
-
- void hide()
- {
- setVisible(false);
-
- if (isOnDesktop())
- removeFromDesktop();
-
- clearContentComponent();
- }
-
- bool wasClosedByUser() const noexcept
- {
- return fClosed;
- }
-
- protected:
- void closeButtonPressed() override
- {
- fClosed = true;
- }
-
- bool escapeKeyPressed() override
- {
- fClosed = true;
- return true;
- }
-
- int getDesktopWindowStyleFlags() const override
- {
- int wflags = 0;
- wflags |= ComponentPeer::windowHasCloseButton;
- wflags |= ComponentPeer::windowHasDropShadow;
- wflags |= ComponentPeer::windowHasTitleBar;
- if (fIsStandalone)
- wflags |= ComponentPeer::windowAppearsOnTaskbar;
- return wflags;
- }
-
- #ifndef CARLA_OS_LINUX
- void handleCommandMessage(const int comamndId) override
- {
- CARLA_SAFE_ASSERT_RETURN(comamndId == 0,);
-
- if (fShown)
- {
- fShown = false;
- setAlwaysOnTop(false);
- }
- }
- #endif
-
- private:
- const bool fIsStandalone;
- volatile bool fClosed;
- bool fShown;
- const uintptr_t fTransientId;
- union {
- struct {
- int index;
- int value;
- int rmods;
- } vst2;
-
- struct {
- int16_t keychar;
- int16_t keycode;
- int16_t keymods;
- int rmods;
- } vst3;
- } fLastKeys;
- AEffect* const fVst2Effect;
- v3_plugin_view** const fVst3View;
-
- void setTransient()
- {
- if (fTransientId == 0)
- return;
-
- #if defined(CARLA_OS_LINUX) && defined(HAVE_X11)
- Display* const display = XWindowSystem::getInstance()->getDisplay();
- CARLA_SAFE_ASSERT_RETURN(display != nullptr,);
-
- ::Window window = (::Window)getWindowHandle();
-
- CARLA_SAFE_ASSERT_RETURN(window != 0,);
-
- XSetTransientForHint(display, window, static_cast<::Window>(fTransientId));
- #endif
-
- #ifdef CARLA_OS_MAC
- NSView* const view = (NSView*)getWindowHandle();
- CARLA_SAFE_ASSERT_RETURN(view != nullptr,);
-
- NSWindow* const window = [view window];
- CARLA_SAFE_ASSERT_RETURN(window != nullptr,);
-
- NSWindow* const parentWindow = [NSApp windowWithWindowNumber:fTransientId];
- CARLA_SAFE_ASSERT_RETURN(parentWindow != nullptr,);
-
- [parentWindow addChildWindow:window
- ordered:NSWindowAbove];
- #endif
-
- #ifdef CARLA_OS_WIN
- const HWND window = (HWND)getWindowHandle();
- CARLA_SAFE_ASSERT_RETURN(window != nullptr,);
-
- SetWindowLongPtr(window, GWLP_HWNDPARENT, static_cast<LONG_PTR>(fTransientId));
- #endif
- }
-
- CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(JucePluginWindow)
- };
-
- } // namespace juce
-
- using juce::JucePluginWindow;
-
- // -----------------------------------------------------------------------
-
- #endif // JUCE_PLUGIN_WINDOW_HPP_INCLUDED
|