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.

195 lines
5.8KB

  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. namespace juce
  19. {
  20. //==============================================================================
  21. class UIAWindowProvider : public UIAProviderBase,
  22. public ComBaseClassHelper<ComTypes::IWindowProvider>
  23. {
  24. public:
  25. using UIAProviderBase::UIAProviderBase;
  26. //==============================================================================
  27. JUCE_COMRESULT SetVisualState (ComTypes::WindowVisualState state) override
  28. {
  29. if (! isElementValid())
  30. return (HRESULT) UIA_E_ELEMENTNOTAVAILABLE;
  31. if (auto* peer = getPeer())
  32. {
  33. switch (state)
  34. {
  35. case ComTypes::WindowVisualState_Maximized:
  36. peer->setFullScreen (true);
  37. break;
  38. case ComTypes::WindowVisualState_Minimized:
  39. peer->setMinimised (true);
  40. break;
  41. case ComTypes::WindowVisualState_Normal:
  42. peer->setFullScreen (false);
  43. peer->setMinimised (false);
  44. break;
  45. default:
  46. break;
  47. }
  48. return S_OK;
  49. }
  50. return (HRESULT) UIA_E_NOTSUPPORTED;
  51. }
  52. JUCE_COMRESULT Close() override
  53. {
  54. if (! isElementValid())
  55. return (HRESULT) UIA_E_ELEMENTNOTAVAILABLE;
  56. if (auto* peer = getPeer())
  57. {
  58. peer->handleUserClosingWindow();
  59. return S_OK;
  60. }
  61. return (HRESULT) UIA_E_NOTSUPPORTED;
  62. }
  63. JUCE_COMRESULT WaitForInputIdle (int, BOOL* pRetVal) override
  64. {
  65. return withCheckedComArgs (pRetVal, *this, []
  66. {
  67. return (HRESULT) UIA_E_NOTSUPPORTED;
  68. });
  69. }
  70. JUCE_COMRESULT get_CanMaximize (BOOL* pRetVal) override
  71. {
  72. return withCheckedComArgs (pRetVal, *this, [&]() -> HRESULT
  73. {
  74. if (auto* peer = getPeer())
  75. {
  76. *pRetVal = (peer->getStyleFlags() & ComponentPeer::windowHasMaximiseButton) != 0;
  77. return S_OK;
  78. }
  79. return (HRESULT) UIA_E_NOTSUPPORTED;
  80. });
  81. }
  82. JUCE_COMRESULT get_CanMinimize (BOOL* pRetVal) override
  83. {
  84. return withCheckedComArgs (pRetVal, *this, [&]() -> HRESULT
  85. {
  86. if (auto* peer = getPeer())
  87. {
  88. *pRetVal = (peer->getStyleFlags() & ComponentPeer::windowHasMinimiseButton) != 0;
  89. return S_OK;
  90. }
  91. return (HRESULT) UIA_E_NOTSUPPORTED;
  92. });
  93. }
  94. JUCE_COMRESULT get_IsModal (BOOL* pRetVal) override
  95. {
  96. return withCheckedComArgs (pRetVal, *this, [&]() -> HRESULT
  97. {
  98. if (auto* peer = getPeer())
  99. {
  100. *pRetVal = peer->getComponent().isCurrentlyModal();
  101. return S_OK;
  102. }
  103. return (HRESULT) UIA_E_NOTSUPPORTED;
  104. });
  105. }
  106. JUCE_COMRESULT get_WindowVisualState (ComTypes::WindowVisualState* pRetVal) override
  107. {
  108. return withCheckedComArgs (pRetVal, *this, [&]() -> HRESULT
  109. {
  110. if (auto* peer = getPeer())
  111. {
  112. if (peer->isFullScreen())
  113. *pRetVal = ComTypes::WindowVisualState_Maximized;
  114. else if (peer->isMinimised())
  115. *pRetVal = ComTypes::WindowVisualState_Minimized;
  116. else
  117. *pRetVal = ComTypes::WindowVisualState_Normal;
  118. return S_OK;
  119. }
  120. return (HRESULT) UIA_E_NOTSUPPORTED;
  121. });
  122. }
  123. JUCE_COMRESULT get_WindowInteractionState (ComTypes::WindowInteractionState* pRetVal) override
  124. {
  125. return withCheckedComArgs (pRetVal, *this, [&]() -> HRESULT
  126. {
  127. if (auto* peer = getPeer())
  128. {
  129. *pRetVal = peer->getComponent().isCurrentlyBlockedByAnotherModalComponent()
  130. ? ComTypes::WindowInteractionState::WindowInteractionState_BlockedByModalWindow
  131. : ComTypes::WindowInteractionState::WindowInteractionState_Running;
  132. return S_OK;
  133. }
  134. return (HRESULT) UIA_E_NOTSUPPORTED;
  135. });
  136. }
  137. JUCE_COMRESULT get_IsTopmost (BOOL* pRetVal) override
  138. {
  139. return withCheckedComArgs (pRetVal, *this, [&]() -> HRESULT
  140. {
  141. if (auto* peer = getPeer())
  142. {
  143. *pRetVal = peer->isFocused();
  144. return S_OK;
  145. }
  146. return (HRESULT) UIA_E_NOTSUPPORTED;
  147. });
  148. }
  149. private:
  150. ComponentPeer* getPeer() const
  151. {
  152. return getHandler().getComponent().getPeer();
  153. }
  154. //==============================================================================
  155. JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (UIAWindowProvider)
  156. };
  157. } // namespace juce