The JUCE cross-platform C++ framework, with DISTRHO/KXStudio specific changes
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 lines
3.1KB

  1. /*
  2. ==============================================================================
  3. This file is part of the JUCE library.
  4. Copyright (c) 2022 - Raw Material Software Limited
  5. JUCE is an open source library subject to commercial or open-source
  6. licensing.
  7. By using JUCE, you agree to the terms of both the JUCE 7 End-User License
  8. Agreement and JUCE Privacy Policy.
  9. End User License Agreement: www.juce.com/juce-7-licence
  10. Privacy Policy: www.juce.com/juce-privacy-policy
  11. Or: You may also use this code under the terms of the GPL v3 (see
  12. www.gnu.org/licenses).
  13. JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
  14. EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
  15. DISCLAIMED.
  16. ==============================================================================
  17. */
  18. #pragma once
  19. #if JUCE_MAC
  20. #include <juce_audio_plugin_client/detail/juce_IncludeModuleHeaders.h>
  21. namespace juce::detail
  22. {
  23. struct VSTWindowUtilities
  24. {
  25. VSTWindowUtilities() = delete;
  26. static void* attachComponentToWindowRefVST (Component* comp,
  27. int desktopFlags,
  28. void* parentWindowOrView)
  29. {
  30. JUCE_AUTORELEASEPOOL
  31. {
  32. NSView* parentView = [(NSView*) parentWindowOrView retain];
  33. const auto defaultFlags = JucePlugin_EditorRequiresKeyboardFocus
  34. ? 0
  35. : ComponentPeer::windowIgnoresKeyPresses;
  36. comp->addToDesktop (desktopFlags | defaultFlags, parentView);
  37. // (this workaround is because Wavelab provides a zero-size parent view..)
  38. if (approximatelyEqual ([parentView frame].size.height, 0.0))
  39. [((NSView*) comp->getWindowHandle()) setFrameOrigin: NSZeroPoint];
  40. comp->setVisible (true);
  41. comp->toFront (false);
  42. [[parentView window] setAcceptsMouseMovedEvents: YES];
  43. return parentView;
  44. }
  45. }
  46. static void detachComponentFromWindowRefVST (Component* comp,
  47. void* window)
  48. {
  49. JUCE_AUTORELEASEPOOL
  50. {
  51. comp->removeFromDesktop();
  52. [(id) window release];
  53. }
  54. }
  55. static void setNativeHostWindowSizeVST (void* window,
  56. Component* component,
  57. int newWidth,
  58. int newHeight)
  59. {
  60. JUCE_AUTORELEASEPOOL
  61. {
  62. if (NSView* hostView = (NSView*) window)
  63. {
  64. const int dx = newWidth - component->getWidth();
  65. const int dy = newHeight - component->getHeight();
  66. NSRect r = [hostView frame];
  67. r.size.width += dx;
  68. r.size.height += dy;
  69. r.origin.y -= dy;
  70. [hostView setFrame: r];
  71. }
  72. }
  73. }
  74. };
  75. } // namespace juce::detail
  76. #endif