From 640194c87857978c86fcc4f3a0a5f675e323435c Mon Sep 17 00:00:00 2001 From: reuk Date: Mon, 10 Jan 2022 15:30:01 +0000 Subject: [PATCH] MinGW: Improve compatibility With this patch applied, the DemoRunner should build under MinGW, and be (nearly) feature-complete compared to the MSVC build. Specifically, when building with MinGW: - Adds support for accessibility - Fixes build issues in the juce_video module - Fixes a link issue in the VST3 wrapper when VST3_CAN_REPLACE_VST2 is defined - Adds support for the new-style native FileChooser - Tidies up some other low-severity warnings Known issues: - Direct2D rendering is still not supported when building with MinGW due to ABI compatibilities. --- extras/Build/CMake/JUCEHelperTargets.cmake | 6 +- .../VST3/juce_VST3_Wrapper.cpp | 6 +- .../utility/juce_CheckSettingMacros.h | 5 - .../utility/juce_PluginUtilities.cpp | 2 +- .../format_types/juce_VST3PluginFormat.cpp | 34 +- .../native/juce_BasicNativeHeaders.h | 4 +- .../juce_core/native/juce_win32_Threads.cpp | 2 - modules/juce_core/system/juce_PlatformDefs.h | 2 +- modules/juce_core/time/juce_Time.cpp | 6 +- modules/juce_graphics/juce_graphics.cpp | 8 + .../juce_win32_DirectWriteTypeLayout.cpp | 5 +- .../native/juce_win32_DirectWriteTypeface.cpp | 6 +- .../juce_graphics/native/juce_win32_Fonts.cpp | 1 + modules/juce_gui_basics/juce_gui_basics.cpp | 50 +- .../juce_win32_Accessibility.cpp | 18 +- .../juce_win32_AccessibilityElement.cpp | 110 ++-- .../juce_win32_AccessibilityElement.h | 14 +- .../accessibility/juce_win32_ComInterfaces.h | 371 +++++++++++++ .../juce_win32_UIAExpandCollapseProvider.h | 17 +- .../juce_win32_UIAGridItemProvider.h | 7 +- .../juce_win32_UIAGridProvider.h | 7 +- .../juce_win32_UIAInvokeProvider.h | 9 +- .../juce_win32_UIARangeValueProvider.h | 7 +- .../juce_win32_UIASelectionProvider.h | 31 +- .../juce_win32_UIATextProvider.h | 115 ++-- .../juce_win32_UIAToggleProvider.h | 15 +- .../juce_win32_UIATransformProvider.h | 7 +- .../juce_win32_UIAValueProvider.h | 7 +- .../juce_win32_UIAWindowProvider.h | 29 +- .../juce_win32_WindowsUIAWrapper.h | 2 + .../native/juce_win32_FileChooser.cpp | 14 +- .../native/juce_win32_Windowing.cpp | 18 +- .../native/juce_win32_WebBrowserComponent.cpp | 18 +- modules/juce_video/juce_video.cpp | 11 +- .../native/juce_win32_CameraDevice.h | 177 +++--- .../juce_video/native/juce_win32_ComTypes.h | 512 ++++++++++++++++++ modules/juce_video/native/juce_win32_Video.h | 108 ++-- 37 files changed, 1283 insertions(+), 478 deletions(-) create mode 100644 modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h create mode 100644 modules/juce_video/native/juce_win32_ComTypes.h diff --git a/extras/Build/CMake/JUCEHelperTargets.cmake b/extras/Build/CMake/JUCEHelperTargets.cmake index 47085b1736..4d145ebf38 100644 --- a/extras/Build/CMake/JUCEHelperTargets.cmake +++ b/extras/Build/CMake/JUCEHelperTargets.cmake @@ -53,9 +53,9 @@ if((CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") OR (CMAKE_CXX_COMPILER_FRONTEND_VARIA $<$:$,-GL,-flto>>) target_link_libraries(juce_recommended_lto_flags INTERFACE $<$:$<$:-LTCG>>) -elseif((CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - OR (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") - OR (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")) +elseif((NOT MINGW) AND ((CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + OR (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") + OR (CMAKE_CXX_COMPILER_ID STREQUAL "GNU"))) target_compile_options(juce_recommended_lto_flags INTERFACE $<$:-flto>) target_link_libraries(juce_recommended_lto_flags INTERFACE $<$:-flto>) endif() diff --git a/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp index e5eac010e5..4455e886e0 100644 --- a/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp @@ -58,7 +58,7 @@ JUCE_BEGIN_NO_SANITIZE ("vptr") #if JUCE_VST3_CAN_REPLACE_VST2 - #if ! JUCE_MSVC + #if ! JUCE_MSVC && ! defined (__cdecl) #define __cdecl #endif @@ -3541,10 +3541,12 @@ DECLARE_CLASS_IID (JuceAudioProcessor, 0x0101ABAB, 0xABCDEF01, JucePlugin_Manufa DEF_CLASS_IID (JuceAudioProcessor) #if JUCE_VST3_CAN_REPLACE_VST2 + // Defined in PluginUtilities.cpp + void getUUIDForVST2ID (bool, uint8[16]); + FUID getFUIDForVST2ID (bool forControllerUID) { TUID uuid; - extern JUCE_API void getUUIDForVST2ID (bool, uint8[16]); getUUIDForVST2ID (forControllerUID, (uint8*) uuid); return FUID (uuid); } diff --git a/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h b/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h index 6bea843075..baaa59f061 100644 --- a/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h +++ b/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h @@ -73,11 +73,6 @@ #define JucePlugin_Build_RTAS 0 #endif -#if ! (defined (_MSC_VER) || defined (__APPLE_CPP__) || defined (__APPLE_CC__) || defined (LINUX) || defined (__linux__)) - #undef JucePlugin_Build_VST3 - #define JucePlugin_Build_VST3 0 -#endif - //============================================================================== #if JucePlugin_Build_LV2 && ! defined (JucePlugin_LV2URI) #error "You need to define the JucePlugin_LV2URI value!" diff --git a/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp b/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp index 4144fc4383..23236a6978 100644 --- a/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp +++ b/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp @@ -46,7 +46,7 @@ namespace juce #define VST3_REPLACEMENT_AVAILABLE 1 // NB: Nasty old-fashioned code in here because it's copied from the Steinberg example code. - void JUCE_API getUUIDForVST2ID (bool forControllerUID, uint8 uuid[16]) + void getUUIDForVST2ID (bool forControllerUID, uint8 uuid[16]) { #if JUCE_MSVC const auto juce_sprintf = [] (auto&& head, auto&&... tail) { sprintf_s (head, numElementsInArray (head), tail...); }; diff --git a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp index 59298c4cbd..e566f7cc8a 100644 --- a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp @@ -581,7 +581,7 @@ private: tresult getInt (Steinberg::int64& result) const { - if (kind != Kind::Int) + if (kind != Kind::tagInt) return kResultFalse; result = storage.storedInt; @@ -590,7 +590,7 @@ private: tresult getFloat (double& result) const { - if (kind != Kind::Float) + if (kind != Kind::tagFloat) return kResultFalse; result = storage.storedFloat; @@ -599,7 +599,7 @@ private: tresult getString (Vst::TChar* data, Steinberg::uint32 numBytes) const { - if (kind != Kind::String) + if (kind != Kind::tagString) return kResultFalse; std::memcpy (data, @@ -610,7 +610,7 @@ private: tresult getBinary (const void*& data, Steinberg::uint32& numBytes) const { - if (kind != Kind::Binary) + if (kind != Kind::tagBinary) return kResultFalse; data = storage.storedBinary.data(); @@ -619,19 +619,19 @@ private: } private: - void constructFrom (Int x) noexcept { kind = Kind::Int; new (&storage.storedInt) Int (std::move (x)); } - void constructFrom (Float x) noexcept { kind = Kind::Float; new (&storage.storedFloat) Float (std::move (x)); } - void constructFrom (String x) noexcept { kind = Kind::String; new (&storage.storedString) String (std::move (x)); } - void constructFrom (Binary x) noexcept { kind = Kind::Binary; new (&storage.storedBinary) Binary (std::move (x)); } + void constructFrom (Int x) noexcept { kind = Kind::tagInt; new (&storage.storedInt) Int (std::move (x)); } + void constructFrom (Float x) noexcept { kind = Kind::tagFloat; new (&storage.storedFloat) Float (std::move (x)); } + void constructFrom (String x) noexcept { kind = Kind::tagString; new (&storage.storedString) String (std::move (x)); } + void constructFrom (Binary x) noexcept { kind = Kind::tagBinary; new (&storage.storedBinary) Binary (std::move (x)); } void reset() noexcept { switch (kind) { - case Kind::Int: break; - case Kind::Float: break; - case Kind::String: storage.storedString.~vector(); break; - case Kind::Binary: storage.storedBinary.~vector(); break; + case Kind::tagInt: break; + case Kind::tagFloat: break; + case Kind::tagString: storage.storedString.~vector(); break; + case Kind::tagBinary: storage.storedBinary.~vector(); break; } } @@ -639,14 +639,14 @@ private: { switch (other.kind) { - case Kind::Int: constructFrom (std::move (other.storage.storedInt)); break; - case Kind::Float: constructFrom (std::move (other.storage.storedFloat)); break; - case Kind::String: constructFrom (std::move (other.storage.storedString)); break; - case Kind::Binary: constructFrom (std::move (other.storage.storedBinary)); break; + case Kind::tagInt: constructFrom (std::move (other.storage.storedInt)); break; + case Kind::tagFloat: constructFrom (std::move (other.storage.storedFloat)); break; + case Kind::tagString: constructFrom (std::move (other.storage.storedString)); break; + case Kind::tagBinary: constructFrom (std::move (other.storage.storedBinary)); break; } } - enum class Kind { Int, Float, String, Binary }; + enum class Kind { tagInt, tagFloat, tagString, tagBinary }; union Storage { diff --git a/modules/juce_core/native/juce_BasicNativeHeaders.h b/modules/juce_core/native/juce_BasicNativeHeaders.h index 65c3f83389..d524214b43 100644 --- a/modules/juce_core/native/juce_BasicNativeHeaders.h +++ b/modules/juce_core/native/juce_BasicNativeHeaders.h @@ -132,7 +132,9 @@ #define STRICT 1 #define WIN32_LEAN_AND_MEAN 1 #if JUCE_MINGW - #define _WIN32_WINNT 0x0600 + #if ! defined (_WIN32_WINNT) + #define _WIN32_WINNT 0x0600 + #endif #else #define _WIN32_WINNT 0x0602 #endif diff --git a/modules/juce_core/native/juce_win32_Threads.cpp b/modules/juce_core/native/juce_win32_Threads.cpp index 00231fb183..1a40043536 100644 --- a/modules/juce_core/native/juce_win32_Threads.cpp +++ b/modules/juce_core/native/juce_win32_Threads.cpp @@ -53,8 +53,6 @@ void CriticalSection::exit() const noexcept { LeaveCriticalSection ((CRI //============================================================================== -void JUCE_API juce_threadEntryPoint (void*); - static unsigned int STDMETHODCALLTYPE threadEntryProc (void* userData) { if (juce_messageWindowHandle != nullptr) diff --git a/modules/juce_core/system/juce_PlatformDefs.h b/modules/juce_core/system/juce_PlatformDefs.h index e9376d77fa..c0943302ca 100644 --- a/modules/juce_core/system/juce_PlatformDefs.h +++ b/modules/juce_core/system/juce_PlatformDefs.h @@ -71,7 +71,7 @@ namespace juce #pragma intrinsic (__debugbreak) #endif #define JUCE_BREAK_IN_DEBUGGER { __debugbreak(); } -#elif JUCE_INTEL && (JUCE_GCC || JUCE_MAC || JUCE_CLANG) +#elif JUCE_INTEL && (JUCE_GCC || JUCE_CLANG || JUCE_MAC) #if JUCE_NO_INLINE_ASM #define JUCE_BREAK_IN_DEBUGGER { } #else diff --git a/modules/juce_core/time/juce_Time.cpp b/modules/juce_core/time/juce_Time.cpp index b76824501b..4dbae77f2f 100644 --- a/modules/juce_core/time/juce_Time.cpp +++ b/modules/juce_core/time/juce_Time.cpp @@ -379,8 +379,7 @@ String Time::getTimeZone() const { String zone[2]; - #if JUCE_WINDOWS - #if JUCE_MSVC || JUCE_CLANG + #if JUCE_WINDOWS && (JUCE_MSVC || JUCE_CLANG) _tzset(); for (int i = 0; i < 2; ++i) @@ -390,9 +389,6 @@ String Time::getTimeZone() const _get_tzname (&length, name, sizeof (name) - 1, i); zone[i] = name; } - #else - #warning "Can't find a replacement for tzset on mingw - ideas welcome!" - #endif #else tzset(); diff --git a/modules/juce_graphics/juce_graphics.cpp b/modules/juce_graphics/juce_graphics.cpp index 77d8270802..510b38f1ef 100644 --- a/modules/juce_graphics/juce_graphics.cpp +++ b/modules/juce_graphics/juce_graphics.cpp @@ -54,6 +54,14 @@ #endif #if JUCE_USE_DIRECTWRITE || JUCE_DIRECT2D + /* This is a workaround for broken-by-default function definitions + in the MinGW headers. If you're using a newer distribution of MinGW, + then your headers may substitute the broken definitions with working definitions + when this flag is enabled. Unfortunately, not all MinGW headers contain this + workaround, so Direct2D remains disabled by default when building with MinGW. + */ + #define WIDL_EXPLICIT_AGGREGATE_RETURNS 1 + /* If you hit a compile error trying to include these files, you may need to update your version of the Windows SDK to the latest one. The DirectWrite and Direct2D headers are in the version 7 SDKs. diff --git a/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp b/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp index 1b194506dd..a877e559b6 100644 --- a/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp +++ b/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp @@ -201,6 +201,7 @@ namespace DirectWriteTypeLayout ComSmartPtr dwFont; auto hr = fontCollection.GetFontFromFontFace (glyphRun.fontFace, dwFont.resetAndGetPointerAddress()); + ignoreUnused (hr); jassert (dwFont != nullptr); ComSmartPtr dwFontFamily; @@ -289,6 +290,7 @@ namespace DirectWriteTypeLayout ComSmartPtr fontFamily; auto hr = fontCollection.GetFontFamily (fontIndex, fontFamily.resetAndGetPointerAddress()); + ignoreUnused (hr); ComSmartPtr dwFont; uint32 fontFacesCount = 0; @@ -394,6 +396,7 @@ namespace DirectWriteTypeLayout UINT32 actualLineCount = 0; auto hr = dwTextLayout->GetLineMetrics (nullptr, 0, &actualLineCount); + ignoreUnused (hr); layout.ensureStorageAllocated ((int) actualLineCount); @@ -415,7 +418,7 @@ namespace DirectWriteTypeLayout line.stringRange = Range (lastLocation, lastLocation + (int) dwLineMetrics[i].length); line.lineOrigin.y += yAdjustment; yAdjustment += extraLineSpacing; - lastLocation += dwLineMetrics[i].length; + lastLocation += (int) dwLineMetrics[i].length; } } diff --git a/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp b/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp index e4869ed0a4..189ca991c1 100644 --- a/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp +++ b/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp @@ -36,6 +36,7 @@ namespace uint32 index = 0; BOOL exists = false; auto hr = names->FindLocaleName (L"en-us", &index, &exists); + ignoreUnused (hr); if (! exists) index = 0; @@ -54,7 +55,7 @@ namespace jassert (family != nullptr); ComSmartPtr familyNames; auto hr = family->GetFamilyNames (familyNames.resetAndGetPointerAddress()); - jassert (SUCCEEDED (hr)); ignoreUnused (hr); + jassertquiet (SUCCEEDED (hr)); return getLocalisedName (familyNames); } @@ -63,7 +64,7 @@ namespace jassert (font != nullptr); ComSmartPtr faceNames; auto hr = font->GetFaceNames (faceNames.resetAndGetPointerAddress()); - jassert (SUCCEEDED (hr)); ignoreUnused (hr); + jassertquiet (SUCCEEDED (hr)); return getLocalisedName (faceNames); } @@ -152,6 +153,7 @@ public: uint32 fontIndex = 0; auto hr = fontCollection->FindFamilyName (font.getTypefaceName().toWideCharPointer(), &fontIndex, &fontFound); + ignoreUnused (hr); if (! fontFound) fontIndex = 0; diff --git a/modules/juce_graphics/native/juce_win32_Fonts.cpp b/modules/juce_graphics/native/juce_win32_Fonts.cpp index f7245d73b7..119a60e548 100644 --- a/modules/juce_graphics/native/juce_win32_Fonts.cpp +++ b/modules/juce_graphics/native/juce_win32_Fonts.cpp @@ -235,6 +235,7 @@ StringArray Font::findAllTypefaceStyles (const String& family) BOOL fontFound = false; uint32 fontIndex = 0; auto hr = factories->systemFonts->FindFamilyName (family.toWideCharPointer(), &fontIndex, &fontFound); + ignoreUnused (hr); if (! fontFound) fontIndex = 0; diff --git a/modules/juce_gui_basics/juce_gui_basics.cpp b/modules/juce_gui_basics/juce_gui_basics.cpp index 0fe481a99a..00144767d2 100644 --- a/modules/juce_gui_basics/juce_gui_basics.cpp +++ b/modules/juce_gui_basics/juce_gui_basics.cpp @@ -67,11 +67,8 @@ #include #include #include - - #if ! JUCE_MINGW - #include - #include - #endif + #include + #include #if JUCE_WEB_BROWSER #include @@ -310,26 +307,13 @@ JUCE_END_IGNORE_WARNINGS_GCC_LIKE #include "native/juce_mac_MouseCursor.mm" #elif JUCE_WINDOWS - - #if ! JUCE_MINGW - #include "native/accessibility/juce_win32_WindowsUIAWrapper.h" - #include "native/accessibility/juce_win32_AccessibilityElement.h" - #include "native/accessibility/juce_win32_UIAHelpers.h" - #include "native/accessibility/juce_win32_UIAProviders.h" - #include "native/accessibility/juce_win32_AccessibilityElement.cpp" - #include "native/accessibility/juce_win32_Accessibility.cpp" - #else - namespace juce - { - namespace WindowsAccessibility - { - long getUiaRootObjectId() { return -1; } - bool handleWmGetObject (AccessibilityHandler*, WPARAM, LPARAM, LRESULT*) { return false; } - void revokeUIAMapEntriesForWindow (HWND) {} - } - } - #endif - + #include "native/accessibility/juce_win32_ComInterfaces.h" + #include "native/accessibility/juce_win32_WindowsUIAWrapper.h" + #include "native/accessibility/juce_win32_AccessibilityElement.h" + #include "native/accessibility/juce_win32_UIAHelpers.h" + #include "native/accessibility/juce_win32_UIAProviders.h" + #include "native/accessibility/juce_win32_AccessibilityElement.cpp" + #include "native/accessibility/juce_win32_Accessibility.cpp" #include "native/juce_win32_Windowing.cpp" #include "native/juce_win32_DragAndDrop.cpp" #include "native/juce_win32_FileChooser.cpp" @@ -383,8 +367,8 @@ namespace juce #if JUCE_WINDOWS namespace juce { -MIDL_INTERFACE ("a5cd92ff-29be-454c-8d04-d82879fb3f1b") -juce_IVirtualDesktopManager : public IUnknown + +JUCE_COMCLASS (JuceIVirtualDesktopManager, "a5cd92ff-29be-454c-8d04-d82879fb3f1b") : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE IsWindowOnCurrentVirtualDesktop( @@ -400,13 +384,13 @@ public: __RPC__in REFGUID desktopId) = 0; }; -JUCE_COMCLASS (juce_VirtualDesktopManager, "aa509086-5ca9-4c25-8f95-589d3c07b48a"); +JUCE_COMCLASS (JuceVirtualDesktopManager, "aa509086-5ca9-4c25-8f95-589d3c07b48a"); } // namespace juce #ifdef __CRT_UUID_DECL -__CRT_UUID_DECL (juce::juce_IVirtualDesktopManager, 0xa5cd92ff, 0x29be, 0x454c, 0x8d, 0x04, 0xd8, 0x28, 0x79, 0xfb, 0x3f, 0x1b) -__CRT_UUID_DECL (juce::juce_VirtualDesktopManager, 0xaa509086, 0x5ca9, 0x4c25, 0x8f, 0x95, 0x58, 0x9d, 0x3c, 0x07, 0xb4, 0x8a) +__CRT_UUID_DECL (juce::JuceIVirtualDesktopManager, 0xa5cd92ff, 0x29be, 0x454c, 0x8d, 0x04, 0xd8, 0x28, 0x79, 0xfb, 0x3f, 0x1b) +__CRT_UUID_DECL (juce::JuceVirtualDesktopManager, 0xaa509086, 0x5ca9, 0x4c25, 0x8f, 0x95, 0x58, 0x9d, 0x3c, 0x07, 0xb4, 0x8a) #endif bool juce::isWindowOnCurrentVirtualDesktop (void* x) @@ -416,16 +400,16 @@ bool juce::isWindowOnCurrentVirtualDesktop (void* x) static auto* desktopManager = [] { - juce_IVirtualDesktopManager* result = nullptr; + JuceIVirtualDesktopManager* result = nullptr; JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token") - if (SUCCEEDED (CoCreateInstance (__uuidof (juce_VirtualDesktopManager), nullptr, CLSCTX_ALL, IID_PPV_ARGS (&result)))) + if (SUCCEEDED (CoCreateInstance (__uuidof (JuceVirtualDesktopManager), nullptr, CLSCTX_ALL, IID_PPV_ARGS (&result)))) return result; JUCE_END_IGNORE_WARNINGS_GCC_LIKE - return static_cast (nullptr); + return static_cast (nullptr); }(); BOOL current = false; diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp b/modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp index 406eb2cdc0..a116d1aa2e 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp @@ -159,7 +159,7 @@ void notifyAccessibilityEventInternal (const AccessibilityHandler& handler, Inte || eventType == InternalAccessibilityEvent::elementDestroyed) { if (auto* parent = handler.getParent()) - sendAccessibilityAutomationEvent (*parent, UIA_LayoutInvalidatedEventId); + sendAccessibilityAutomationEvent (*parent, ComTypes::UIA_LayoutInvalidatedEventId); return; } @@ -176,9 +176,9 @@ void notifyAccessibilityEventInternal (const AccessibilityHandler& handler, Inte { switch (eventType) { - case InternalAccessibilityEvent::focusChanged: return UIA_AutomationFocusChangedEventId; - case InternalAccessibilityEvent::windowOpened: return UIA_Window_WindowOpenedEventId; - case InternalAccessibilityEvent::windowClosed: return UIA_Window_WindowClosedEventId; + case InternalAccessibilityEvent::focusChanged: return ComTypes::UIA_AutomationFocusChangedEventId; + case InternalAccessibilityEvent::windowOpened: return ComTypes::UIA_Window_WindowOpenedEventId; + case InternalAccessibilityEvent::windowClosed: return ComTypes::UIA_Window_WindowClosedEventId; case InternalAccessibilityEvent::elementCreated: case InternalAccessibilityEvent::elementDestroyed: case InternalAccessibilityEvent::elementMovedOrResized: break; @@ -219,10 +219,10 @@ void AccessibilityHandler::notifyAccessibilityEvent (AccessibilityEvent eventTyp { switch (eventType) { - case AccessibilityEvent::textSelectionChanged: return UIA_Text_TextSelectionChangedEventId; - case AccessibilityEvent::textChanged: return UIA_Text_TextChangedEventId; - case AccessibilityEvent::structureChanged: return UIA_StructureChangedEventId; - case AccessibilityEvent::rowSelectionChanged: return UIA_SelectionItem_ElementSelectedEventId; + case AccessibilityEvent::textSelectionChanged: return ComTypes::UIA_Text_TextSelectionChangedEventId; + case AccessibilityEvent::textChanged: return ComTypes::UIA_Text_TextChangedEventId; + case AccessibilityEvent::structureChanged: return ComTypes::UIA_StructureChangedEventId; + case AccessibilityEvent::rowSelectionChanged: return ComTypes::UIA_SelectionItem_ElementSelectedEventId; case AccessibilityEvent::titleChanged: case AccessibilityEvent::valueChanged: break; } @@ -238,7 +238,7 @@ struct SpVoiceWrapper : public DeletedAtShutdown { SpVoiceWrapper() { - auto hr = voice.CoCreateInstance (CLSID_SpVoice); + auto hr = voice.CoCreateInstance (ComTypes::CLSID_SpVoice); jassertquiet (SUCCEEDED (hr)); } diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp b/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp index d00a4f3a93..816f998fa8 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp @@ -57,41 +57,41 @@ static auto roleToControlTypeId (AccessibilityRole roleType) case AccessibilityRole::popupMenu: case AccessibilityRole::dialogWindow: case AccessibilityRole::splashScreen: - case AccessibilityRole::window: return UIA_WindowControlTypeId; + case AccessibilityRole::window: return ComTypes::UIA_WindowControlTypeId; case AccessibilityRole::label: - case AccessibilityRole::staticText: return UIA_TextControlTypeId; + case AccessibilityRole::staticText: return ComTypes::UIA_TextControlTypeId; case AccessibilityRole::column: - case AccessibilityRole::row: return UIA_HeaderItemControlTypeId; + case AccessibilityRole::row: return ComTypes::UIA_HeaderItemControlTypeId; - case AccessibilityRole::button: return UIA_ButtonControlTypeId; - case AccessibilityRole::toggleButton: return UIA_CheckBoxControlTypeId; - case AccessibilityRole::radioButton: return UIA_RadioButtonControlTypeId; - case AccessibilityRole::comboBox: return UIA_ComboBoxControlTypeId; - case AccessibilityRole::image: return UIA_ImageControlTypeId; - case AccessibilityRole::slider: return UIA_SliderControlTypeId; - case AccessibilityRole::editableText: return UIA_EditControlTypeId; - case AccessibilityRole::menuItem: return UIA_MenuItemControlTypeId; - case AccessibilityRole::menuBar: return UIA_MenuBarControlTypeId; - case AccessibilityRole::table: return UIA_TableControlTypeId; - case AccessibilityRole::tableHeader: return UIA_HeaderControlTypeId; - case AccessibilityRole::cell: return UIA_DataItemControlTypeId; - case AccessibilityRole::hyperlink: return UIA_HyperlinkControlTypeId; - case AccessibilityRole::list: return UIA_ListControlTypeId; - case AccessibilityRole::listItem: return UIA_ListItemControlTypeId; - case AccessibilityRole::tree: return UIA_TreeControlTypeId; - case AccessibilityRole::treeItem: return UIA_TreeItemControlTypeId; - case AccessibilityRole::progressBar: return UIA_ProgressBarControlTypeId; - case AccessibilityRole::group: return UIA_GroupControlTypeId; - case AccessibilityRole::scrollBar: return UIA_ScrollBarControlTypeId; - case AccessibilityRole::tooltip: return UIA_ToolTipControlTypeId; + case AccessibilityRole::button: return ComTypes::UIA_ButtonControlTypeId; + case AccessibilityRole::toggleButton: return ComTypes::UIA_CheckBoxControlTypeId; + case AccessibilityRole::radioButton: return ComTypes::UIA_RadioButtonControlTypeId; + case AccessibilityRole::comboBox: return ComTypes::UIA_ComboBoxControlTypeId; + case AccessibilityRole::image: return ComTypes::UIA_ImageControlTypeId; + case AccessibilityRole::slider: return ComTypes::UIA_SliderControlTypeId; + case AccessibilityRole::editableText: return ComTypes::UIA_EditControlTypeId; + case AccessibilityRole::menuItem: return ComTypes::UIA_MenuItemControlTypeId; + case AccessibilityRole::menuBar: return ComTypes::UIA_MenuBarControlTypeId; + case AccessibilityRole::table: return ComTypes::UIA_TableControlTypeId; + case AccessibilityRole::tableHeader: return ComTypes::UIA_HeaderControlTypeId; + case AccessibilityRole::cell: return ComTypes::UIA_DataItemControlTypeId; + case AccessibilityRole::hyperlink: return ComTypes::UIA_HyperlinkControlTypeId; + case AccessibilityRole::list: return ComTypes::UIA_ListControlTypeId; + case AccessibilityRole::listItem: return ComTypes::UIA_ListItemControlTypeId; + case AccessibilityRole::tree: return ComTypes::UIA_TreeControlTypeId; + case AccessibilityRole::treeItem: return ComTypes::UIA_TreeItemControlTypeId; + case AccessibilityRole::progressBar: return ComTypes::UIA_ProgressBarControlTypeId; + case AccessibilityRole::group: return ComTypes::UIA_GroupControlTypeId; + case AccessibilityRole::scrollBar: return ComTypes::UIA_ScrollBarControlTypeId; + case AccessibilityRole::tooltip: return ComTypes::UIA_ToolTipControlTypeId; case AccessibilityRole::ignored: case AccessibilityRole::unspecified: break; }; - return UIA_CustomControlTypeId; + return ComTypes::UIA_CustomControlTypeId; } //============================================================================== @@ -109,7 +109,7 @@ JUCE_COMRESULT AccessibilityNativeHandle::QueryInterface (REFIID refId, void** r if (! isElementValid()) return (HRESULT) UIA_E_ELEMENTNOTAVAILABLE; - if ((refId == __uuidof (IRawElementProviderFragmentRoot) && ! isFragmentRoot())) + if ((refId == __uuidof (ComTypes::IRawElementProviderFragmentRoot) && ! isFragmentRoot())) return E_NOINTERFACE; return ComBaseClassHelper::QueryInterface (refId, result); @@ -133,7 +133,7 @@ JUCE_COMRESULT AccessibilityNativeHandle::get_ProviderOptions (ProviderOptions* if (options == nullptr) return E_INVALIDARG; - *options = ProviderOptions_ServerSideProvider | ProviderOptions_UseComThreading; + *options = (ProviderOptions) (ProviderOptions_ServerSideProvider | ProviderOptions_UseComThreading); return S_OK; } @@ -148,36 +148,36 @@ JUCE_COMRESULT AccessibilityNativeHandle::GetPatternProvider (PATTERNID pId, IUn switch (pId) { - case UIA_WindowPatternId: + case ComTypes::UIA_WindowPatternId: { if (fragmentRoot) return new UIAWindowProvider (this); break; } - case UIA_TransformPatternId: + case ComTypes::UIA_TransformPatternId: { if (fragmentRoot) return new UIATransformProvider (this); break; } - case UIA_TextPatternId: - case UIA_TextPattern2Id: + case ComTypes::UIA_TextPatternId: + case ComTypes::UIA_TextPattern2Id: { if (accessibilityHandler.getTextInterface() != nullptr) return new UIATextProvider (this); break; } - case UIA_ValuePatternId: + case ComTypes::UIA_ValuePatternId: { if (accessibilityHandler.getValueInterface() != nullptr) return new UIAValueProvider (this); break; } - case UIA_RangeValuePatternId: + case ComTypes::UIA_RangeValuePatternId: { if (accessibilityHandler.getValueInterface() != nullptr && accessibilityHandler.getValueInterface()->getRange().isValid()) @@ -187,7 +187,7 @@ JUCE_COMRESULT AccessibilityNativeHandle::GetPatternProvider (PATTERNID pId, IUn break; } - case UIA_TogglePatternId: + case ComTypes::UIA_TogglePatternId: { if (accessibilityHandler.getCurrentState().isCheckable() && (accessibilityHandler.getActions().contains (AccessibilityActionType::toggle) @@ -198,7 +198,7 @@ JUCE_COMRESULT AccessibilityNativeHandle::GetPatternProvider (PATTERNID pId, IUn break; } - case UIA_SelectionPatternId: + case ComTypes::UIA_SelectionPatternId: { if (role == AccessibilityRole::list || role == AccessibilityRole::popupMenu @@ -209,7 +209,7 @@ JUCE_COMRESULT AccessibilityNativeHandle::GetPatternProvider (PATTERNID pId, IUn break; } - case UIA_SelectionItemPatternId: + case ComTypes::UIA_SelectionItemPatternId: { auto state = accessibilityHandler.getCurrentState(); @@ -221,28 +221,28 @@ JUCE_COMRESULT AccessibilityNativeHandle::GetPatternProvider (PATTERNID pId, IUn break; } - case UIA_GridPatternId: + case ComTypes::UIA_GridPatternId: { if (accessibilityHandler.getTableInterface() != nullptr) return new UIAGridProvider (this); break; } - case UIA_GridItemPatternId: + case ComTypes::UIA_GridItemPatternId: { if (accessibilityHandler.getCellInterface() != nullptr) return new UIAGridItemProvider (this); break; } - case UIA_InvokePatternId: + case ComTypes::UIA_InvokePatternId: { if (accessibilityHandler.getActions().contains (AccessibilityActionType::press)) return new UIAInvokeProvider (this); break; } - case UIA_ExpandCollapsePatternId: + case ComTypes::UIA_ExpandCollapsePatternId: { if (accessibilityHandler.getActions().contains (AccessibilityActionType::showMenu) && accessibilityHandler.getCurrentState().isExpandable()) @@ -313,7 +313,7 @@ JUCE_COMRESULT AccessibilityNativeHandle::GetPropertyValue (PROPERTYID propertyI VariantHelpers::setBool (textInterface->isDisplayingProtectedText(), pRetVal); break; - case UIA_IsPeripheralPropertyId: + case ComTypes::UIA_IsPeripheralPropertyId: VariantHelpers::setBool (role == AccessibilityRole::tooltip || role == AccessibilityRole::popupMenu || role == AccessibilityRole::splashScreen, @@ -339,27 +339,27 @@ JUCE_COMRESULT AccessibilityNativeHandle::GetPropertyValue (PROPERTYID propertyI } //============================================================================== -JUCE_COMRESULT AccessibilityNativeHandle::Navigate (NavigateDirection direction, IRawElementProviderFragment** pRetVal) +JUCE_COMRESULT AccessibilityNativeHandle::Navigate (ComTypes::NavigateDirection direction, ComTypes::IRawElementProviderFragment** pRetVal) { return withCheckedComArgs (pRetVal, *this, [&] { auto* handler = [&]() -> AccessibilityHandler* { - if (direction == NavigateDirection_Parent) + if (direction == ComTypes::NavigateDirection_Parent) return accessibilityHandler.getParent(); - if (direction == NavigateDirection_FirstChild - || direction == NavigateDirection_LastChild) + if (direction == ComTypes::NavigateDirection_FirstChild + || direction == ComTypes::NavigateDirection_LastChild) { auto children = accessibilityHandler.getChildren(); return children.empty() ? nullptr - : (direction == NavigateDirection_FirstChild ? children.front() - : children.back()); + : (direction == ComTypes::NavigateDirection_FirstChild ? children.front() + : children.back()); } - if (direction == NavigateDirection_NextSibling - || direction == NavigateDirection_PreviousSibling) + if (direction == ComTypes::NavigateDirection_NextSibling + || direction == ComTypes::NavigateDirection_PreviousSibling) { if (auto* parent = accessibilityHandler.getParent()) { @@ -369,10 +369,10 @@ JUCE_COMRESULT AccessibilityNativeHandle::Navigate (NavigateDirection direction, if (iter == siblings.end()) return nullptr; - if (direction == NavigateDirection_NextSibling && iter != std::prev (siblings.cend())) + if (direction == ComTypes::NavigateDirection_NextSibling && iter != std::prev (siblings.cend())) return *std::next (iter); - if (direction == NavigateDirection_PreviousSibling && iter != siblings.cbegin()) + if (direction == ComTypes::NavigateDirection_PreviousSibling && iter != siblings.cbegin()) return *std::prev (iter); } } @@ -413,7 +413,7 @@ JUCE_COMRESULT AccessibilityNativeHandle::GetRuntimeId (SAFEARRAY** pRetVal) }); } -JUCE_COMRESULT AccessibilityNativeHandle::get_BoundingRectangle (UiaRect* pRetVal) +JUCE_COMRESULT AccessibilityNativeHandle::get_BoundingRectangle (ComTypes::UiaRect* pRetVal) { return withCheckedComArgs (pRetVal, *this, [&] { @@ -452,7 +452,7 @@ JUCE_COMRESULT AccessibilityNativeHandle::SetFocus() return S_OK; } -JUCE_COMRESULT AccessibilityNativeHandle::get_FragmentRoot (IRawElementProviderFragmentRoot** pRetVal) +JUCE_COMRESULT AccessibilityNativeHandle::get_FragmentRoot (ComTypes::IRawElementProviderFragmentRoot** pRetVal) { return withCheckedComArgs (pRetVal, *this, [&]() -> HRESULT { @@ -478,7 +478,7 @@ JUCE_COMRESULT AccessibilityNativeHandle::get_FragmentRoot (IRawElementProviderF } //============================================================================== -JUCE_COMRESULT AccessibilityNativeHandle::ElementProviderFromPoint (double x, double y, IRawElementProviderFragment** pRetVal) +JUCE_COMRESULT AccessibilityNativeHandle::ElementProviderFromPoint (double x, double y, ComTypes::IRawElementProviderFragment** pRetVal) { return withCheckedComArgs (pRetVal, *this, [&] { @@ -500,7 +500,7 @@ JUCE_COMRESULT AccessibilityNativeHandle::ElementProviderFromPoint (double x, do }); } -JUCE_COMRESULT AccessibilityNativeHandle::GetFocus (IRawElementProviderFragment** pRetVal) +JUCE_COMRESULT AccessibilityNativeHandle::GetFocus (ComTypes::IRawElementProviderFragment** pRetVal) { return withCheckedComArgs (pRetVal, *this, [&] { diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h b/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h index ffd4ccff64..83d8587635 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h @@ -30,8 +30,8 @@ namespace juce #define UIA_IsDialogPropertyId 30174 class AccessibilityNativeHandle : public ComBaseClassHelper + ComTypes::IRawElementProviderFragment, + ComTypes::IRawElementProviderFragmentRoot> { public: explicit AccessibilityNativeHandle (AccessibilityHandler& handler); @@ -51,15 +51,15 @@ public: JUCE_COMRESULT GetPatternProvider (PATTERNID pId, IUnknown** provider) override; JUCE_COMRESULT GetPropertyValue (PROPERTYID propertyId, VARIANT* pRetVal) override; - JUCE_COMRESULT Navigate (NavigateDirection direction, IRawElementProviderFragment** pRetVal) override; + JUCE_COMRESULT Navigate (ComTypes::NavigateDirection direction, ComTypes::IRawElementProviderFragment** pRetVal) override; JUCE_COMRESULT GetRuntimeId (SAFEARRAY** pRetVal) override; - JUCE_COMRESULT get_BoundingRectangle (UiaRect* pRetVal) override; + JUCE_COMRESULT get_BoundingRectangle (ComTypes::UiaRect* pRetVal) override; JUCE_COMRESULT GetEmbeddedFragmentRoots (SAFEARRAY** pRetVal) override; JUCE_COMRESULT SetFocus() override; - JUCE_COMRESULT get_FragmentRoot (IRawElementProviderFragmentRoot** pRetVal) override; + JUCE_COMRESULT get_FragmentRoot (ComTypes::IRawElementProviderFragmentRoot** pRetVal) override; - JUCE_COMRESULT ElementProviderFromPoint (double x, double y, IRawElementProviderFragment** pRetVal) override; - JUCE_COMRESULT GetFocus (IRawElementProviderFragment** pRetVal) override; + JUCE_COMRESULT ElementProviderFromPoint (double x, double y, ComTypes::IRawElementProviderFragment** pRetVal) override; + JUCE_COMRESULT GetFocus (ComTypes::IRawElementProviderFragment** pRetVal) override; private: //============================================================================== diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h b/modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h new file mode 100644 index 0000000000..6af77ae0d4 --- /dev/null +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h @@ -0,0 +1,371 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2020 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 6 End-User License + Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + + End User License Agreement: www.juce.com/juce-6-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ +namespace ComTypes +{ + +/* + These interfaces would normally be included in the system platform headers. + However, those headers are likely to be incomplete when building with + MinGW. In order to allow building accessible applications under MinGW, + we reproduce all necessary definitions here. +*/ + +struct UiaPoint +{ + double x; + double y; +}; + +struct UiaRect +{ + double left; + double top; + double width; + double height; +}; + +enum NavigateDirection +{ + NavigateDirection_Parent = 0, + NavigateDirection_NextSibling = 1, + NavigateDirection_PreviousSibling = 2, + NavigateDirection_FirstChild = 3, + NavigateDirection_LastChild = 4 +}; + +enum ExpandCollapseState +{ + ExpandCollapseState_Collapsed = 0, + ExpandCollapseState_Expanded = 1, + ExpandCollapseState_PartiallyExpanded = 2, + ExpandCollapseState_LeafNode = 3 +}; + +enum TextPatternRangeEndpoint +{ + TextPatternRangeEndpoint_Start = 0, + TextPatternRangeEndpoint_End = 1 +}; + +enum TextUnit +{ + TextUnit_Character = 0, + TextUnit_Format = 1, + TextUnit_Word = 2, + TextUnit_Line = 3, + TextUnit_Paragraph = 4, + TextUnit_Page = 5, + TextUnit_Document = 6 +}; + +enum SupportedTextSelection +{ + SupportedTextSelection_None = 0, + SupportedTextSelection_Single = 1, + SupportedTextSelection_Multiple = 2 +}; + +enum CaretPosition +{ + CaretPosition_Unknown = 0, + CaretPosition_EndOfLine = 1, + CaretPosition_BeginningOfLine = 2 +}; + +enum ToggleState +{ + ToggleState_Off = 0, + ToggleState_On = 1, + ToggleState_Indeterminate = 2 +}; + +enum WindowVisualState +{ + WindowVisualState_Normal = 0, + WindowVisualState_Maximized = 1, + WindowVisualState_Minimized = 2 +}; + +enum WindowInteractionState +{ + WindowInteractionState_Running = 0, + WindowInteractionState_Closing = 1, + WindowInteractionState_ReadyForUserInteraction = 2, + WindowInteractionState_BlockedByModalWindow = 3, + WindowInteractionState_NotResponding = 4 +}; + +const long UIA_InvokePatternId = 10000; +const long UIA_SelectionPatternId = 10001; +const long UIA_ValuePatternId = 10002; +const long UIA_RangeValuePatternId = 10003; +const long UIA_ExpandCollapsePatternId = 10005; +const long UIA_GridPatternId = 10006; +const long UIA_GridItemPatternId = 10007; +const long UIA_WindowPatternId = 10009; +const long UIA_SelectionItemPatternId = 10010; +const long UIA_TextPatternId = 10014; +const long UIA_TogglePatternId = 10015; +const long UIA_TransformPatternId = 10016; +const long UIA_TextPattern2Id = 10024; +const long UIA_StructureChangedEventId = 20002; +const long UIA_MenuOpenedEventId = 20003; +const long UIA_AutomationFocusChangedEventId = 20005; +const long UIA_MenuClosedEventId = 20007; +const long UIA_LayoutInvalidatedEventId = 20008; +const long UIA_Invoke_InvokedEventId = 20009; +const long UIA_SelectionItem_ElementSelectedEventId = 20012; +const long UIA_Text_TextSelectionChangedEventId = 20014; +const long UIA_Text_TextChangedEventId = 20015; +const long UIA_Window_WindowOpenedEventId = 20016; +const long UIA_Window_WindowClosedEventId = 20017; +const long UIA_IsPeripheralPropertyId = 30150; +const long UIA_IsReadOnlyAttributeId = 40015; +const long UIA_CaretPositionAttributeId = 40038; +const long UIA_ButtonControlTypeId = 50000; +const long UIA_CheckBoxControlTypeId = 50002; +const long UIA_ComboBoxControlTypeId = 50003; +const long UIA_EditControlTypeId = 50004; +const long UIA_HyperlinkControlTypeId = 50005; +const long UIA_ImageControlTypeId = 50006; +const long UIA_ListItemControlTypeId = 50007; +const long UIA_ListControlTypeId = 50008; +const long UIA_MenuBarControlTypeId = 50010; +const long UIA_MenuItemControlTypeId = 50011; +const long UIA_ProgressBarControlTypeId = 50012; +const long UIA_RadioButtonControlTypeId = 50013; +const long UIA_ScrollBarControlTypeId = 50014; +const long UIA_SliderControlTypeId = 50015; +const long UIA_TextControlTypeId = 50020; +const long UIA_ToolTipControlTypeId = 50022; +const long UIA_TreeControlTypeId = 50023; +const long UIA_TreeItemControlTypeId = 50024; +const long UIA_CustomControlTypeId = 50025; +const long UIA_GroupControlTypeId = 50026; +const long UIA_DataItemControlTypeId = 50029; +const long UIA_WindowControlTypeId = 50032; +const long UIA_HeaderControlTypeId = 50034; +const long UIA_HeaderItemControlTypeId = 50035; +const long UIA_TableControlTypeId = 50036; + +interface IRawElementProviderFragmentRoot; +interface IRawElementProviderFragment; + +JUCE_COMCLASS (IRawElementProviderFragmentRoot, "620ce2a5-ab8f-40a9-86cb-de3c75599b58") : public IUnknown +{ +public: + JUCE_COMCALL ElementProviderFromPoint (double x, double y, __RPC__deref_out_opt IRawElementProviderFragment** pRetVal) = 0; + JUCE_COMCALL GetFocus (__RPC__deref_out_opt IRawElementProviderFragment * *pRetVal) = 0; +}; + +JUCE_COMCLASS (IRawElementProviderFragment, "f7063da8-8359-439c-9297-bbc5299a7d87") : public IUnknown +{ +public: + JUCE_COMCALL Navigate (NavigateDirection direction, __RPC__deref_out_opt IRawElementProviderFragment** pRetVal) = 0; + JUCE_COMCALL GetRuntimeId (__RPC__deref_out_opt SAFEARRAY * *pRetVal) = 0; + JUCE_COMCALL get_BoundingRectangle (__RPC__out UiaRect * pRetVal) = 0; + JUCE_COMCALL GetEmbeddedFragmentRoots (__RPC__deref_out_opt SAFEARRAY * *pRetVal) = 0; + JUCE_COMCALL SetFocus() = 0; + JUCE_COMCALL get_FragmentRoot (__RPC__deref_out_opt IRawElementProviderFragmentRoot * *pRetVal) = 0; +}; + +JUCE_COMCLASS (IExpandCollapseProvider, "d847d3a5-cab0-4a98-8c32-ecb45c59ad24") : public IUnknown +{ +public: + JUCE_COMCALL Expand() = 0; + JUCE_COMCALL Collapse() = 0; + JUCE_COMCALL get_ExpandCollapseState (__RPC__out ExpandCollapseState * pRetVal) = 0; +}; + +JUCE_COMCLASS (IGridItemProvider, "d02541f1-fb81-4d64-ae32-f520f8a6dbd1") : public IUnknown +{ +public: + JUCE_COMCALL get_Row (__RPC__out int* pRetVal) = 0; + JUCE_COMCALL get_Column (__RPC__out int* pRetVal) = 0; + JUCE_COMCALL get_RowSpan (__RPC__out int* pRetVal) = 0; + JUCE_COMCALL get_ColumnSpan (__RPC__out int* pRetVal) = 0; + JUCE_COMCALL get_ContainingGrid (__RPC__deref_out_opt IRawElementProviderSimple * *pRetVal) = 0; +}; + +JUCE_COMCLASS (IGridProvider, "b17d6187-0907-464b-a168-0ef17a1572b1") : public IUnknown +{ +public: + JUCE_COMCALL GetItem (int row, int column, __RPC__deref_out_opt IRawElementProviderSimple** pRetVal) = 0; + JUCE_COMCALL get_RowCount (__RPC__out int* pRetVal) = 0; + JUCE_COMCALL get_ColumnCount (__RPC__out int* pRetVal) = 0; +}; + +JUCE_COMCLASS (IInvokeProvider, "54fcb24b-e18e-47a2-b4d3-eccbe77599a2") : public IUnknown +{ +public: + JUCE_COMCALL Invoke() = 0; +}; + +JUCE_COMCLASS (IRangeValueProvider, "36dc7aef-33e6-4691-afe1-2be7274b3d33") : public IUnknown +{ +public: + JUCE_COMCALL SetValue (double val) = 0; + JUCE_COMCALL get_Value (__RPC__out double* pRetVal) = 0; + JUCE_COMCALL get_IsReadOnly (__RPC__out BOOL * pRetVal) = 0; + JUCE_COMCALL get_Maximum (__RPC__out double* pRetVal) = 0; + JUCE_COMCALL get_Minimum (__RPC__out double* pRetVal) = 0; + JUCE_COMCALL get_LargeChange (__RPC__out double* pRetVal) = 0; + JUCE_COMCALL get_SmallChange (__RPC__out double* pRetVal) = 0; +}; + +JUCE_COMCLASS (ISelectionProvider, "fb8b03af-3bdf-48d4-bd36-1a65793be168") : public IUnknown +{ +public: + JUCE_COMCALL GetSelection (__RPC__deref_out_opt SAFEARRAY * *pRetVal) = 0; + JUCE_COMCALL get_CanSelectMultiple (__RPC__out BOOL * pRetVal) = 0; + JUCE_COMCALL get_IsSelectionRequired (__RPC__out BOOL * pRetVal) = 0; +}; + +JUCE_COMCLASS (ISelectionProvider2, "14f68475-ee1c-44f6-a869-d239381f0fe7") : public ISelectionProvider +{ + JUCE_COMCALL get_FirstSelectedItem (IRawElementProviderSimple * *retVal) = 0; + JUCE_COMCALL get_LastSelectedItem (IRawElementProviderSimple * *retVal) = 0; + JUCE_COMCALL get_CurrentSelectedItem (IRawElementProviderSimple * *retVal) = 0; + JUCE_COMCALL get_ItemCount (int* retVal) = 0; +}; + +JUCE_COMCLASS (ISelectionItemProvider, "2acad808-b2d4-452d-a407-91ff1ad167b2") : public IUnknown +{ +public: + JUCE_COMCALL Select() = 0; + JUCE_COMCALL AddToSelection() = 0; + JUCE_COMCALL RemoveFromSelection() = 0; + JUCE_COMCALL get_IsSelected (__RPC__out BOOL * pRetVal) = 0; + JUCE_COMCALL get_SelectionContainer (__RPC__deref_out_opt IRawElementProviderSimple * *pRetVal) = 0; +}; + +JUCE_COMCLASS (ITextRangeProvider, "5347ad7b-c355-46f8-aff5-909033582f63") : public IUnknown +{ +public: + JUCE_COMCALL Clone (__RPC__deref_out_opt ITextRangeProvider * *pRetVal) = 0; + JUCE_COMCALL Compare (__RPC__in_opt ITextRangeProvider * range, __RPC__out BOOL * pRetVal) = 0; + JUCE_COMCALL CompareEndpoints (TextPatternRangeEndpoint endpoint, __RPC__in_opt ITextRangeProvider * targetRange, TextPatternRangeEndpoint targetEndpoint, __RPC__out int* pRetVal) = 0; + JUCE_COMCALL ExpandToEnclosingUnit (TextUnit unit) = 0; + JUCE_COMCALL FindAttribute (TEXTATTRIBUTEID attributeId, VARIANT val, BOOL backward, __RPC__deref_out_opt ITextRangeProvider * *pRetVal) = 0; + JUCE_COMCALL FindText (__RPC__in BSTR text, BOOL backward, BOOL ignoreCase, __RPC__deref_out_opt ITextRangeProvider * *pRetVal) = 0; + JUCE_COMCALL GetAttributeValue (TEXTATTRIBUTEID attributeId, __RPC__out VARIANT * pRetVal) = 0; + JUCE_COMCALL GetBoundingRectangles (__RPC__deref_out_opt SAFEARRAY * *pRetVal) = 0; + JUCE_COMCALL GetEnclosingElement (__RPC__deref_out_opt IRawElementProviderSimple * *pRetVal) = 0; + JUCE_COMCALL GetText (int maxLength, __RPC__deref_out_opt BSTR* pRetVal) = 0; + JUCE_COMCALL Move (TextUnit unit, int count, __RPC__out int* pRetVal) = 0; + JUCE_COMCALL MoveEndpointByUnit (TextPatternRangeEndpoint endpoint, TextUnit unit, int count, __RPC__out int* pRetVal) = 0; + JUCE_COMCALL MoveEndpointByRange (TextPatternRangeEndpoint endpoint, __RPC__in_opt ITextRangeProvider * targetRange, TextPatternRangeEndpoint targetEndpoint) = 0; + JUCE_COMCALL Select() = 0; + JUCE_COMCALL AddToSelection() = 0; + JUCE_COMCALL RemoveFromSelection() = 0; + JUCE_COMCALL ScrollIntoView (BOOL alignToTop) = 0; + JUCE_COMCALL GetChildren (__RPC__deref_out_opt SAFEARRAY * *pRetVal) = 0; +}; + +JUCE_COMCLASS (ITextProvider, "3589c92c-63f3-4367-99bb-ada653b77cf2") : public IUnknown +{ +public: + JUCE_COMCALL GetSelection (__RPC__deref_out_opt SAFEARRAY * *pRetVal) = 0; + JUCE_COMCALL GetVisibleRanges (__RPC__deref_out_opt SAFEARRAY * *pRetVal) = 0; + JUCE_COMCALL RangeFromChild (__RPC__in_opt IRawElementProviderSimple * childElement, __RPC__deref_out_opt ITextRangeProvider * *pRetVal) = 0; + JUCE_COMCALL RangeFromPoint (UiaPoint point, __RPC__deref_out_opt ITextRangeProvider * *pRetVal) = 0; + JUCE_COMCALL get_DocumentRange (__RPC__deref_out_opt ITextRangeProvider * *pRetVal) = 0; + JUCE_COMCALL get_SupportedTextSelection (__RPC__out SupportedTextSelection * pRetVal) = 0; +}; + +JUCE_COMCLASS (ITextProvider2, "0dc5e6ed-3e16-4bf1-8f9a-a979878bc195") : public ITextProvider +{ +public: + JUCE_COMCALL RangeFromAnnotation (__RPC__in_opt IRawElementProviderSimple * annotationElement, __RPC__deref_out_opt ITextRangeProvider * *pRetVal) = 0; + JUCE_COMCALL GetCaretRange (__RPC__out BOOL * isActive, __RPC__deref_out_opt ITextRangeProvider * *pRetVal) = 0; +}; + +JUCE_COMCLASS (IToggleProvider, "56d00bd0-c4f4-433c-a836-1a52a57e0892") : public IUnknown +{ +public: + JUCE_COMCALL Toggle() = 0; + JUCE_COMCALL get_ToggleState (__RPC__out ToggleState * pRetVal) = 0; +}; + +JUCE_COMCLASS (ITransformProvider, "6829ddc4-4f91-4ffa-b86f-bd3e2987cb4c") : public IUnknown +{ +public: + JUCE_COMCALL Move (double x, double y) = 0; + JUCE_COMCALL Resize (double width, double height) = 0; + JUCE_COMCALL Rotate (double degrees) = 0; + JUCE_COMCALL get_CanMove (__RPC__out BOOL * pRetVal) = 0; + JUCE_COMCALL get_CanResize (__RPC__out BOOL * pRetVal) = 0; + JUCE_COMCALL get_CanRotate (__RPC__out BOOL * pRetVal) = 0; +}; + +JUCE_COMCLASS (IValueProvider, "c7935180-6fb3-4201-b174-7df73adbf64a") : public IUnknown +{ +public: + JUCE_COMCALL SetValue (__RPC__in LPCWSTR val) = 0; + JUCE_COMCALL get_Value (__RPC__deref_out_opt BSTR * pRetVal) = 0; + JUCE_COMCALL get_IsReadOnly (__RPC__out BOOL * pRetVal) = 0; +}; + +JUCE_COMCLASS (IWindowProvider, "987df77b-db06-4d77-8f8a-86a9c3bb90b9") : public IUnknown +{ +public: + JUCE_COMCALL SetVisualState (WindowVisualState state) = 0; + JUCE_COMCALL Close() = 0; + JUCE_COMCALL WaitForInputIdle (int milliseconds, __RPC__out BOOL* pRetVal) = 0; + JUCE_COMCALL get_CanMaximize (__RPC__out BOOL * pRetVal) = 0; + JUCE_COMCALL get_CanMinimize (__RPC__out BOOL * pRetVal) = 0; + JUCE_COMCALL get_IsModal (__RPC__out BOOL * pRetVal) = 0; + JUCE_COMCALL get_WindowVisualState (__RPC__out WindowVisualState * pRetVal) = 0; + JUCE_COMCALL get_WindowInteractionState (__RPC__out WindowInteractionState * pRetVal) = 0; + JUCE_COMCALL get_IsTopmost (__RPC__out BOOL * pRetVal) = 0; +}; + +constexpr CLSID CLSID_SpVoice { 0x96749377, 0x3391, 0x11D2, { 0x9E, 0xE3, 0x00, 0xC0, 0x4F, 0x79, 0x73, 0x96 } }; + +} // namespace ComTypes +} // namespace juce + +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL (juce::ComTypes::IRawElementProviderFragmentRoot, 0x620ce2a5, 0xab8f, 0x40a9, 0x86, 0xcb, 0xde, 0x3c, 0x75, 0x59, 0x9b, 0x58) +__CRT_UUID_DECL (juce::ComTypes::IRawElementProviderFragment, 0xf7063da8, 0x8359, 0x439c, 0x92, 0x97, 0xbb, 0xc5, 0x29, 0x9a, 0x7d, 0x87) +__CRT_UUID_DECL (juce::ComTypes::IExpandCollapseProvider, 0xd847d3a5, 0xcab0, 0x4a98, 0x8c, 0x32, 0xec, 0xb4, 0x5c, 0x59, 0xad, 0x24) +__CRT_UUID_DECL (juce::ComTypes::IGridItemProvider, 0xd02541f1, 0xfb81, 0x4d64, 0xae, 0x32, 0xf5, 0x20, 0xf8, 0xa6, 0xdb, 0xd1) +__CRT_UUID_DECL (juce::ComTypes::IGridProvider, 0xb17d6187, 0x0907, 0x464b, 0xa1, 0x68, 0x0e, 0xf1, 0x7a, 0x15, 0x72, 0xb1) +__CRT_UUID_DECL (juce::ComTypes::IInvokeProvider, 0x54fcb24b, 0xe18e, 0x47a2, 0xb4, 0xd3, 0xec, 0xcb, 0xe7, 0x75, 0x99, 0xa2) +__CRT_UUID_DECL (juce::ComTypes::IRangeValueProvider, 0x36dc7aef, 0x33e6, 0x4691, 0xaf, 0xe1, 0x2b, 0xe7, 0x27, 0x4b, 0x3d, 0x33) +__CRT_UUID_DECL (juce::ComTypes::ISelectionProvider, 0xfb8b03af, 0x3bdf, 0x48d4, 0xbd, 0x36, 0x1a, 0x65, 0x79, 0x3b, 0xe1, 0x68) +__CRT_UUID_DECL (juce::ComTypes::ISelectionProvider2, 0x14f68475, 0xee1c, 0x44f6, 0xa8, 0x69, 0xd2, 0x39, 0x38, 0x1f, 0x0f, 0xe7) +__CRT_UUID_DECL (juce::ComTypes::ISelectionItemProvider, 0x2acad808, 0xb2d4, 0x452d, 0xa4, 0x07, 0x91, 0xff, 0x1a, 0xd1, 0x67, 0xb2) +__CRT_UUID_DECL (juce::ComTypes::ITextRangeProvider, 0x5347ad7b, 0xc355, 0x46f8, 0xaf, 0xf5, 0x90, 0x90, 0x33, 0x58, 0x2f, 0x63) +__CRT_UUID_DECL (juce::ComTypes::ITextProvider, 0x3589c92c, 0x63f3, 0x4367, 0x99, 0xbb, 0xad, 0xa6, 0x53, 0xb7, 0x7c, 0xf2) +__CRT_UUID_DECL (juce::ComTypes::ITextProvider2, 0x0dc5e6ed, 0x3e16, 0x4bf1, 0x8f, 0x9a, 0xa9, 0x79, 0x87, 0x8b, 0xc1, 0x95) +__CRT_UUID_DECL (juce::ComTypes::IToggleProvider, 0x56d00bd0, 0xc4f4, 0x433c, 0xa8, 0x36, 0x1a, 0x52, 0xa5, 0x7e, 0x08, 0x92) +__CRT_UUID_DECL (juce::ComTypes::ITransformProvider, 0x6829ddc4, 0x4f91, 0x4ffa, 0xb8, 0x6f, 0xbd, 0x3e, 0x29, 0x87, 0xcb, 0x4c) +__CRT_UUID_DECL (juce::ComTypes::IValueProvider, 0xc7935180, 0x6fb3, 0x4201, 0xb1, 0x74, 0x7d, 0xf7, 0x3a, 0xdb, 0xf6, 0x4a) +__CRT_UUID_DECL (juce::ComTypes::IWindowProvider, 0x987df77b, 0xdb06, 0x4d77, 0x8f, 0x8a, 0x86, 0xa9, 0xc3, 0xbb, 0x90, 0xb9) +#endif diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h index 4fc220e38c..86613cc294 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h @@ -28,13 +28,10 @@ namespace juce //============================================================================== class UIAExpandCollapseProvider : public UIAProviderBase, - public ComBaseClassHelper + public ComBaseClassHelper { public: - explicit UIAExpandCollapseProvider (AccessibilityNativeHandle* nativeHandle) - : UIAProviderBase (nativeHandle) - { - } + using UIAProviderBase::UIAProviderBase; //============================================================================== JUCE_COMRESULT Expand() override @@ -47,13 +44,13 @@ public: return invokeShowMenu(); } - JUCE_COMRESULT get_ExpandCollapseState (ExpandCollapseState* pRetVal) override + JUCE_COMRESULT get_ExpandCollapseState (ComTypes::ExpandCollapseState* pRetVal) override { return withCheckedComArgs (pRetVal, *this, [&] { *pRetVal = getHandler().getCurrentState().isExpanded() - ? ExpandCollapseState_Expanded - : ExpandCollapseState_Collapsed; + ? ComTypes::ExpandCollapseState_Expanded + : ComTypes::ExpandCollapseState_Collapsed; return S_OK; }); @@ -70,8 +67,8 @@ private: if (handler.getActions().invoke (AccessibilityActionType::showMenu)) { sendAccessibilityAutomationEvent (handler, handler.getCurrentState().isExpanded() - ? UIA_MenuOpenedEventId - : UIA_MenuClosedEventId); + ? ComTypes::UIA_MenuOpenedEventId + : ComTypes::UIA_MenuClosedEventId); return S_OK; } diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h index ec7f6e2272..c63f4d9e0c 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h @@ -28,13 +28,10 @@ namespace juce //============================================================================== class UIAGridItemProvider : public UIAProviderBase, - public ComBaseClassHelper + public ComBaseClassHelper { public: - explicit UIAGridItemProvider (AccessibilityNativeHandle* nativeHandle) - : UIAProviderBase (nativeHandle) - { - } + using UIAProviderBase::UIAProviderBase; //============================================================================== JUCE_COMRESULT get_Row (int* pRetVal) override diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h index 5b4670b0a2..cc10e6f8c8 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h @@ -28,13 +28,10 @@ namespace juce //============================================================================== class UIAGridProvider : public UIAProviderBase, - public ComBaseClassHelper + public ComBaseClassHelper { public: - explicit UIAGridProvider (AccessibilityNativeHandle* nativeHandle) - : UIAProviderBase (nativeHandle) - { - } + using UIAProviderBase::UIAProviderBase; //============================================================================== JUCE_COMRESULT GetItem (int row, int column, IRawElementProviderSimple** pRetVal) override diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h index ea01f25f55..fcdf2a213d 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h @@ -28,13 +28,10 @@ namespace juce //============================================================================== class UIAInvokeProvider : public UIAProviderBase, - public ComBaseClassHelper + public ComBaseClassHelper { public: - explicit UIAInvokeProvider (AccessibilityNativeHandle* nativeHandle) - : UIAProviderBase (nativeHandle) - { - } + using UIAProviderBase::UIAProviderBase; //============================================================================== JUCE_COMRESULT Invoke() override @@ -47,7 +44,7 @@ public: if (handler.getActions().invoke (AccessibilityActionType::press)) { if (isElementValid()) - sendAccessibilityAutomationEvent (handler, UIA_Invoke_InvokedEventId); + sendAccessibilityAutomationEvent (handler, ComTypes::UIA_Invoke_InvokedEventId); return S_OK; } diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h index be9ed67858..4636048f63 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h @@ -28,13 +28,10 @@ namespace juce //============================================================================== class UIARangeValueProvider : public UIAProviderBase, - public ComBaseClassHelper + public ComBaseClassHelper { public: - explicit UIARangeValueProvider (AccessibilityNativeHandle* nativeHandle) - : UIAProviderBase (nativeHandle) - { - } + using UIAProviderBase::UIAProviderBase; //============================================================================== JUCE_COMRESULT SetValue (double val) override diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h index 0a0d6def16..3cc1f86db5 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h @@ -28,21 +28,13 @@ namespace juce JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token") -JUCE_COMCLASS (ISelectionProvider2, "14f68475-ee1c-44f6-a869-d239381f0fe7") : public ISelectionProvider -{ - JUCE_COMCALL get_FirstSelectedItem (IRawElementProviderSimple** retVal) = 0; - JUCE_COMCALL get_LastSelectedItem (IRawElementProviderSimple** retVal) = 0; - JUCE_COMCALL get_CurrentSelectedItem (IRawElementProviderSimple** retVal) = 0; - JUCE_COMCALL get_ItemCount (int* retVal) = 0; -}; - //============================================================================== class UIASelectionItemProvider : public UIAProviderBase, - public ComBaseClassHelper + public ComBaseClassHelper { public: - explicit UIASelectionItemProvider (AccessibilityNativeHandle* nativeHandle) - : UIAProviderBase (nativeHandle), + explicit UIASelectionItemProvider (AccessibilityNativeHandle* handle) + : UIAProviderBase (handle), isRadioButton (getHandler().getRole() == AccessibilityRole::radioButton) { } @@ -58,7 +50,7 @@ public: if (isRadioButton) { handler.getActions().invoke (AccessibilityActionType::press); - sendAccessibilityAutomationEvent (handler, UIA_SelectionItem_ElementSelectedEventId); + sendAccessibilityAutomationEvent (handler, ComTypes::UIA_SelectionItem_ElementSelectedEventId); return S_OK; } @@ -136,22 +128,19 @@ private: //============================================================================== class UIASelectionProvider : public UIAProviderBase, - public ComBaseClassHelper + public ComBaseClassHelper { public: - explicit UIASelectionProvider (AccessibilityNativeHandle* nativeHandle) - : UIAProviderBase (nativeHandle) - { - } + using UIAProviderBase::UIAProviderBase; //============================================================================== JUCE_COMRESULT QueryInterface (REFIID iid, void** result) override { - if (iid == _uuidof (IUnknown) || iid == _uuidof (ISelectionProvider)) - return castToType (result); + if (iid == __uuidof (IUnknown) || iid == __uuidof (ComTypes::ISelectionProvider)) + return castToType (result); - if (iid == _uuidof (ISelectionProvider2)) - return castToType (result); + if (iid == __uuidof (ComTypes::ISelectionProvider2)) + return castToType (result); *result = nullptr; return E_NOINTERFACE; diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h index 8b301401df..9111e3064b 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h @@ -28,24 +28,21 @@ namespace juce //============================================================================== class UIATextProvider : public UIAProviderBase, - public ComBaseClassHelper + public ComBaseClassHelper { public: - explicit UIATextProvider (AccessibilityNativeHandle* nativeHandle) - : UIAProviderBase (nativeHandle) - { - } + using UIAProviderBase::UIAProviderBase; //============================================================================== JUCE_COMRESULT QueryInterface (REFIID iid, void** result) override { JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token") - if (iid == _uuidof (IUnknown) || iid == _uuidof (ITextProvider)) - return castToType (result); + if (iid == __uuidof (IUnknown) || iid == __uuidof (ComTypes::ITextProvider)) + return castToType (result); - if (iid == _uuidof (ITextProvider2)) - return castToType (result); + if (iid == __uuidof (ComTypes::ITextProvider2)) + return castToType (result); *result = nullptr; return E_NOINTERFACE; @@ -54,7 +51,7 @@ public: } //============================================================================= - JUCE_COMRESULT get_DocumentRange (ITextRangeProvider** pRetVal) override + JUCE_COMRESULT get_DocumentRange (ComTypes::ITextRangeProvider** pRetVal) override { return withTextInterface (pRetVal, [&] (const AccessibilityTextInterface& textInterface) { @@ -63,11 +60,11 @@ public: }); } - JUCE_COMRESULT get_SupportedTextSelection (SupportedTextSelection* pRetVal) override + JUCE_COMRESULT get_SupportedTextSelection (ComTypes::SupportedTextSelection* pRetVal) override { return withCheckedComArgs (pRetVal, *this, [&] { - *pRetVal = SupportedTextSelection_Single; + *pRetVal = ComTypes::SupportedTextSelection_Single; return S_OK; }); } @@ -124,7 +121,7 @@ public: }); } - JUCE_COMRESULT RangeFromChild (IRawElementProviderSimple*, ITextRangeProvider** pRetVal) override + JUCE_COMRESULT RangeFromChild (IRawElementProviderSimple*, ComTypes::ITextRangeProvider** pRetVal) override { return withCheckedComArgs (pRetVal, *this, [] { @@ -132,7 +129,7 @@ public: }); } - JUCE_COMRESULT RangeFromPoint (UiaPoint point, ITextRangeProvider** pRetVal) override + JUCE_COMRESULT RangeFromPoint (ComTypes::UiaPoint point, ComTypes::ITextRangeProvider** pRetVal) override { return withTextInterface (pRetVal, [&] (const AccessibilityTextInterface& textInterface) { @@ -146,7 +143,7 @@ public: } //============================================================================== - JUCE_COMRESULT GetCaretRange (BOOL* isActive, ITextRangeProvider** pRetVal) override + JUCE_COMRESULT GetCaretRange (BOOL* isActive, ComTypes::ITextRangeProvider** pRetVal) override { return withTextInterface (pRetVal, [&] (const AccessibilityTextInterface& textInterface) { @@ -159,7 +156,7 @@ public: }); } - JUCE_COMRESULT RangeFromAnnotation (IRawElementProviderSimple*, ITextRangeProvider** pRetVal) override + JUCE_COMRESULT RangeFromAnnotation (IRawElementProviderSimple*, ComTypes::ITextRangeProvider** pRetVal) override { return withCheckedComArgs (pRetVal, *this, [] { @@ -183,7 +180,7 @@ private: //============================================================================== class UIATextRangeProvider : public UIAProviderBase, - public ComBaseClassHelper + public ComBaseClassHelper { public: UIATextRangeProvider (UIATextProvider& textProvider, Range range) @@ -202,7 +199,7 @@ private: return Select(); } - JUCE_COMRESULT Clone (ITextRangeProvider** pRetVal) override + JUCE_COMRESULT Clone (ComTypes::ITextRangeProvider** pRetVal) override { return withCheckedComArgs (pRetVal, *this, [&] { @@ -211,7 +208,7 @@ private: }); } - JUCE_COMRESULT Compare (ITextRangeProvider* range, BOOL* pRetVal) override + JUCE_COMRESULT Compare (ComTypes::ITextRangeProvider* range, BOOL* pRetVal) override { return withCheckedComArgs (pRetVal, *this, [&] { @@ -220,9 +217,9 @@ private: }); } - JUCE_COMRESULT CompareEndpoints (TextPatternRangeEndpoint endpoint, - ITextRangeProvider* targetRange, - TextPatternRangeEndpoint targetEndpoint, + JUCE_COMRESULT CompareEndpoints (ComTypes::TextPatternRangeEndpoint endpoint, + ComTypes::ITextRangeProvider* targetRange, + ComTypes::TextPatternRangeEndpoint targetEndpoint, int* pRetVal) override { if (targetRange == nullptr) @@ -230,19 +227,19 @@ private: return withCheckedComArgs (pRetVal, *this, [&] { - auto offset = (endpoint == TextPatternRangeEndpoint_Start ? selectionRange.getStart() - : selectionRange.getEnd()); + auto offset = (endpoint == ComTypes::TextPatternRangeEndpoint_Start ? selectionRange.getStart() + : selectionRange.getEnd()); auto otherRange = static_cast (targetRange)->getSelectionRange(); - auto otherOffset = (targetEndpoint == TextPatternRangeEndpoint_Start ? otherRange.getStart() - : otherRange.getEnd()); + auto otherOffset = (targetEndpoint == ComTypes::TextPatternRangeEndpoint_Start ? otherRange.getStart() + : otherRange.getEnd()); *pRetVal = offset - otherOffset; return S_OK; }); } - JUCE_COMRESULT ExpandToEnclosingUnit (TextUnit unit) override + JUCE_COMRESULT ExpandToEnclosingUnit (ComTypes::TextUnit unit) override { if (! isElementValid()) return (HRESULT) UIA_E_ELEMENTNOTAVAILABLE; @@ -269,7 +266,7 @@ private: return (HRESULT) UIA_E_NOTSUPPORTED; } - JUCE_COMRESULT FindAttribute (TEXTATTRIBUTEID, VARIANT, BOOL, ITextRangeProvider** pRetVal) override + JUCE_COMRESULT FindAttribute (TEXTATTRIBUTEID, VARIANT, BOOL, ComTypes::ITextRangeProvider** pRetVal) override { return withCheckedComArgs (pRetVal, *this, [] { @@ -278,7 +275,7 @@ private: } JUCE_COMRESULT FindText (BSTR text, BOOL backward, BOOL ignoreCase, - ITextRangeProvider** pRetVal) override + ComTypes::ITextRangeProvider** pRetVal) override { return owner->withTextInterface (pRetVal, [&] (const AccessibilityTextInterface& textInterface) { @@ -303,25 +300,25 @@ private: switch (attributeId) { - case UIA_IsReadOnlyAttributeId: + case ComTypes::UIA_IsReadOnlyAttributeId: { VariantHelpers::setBool (textInterface.isReadOnly(), pRetVal); break; } - case UIA_CaretPositionAttributeId: + case ComTypes::UIA_CaretPositionAttributeId: { auto cursorPos = textInterface.getTextInsertionOffset(); auto caretPos = [&] { if (cursorPos == 0) - return CaretPosition_BeginningOfLine; + return ComTypes::CaretPosition_BeginningOfLine; if (cursorPos == textInterface.getTotalNumCharacters()) - return CaretPosition_EndOfLine; + return ComTypes::CaretPosition_EndOfLine; - return CaretPosition_Unknown; + return ComTypes::CaretPosition_Unknown; }(); VariantHelpers::setInt (caretPos, pRetVal); @@ -412,28 +409,28 @@ private: }); } - JUCE_COMRESULT Move (TextUnit unit, int count, int* pRetVal) override + JUCE_COMRESULT Move (ComTypes::TextUnit unit, int count, int* pRetVal) override { return owner->withTextInterface (pRetVal, [&] (const AccessibilityTextInterface&) { if (count > 0) { - MoveEndpointByUnit (TextPatternRangeEndpoint_End, unit, count, pRetVal); - MoveEndpointByUnit (TextPatternRangeEndpoint_Start, unit, count, pRetVal); + MoveEndpointByUnit (ComTypes::TextPatternRangeEndpoint_End, unit, count, pRetVal); + MoveEndpointByUnit (ComTypes::TextPatternRangeEndpoint_Start, unit, count, pRetVal); } else if (count < 0) { - MoveEndpointByUnit (TextPatternRangeEndpoint_Start, unit, count, pRetVal); - MoveEndpointByUnit (TextPatternRangeEndpoint_End, unit, count, pRetVal); + MoveEndpointByUnit (ComTypes::TextPatternRangeEndpoint_Start, unit, count, pRetVal); + MoveEndpointByUnit (ComTypes::TextPatternRangeEndpoint_End, unit, count, pRetVal); } return S_OK; }); } - JUCE_COMRESULT MoveEndpointByRange (TextPatternRangeEndpoint endpoint, - ITextRangeProvider* targetRange, - TextPatternRangeEndpoint targetEndpoint) override + JUCE_COMRESULT MoveEndpointByRange (ComTypes::TextPatternRangeEndpoint endpoint, + ComTypes::ITextRangeProvider* targetRange, + ComTypes::TextPatternRangeEndpoint targetEndpoint) override { if (targetRange == nullptr) return E_INVALIDARG; @@ -441,11 +438,11 @@ private: if (! isElementValid()) return (HRESULT) UIA_E_ELEMENTNOTAVAILABLE; - if (auto* textInterface = owner->getHandler().getTextInterface()) + if (owner->getHandler().getTextInterface() != nullptr) { auto otherRange = static_cast (targetRange)->getSelectionRange(); - auto targetPoint = (targetEndpoint == TextPatternRangeEndpoint_Start ? otherRange.getStart() - : otherRange.getEnd()); + auto targetPoint = (targetEndpoint == ComTypes::TextPatternRangeEndpoint_Start ? otherRange.getStart() + : otherRange.getEnd()); setEndpointChecked (endpoint, targetPoint); return S_OK; @@ -454,8 +451,8 @@ private: return (HRESULT) UIA_E_NOTSUPPORTED; } - JUCE_COMRESULT MoveEndpointByUnit (TextPatternRangeEndpoint endpoint, - TextUnit unit, + JUCE_COMRESULT MoveEndpointByUnit (ComTypes::TextPatternRangeEndpoint endpoint, + ComTypes::TextUnit unit, int count, int* pRetVal) override { @@ -464,8 +461,8 @@ private: if (count == 0 || textInterface.getTotalNumCharacters() == 0) return S_OK; - auto endpointToMove = (endpoint == TextPatternRangeEndpoint_Start ? selectionRange.getStart() - : selectionRange.getEnd()); + auto endpointToMove = (endpoint == ComTypes::TextPatternRangeEndpoint_Start ? selectionRange.getStart() + : selectionRange.getEnd()); const auto direction = (count > 0 ? AccessibilityTextHelpers::Direction::forwards : AccessibilityTextHelpers::Direction::backwards); @@ -536,23 +533,23 @@ private: } private: - static AccessibilityTextHelpers::BoundaryType getBoundaryType (TextUnit unit) + static AccessibilityTextHelpers::BoundaryType getBoundaryType (ComTypes::TextUnit unit) { switch (unit) { - case TextUnit_Character: + case ComTypes::TextUnit_Character: return AccessibilityTextHelpers::BoundaryType::character; - case TextUnit_Format: - case TextUnit_Word: + case ComTypes::TextUnit_Format: + case ComTypes::TextUnit_Word: return AccessibilityTextHelpers::BoundaryType::word; - case TextUnit_Line: + case ComTypes::TextUnit_Line: return AccessibilityTextHelpers::BoundaryType::line; - case TextUnit_Paragraph: - case TextUnit_Page: - case TextUnit_Document: + case ComTypes::TextUnit_Paragraph: + case ComTypes::TextUnit_Page: + case ComTypes::TextUnit_Document: return AccessibilityTextHelpers::BoundaryType::document; }; @@ -560,9 +557,9 @@ private: return AccessibilityTextHelpers::BoundaryType::character; } - void setEndpointChecked (TextPatternRangeEndpoint endpoint, int newEndpoint) + void setEndpointChecked (ComTypes::TextPatternRangeEndpoint endpoint, int newEndpoint) { - if (endpoint == TextPatternRangeEndpoint_Start) + if (endpoint == ComTypes::TextPatternRangeEndpoint_Start) { if (selectionRange.getEnd() < newEndpoint) selectionRange.setEnd (newEndpoint); diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h index df0a795d32..8283a193a5 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h @@ -28,13 +28,10 @@ namespace juce //============================================================================== class UIAToggleProvider : public UIAProviderBase, - public ComBaseClassHelper + public ComBaseClassHelper { public: - explicit UIAToggleProvider (AccessibilityNativeHandle* nativeHandle) - : UIAProviderBase (nativeHandle) - { - } + using UIAProviderBase::UIAProviderBase; //============================================================================== JUCE_COMRESULT Toggle() override @@ -58,7 +55,7 @@ public: return (HRESULT) UIA_E_NOTSUPPORTED; } - JUCE_COMRESULT get_ToggleState (ToggleState* pRetVal) override + JUCE_COMRESULT get_ToggleState (ComTypes::ToggleState* pRetVal) override { return withCheckedComArgs (pRetVal, *this, [&] { @@ -68,10 +65,10 @@ public: } private: - ToggleState getCurrentToggleState() const + ComTypes::ToggleState getCurrentToggleState() const { - return getHandler().getCurrentState().isChecked() ? ToggleState_On - : ToggleState_Off; + return getHandler().getCurrentState().isChecked() ? ComTypes::ToggleState_On + : ComTypes::ToggleState_Off; } //============================================================================== diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h index d04859cc80..2e1194db0d 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h @@ -28,13 +28,10 @@ namespace juce //============================================================================== class UIATransformProvider : public UIAProviderBase, - public ComBaseClassHelper + public ComBaseClassHelper { public: - explicit UIATransformProvider (AccessibilityNativeHandle* nativeHandle) - : UIAProviderBase (nativeHandle) - { - } + using UIAProviderBase::UIAProviderBase; //============================================================================== JUCE_COMRESULT Move (double x, double y) override diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h index 05ce7ba57a..32702e697a 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h @@ -28,13 +28,10 @@ namespace juce //============================================================================== class UIAValueProvider : public UIAProviderBase, - public ComBaseClassHelper + public ComBaseClassHelper { public: - UIAValueProvider (AccessibilityNativeHandle* nativeHandle) - : UIAProviderBase (nativeHandle) - { - } + using UIAProviderBase::UIAProviderBase; //============================================================================== JUCE_COMRESULT SetValue (LPCWSTR val) override diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h index ab1d14e49c..71bf8e7f32 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h @@ -28,16 +28,13 @@ namespace juce //============================================================================== class UIAWindowProvider : public UIAProviderBase, - public ComBaseClassHelper + public ComBaseClassHelper { public: - explicit UIAWindowProvider (AccessibilityNativeHandle* nativeHandle) - : UIAProviderBase (nativeHandle) - { - } + using UIAProviderBase::UIAProviderBase; //============================================================================== - JUCE_COMRESULT SetVisualState (WindowVisualState state) override + JUCE_COMRESULT SetVisualState (ComTypes::WindowVisualState state) override { if (! isElementValid()) return (HRESULT) UIA_E_ELEMENTNOTAVAILABLE; @@ -46,15 +43,15 @@ public: { switch (state) { - case WindowVisualState_Maximized: + case ComTypes::WindowVisualState_Maximized: peer->setFullScreen (true); break; - case WindowVisualState_Minimized: + case ComTypes::WindowVisualState_Minimized: peer->setMinimised (true); break; - case WindowVisualState_Normal: + case ComTypes::WindowVisualState_Normal: peer->setFullScreen (false); peer->setMinimised (false); break; @@ -133,18 +130,18 @@ public: }); } - JUCE_COMRESULT get_WindowVisualState (WindowVisualState* pRetVal) override + JUCE_COMRESULT get_WindowVisualState (ComTypes::WindowVisualState* pRetVal) override { return withCheckedComArgs (pRetVal, *this, [&]() -> HRESULT { if (auto* peer = getPeer()) { if (peer->isFullScreen()) - *pRetVal = WindowVisualState_Maximized; + *pRetVal = ComTypes::WindowVisualState_Maximized; else if (peer->isMinimised()) - *pRetVal = WindowVisualState_Minimized; + *pRetVal = ComTypes::WindowVisualState_Minimized; else - *pRetVal = WindowVisualState_Normal; + *pRetVal = ComTypes::WindowVisualState_Normal; return S_OK; } @@ -153,15 +150,15 @@ public: }); } - JUCE_COMRESULT get_WindowInteractionState (WindowInteractionState* pRetVal) override + JUCE_COMRESULT get_WindowInteractionState (ComTypes::WindowInteractionState* pRetVal) override { return withCheckedComArgs (pRetVal, *this, [&]() -> HRESULT { if (auto* peer = getPeer()) { *pRetVal = peer->getComponent().isCurrentlyBlockedByAnotherModalComponent() - ? WindowInteractionState::WindowInteractionState_BlockedByModalWindow - : WindowInteractionState::WindowInteractionState_Running; + ? ComTypes::WindowInteractionState::WindowInteractionState_BlockedByModalWindow + : ComTypes::WindowInteractionState::WindowInteractionState_Running; return S_OK; } diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h b/modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h index 19c8a5d772..beaf8f1f82 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h +++ b/modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h @@ -127,7 +127,9 @@ private: template static FuncType getUiaFunction (HMODULE module, LPCSTR funcName) { + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wcast-function-type") return (FuncType) GetProcAddress (module, funcName); + JUCE_END_IGNORE_WARNINGS_GCC_LIKE } //============================================================================== diff --git a/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp b/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp index 4a213680ca..d00412b355 100644 --- a/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp +++ b/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp @@ -23,10 +23,6 @@ ============================================================================== */ -#if JUCE_MINGW -LWSTDAPI IUnknown_GetWindow (IUnknown* punk, HWND* phwnd); -#endif - namespace juce { @@ -253,7 +249,9 @@ private: JUCE_COMRESULT updateHwnd (IFileDialog* d) { HWND hwnd = nullptr; - IUnknown_GetWindow (d, &hwnd); + + if (auto window = ComSmartPtr { d }.getInterface()) + window->GetWindow (&hwnd); ScopedLock lock (owner.deletingDialog); @@ -501,13 +499,11 @@ private: const Remover remover (*this); - #if ! JUCE_MINGW if (SystemStats::getOperatingSystemType() >= SystemStats::WinVista && customComponent == nullptr) { return openDialogVistaAndUp (async); } - #endif return openDialogPreVista (async); } @@ -781,9 +777,9 @@ class FileChooser::Native : public std::enable_shared_from_this, public FileChooser::Pimpl { public: - Native (FileChooser& fileChooser, int flags, FilePreviewComponent* previewComp) + Native (FileChooser& fileChooser, int flagsIn, FilePreviewComponent* previewComp) : owner (fileChooser), - nativeFileChooser (std::make_unique (this, flags, previewComp, fileChooser.startingFile, + nativeFileChooser (std::make_unique (this, flagsIn, previewComp, fileChooser.startingFile, fileChooser.title, fileChooser.filters)) { auto mainMon = Desktop::getInstance().getDisplays().getPrimaryDisplay()->userArea; diff --git a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp index 900949fcf0..5276bde666 100644 --- a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp +++ b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp @@ -1133,7 +1133,6 @@ namespace IconConverters if (auto* dc = ::CreateCompatibleDC (deviceContext.dc)) { - JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wfour-char-constants") BITMAPV5HEADER header = {}; header.bV5Size = sizeof (BITMAPV5HEADER); header.bV5Width = bm.bmWidth; @@ -1145,15 +1144,8 @@ namespace IconConverters header.bV5GreenMask = 0x0000FF00; header.bV5BlueMask = 0x000000FF; header.bV5AlphaMask = 0xFF000000; - - #if JUCE_MINGW - header.bV5CSType = 'Win '; - #else - header.bV5CSType = LCS_WINDOWS_COLOR_SPACE; - #endif - + header.bV5CSType = 0x57696E20; // 'Win ' header.bV5Intent = LCS_GM_IMAGES; - JUCE_END_IGNORE_WARNINGS_GCC_LIKE uint32* bitmapImageData = nullptr; @@ -4545,8 +4537,8 @@ class PreVistaMessageBox : public WindowsMessageBoxBase public: PreVistaMessageBox (const MessageBoxOptions& opts, UINT extraFlags, - std::unique_ptr&& callback) - : WindowsMessageBoxBase (opts.getAssociatedComponent(), std::move (callback)), + std::unique_ptr&& cb) + : WindowsMessageBoxBase (opts.getAssociatedComponent(), std::move (cb)), flags (extraFlags | getMessageBoxFlags (opts.getIconType())), title (opts.getTitle()), message (opts.getMessage()) { @@ -4598,8 +4590,8 @@ class WindowsTaskDialog : public WindowsMessageBoxBase { public: WindowsTaskDialog (const MessageBoxOptions& opts, - std::unique_ptr&& callback) - : WindowsMessageBoxBase (opts.getAssociatedComponent(), std::move (callback)), + std::unique_ptr&& cb) + : WindowsMessageBoxBase (opts.getAssociatedComponent(), std::move (cb)), iconType (opts.getIconType()), title (opts.getTitle()), message (opts.getMessage()), button1 (opts.getButtonText (0)), button2 (opts.getButtonText (1)), button3 (opts.getButtonText (2)) diff --git a/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp b/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp index 1f60aab38e..579e3aafbd 100644 --- a/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp +++ b/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp @@ -28,8 +28,8 @@ namespace juce struct InternalWebViewType { - InternalWebViewType() {} - virtual ~InternalWebViewType() {} + InternalWebViewType() = default; + virtual ~InternalWebViewType() = default; virtual void createBrowser() = 0; virtual bool hasBrowserBeenCreated() = 0; @@ -47,20 +47,6 @@ struct InternalWebViewType JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InternalWebViewType) }; -#if JUCE_MINGW - JUCE_DECLARE_UUID_GETTER (IOleClientSite, "00000118-0000-0000-c000-000000000046") - JUCE_DECLARE_UUID_GETTER (IDispatch, "00020400-0000-0000-c000-000000000046") - - #ifndef WebBrowser - class WebBrowser; - #endif -#endif - -JUCE_DECLARE_UUID_GETTER (DWebBrowserEvents2, "34A715A0-6587-11D0-924A-0020AFC7AC4D") -JUCE_DECLARE_UUID_GETTER (IConnectionPointContainer, "B196B284-BAB4-101A-B69C-00AA00341D07") -JUCE_DECLARE_UUID_GETTER (IWebBrowser2, "D30C1661-CDAF-11D0-8A3E-00C04FC9E26E") -JUCE_DECLARE_UUID_GETTER (WebBrowser, "8856F961-340A-11D0-A96B-00C04FD705A2") - //============================================================================== class Win32WebView : public InternalWebViewType, public ActiveXControlComponent diff --git a/modules/juce_video/juce_video.cpp b/modules/juce_video/juce_video.cpp index f7df267db6..4ded38bb43 100644 --- a/modules/juce_video/juce_video.cpp +++ b/modules/juce_video/juce_video.cpp @@ -44,14 +44,11 @@ #import //============================================================================== -#elif JUCE_WINDOWS && ! JUCE_MINGW - /* If you're using the camera classes, you'll need access to a few DirectShow headers. - These files are provided in the normal Windows SDK. */ - #include - #include - #include +#elif JUCE_WINDOWS + #include "wmsdkidl.h" + #include "native/juce_win32_ComTypes.h" - #if ! JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES + #if ! JUCE_MINGW && ! JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES #pragma comment (lib, "strmiids.lib") #if JUCE_USE_CAMERA diff --git a/modules/juce_video/native/juce_win32_CameraDevice.h b/modules/juce_video/native/juce_win32_CameraDevice.h index 4e24313012..7ea42fd21a 100644 --- a/modules/juce_video/native/juce_win32_CameraDevice.h +++ b/modules/juce_video/native/juce_win32_CameraDevice.h @@ -23,29 +23,6 @@ ============================================================================== */ -interface ISampleGrabberCB : public IUnknown -{ - JUCE_COMCALL SampleCB (double, IMediaSample*) = 0; - JUCE_COMCALL BufferCB (double, BYTE*, long) = 0; -}; - -interface ISampleGrabber : public IUnknown -{ - JUCE_COMCALL SetOneShot (BOOL) = 0; - JUCE_COMCALL SetMediaType (const AM_MEDIA_TYPE*) = 0; - JUCE_COMCALL GetConnectedMediaType (AM_MEDIA_TYPE*) = 0; - JUCE_COMCALL SetBufferSamples (BOOL) = 0; - JUCE_COMCALL GetCurrentBuffer (long*, long*) = 0; - JUCE_COMCALL GetCurrentSample (IMediaSample**) = 0; - JUCE_COMCALL SetCallback (ISampleGrabberCB*, long) = 0; -}; - -static const IID IID_ISampleGrabberCB = { 0x0579154A, 0x2B53, 0x4994, { 0xB0, 0xD0, 0xE7, 0x73, 0x14, 0x8E, 0xFF, 0x85 } }; -static const IID IID_ISampleGrabber = { 0x6B652FFF, 0x11FE, 0x4fce, { 0x92, 0xAD, 0x02, 0x66, 0xB5, 0xD7, 0xC7, 0x8F } }; -static const CLSID CLSID_SampleGrabber = { 0xC1F400A0, 0x3F08, 0x11d3, { 0x9F, 0x0B, 0x00, 0x60, 0x08, 0x03, 0x9E, 0x37 } }; -static const CLSID CLSID_NullRenderer = { 0xC1F400A4, 0x3F08, 0x11d3, { 0x9F, 0x0B, 0x00, 0x60, 0x08, 0x03, 0x9E, 0x37 } }; - - struct CameraDevice::Pimpl : public ChangeBroadcaster { Pimpl (CameraDevice& ownerToUse, const String&, int index, @@ -53,7 +30,7 @@ struct CameraDevice::Pimpl : public ChangeBroadcaster bool /*highQuality*/) : owner (ownerToUse) { - HRESULT hr = captureGraphBuilder.CoCreateInstance (CLSID_CaptureGraphBuilder2); + HRESULT hr = captureGraphBuilder.CoCreateInstance (ComTypes::CLSID_CaptureGraphBuilder2); if (FAILED (hr)) return; @@ -61,7 +38,7 @@ struct CameraDevice::Pimpl : public ChangeBroadcaster if (filter == nullptr) return; - hr = graphBuilder.CoCreateInstance (CLSID_FilterGraph); + hr = graphBuilder.CoCreateInstance (ComTypes::CLSID_FilterGraph); if (FAILED (hr)) return; @@ -69,15 +46,17 @@ struct CameraDevice::Pimpl : public ChangeBroadcaster if (FAILED (hr)) return; - mediaControl = graphBuilder.getInterface(); + mediaControl = graphBuilder.getInterface(); if (mediaControl == nullptr) return; { - ComSmartPtr streamConfig; + ComSmartPtr streamConfig; - hr = captureGraphBuilder->FindInterface (&PIN_CATEGORY_CAPTURE, nullptr, filter, - IID_IAMStreamConfig, (void**) streamConfig.resetAndGetPointerAddress()); + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token") + hr = captureGraphBuilder->FindInterface (&ComTypes::PIN_CATEGORY_CAPTURE, nullptr, filter, + __uuidof (ComTypes::IAMStreamConfig), (void**) streamConfig.resetAndGetPointerAddress()); + JUCE_END_IGNORE_WARNINGS_GCC_LIKE if (streamConfig != nullptr) { @@ -92,7 +71,7 @@ struct CameraDevice::Pimpl : public ChangeBroadcaster if (FAILED (hr)) return; - hr = smartTee.CoCreateInstance (CLSID_SmartTee); + hr = smartTee.CoCreateInstance (ComTypes::CLSID_SmartTee); if (FAILED (hr)) return; @@ -103,20 +82,23 @@ struct CameraDevice::Pimpl : public ChangeBroadcaster if (! connectFilters (filter, smartTee)) return; - ComSmartPtr sampleGrabberBase; - hr = sampleGrabberBase.CoCreateInstance (CLSID_SampleGrabber); + ComSmartPtr sampleGrabberBase; + hr = sampleGrabberBase.CoCreateInstance (ComTypes::CLSID_SampleGrabber); if (FAILED (hr)) return; - hr = sampleGrabberBase.QueryInterface (IID_ISampleGrabber, sampleGrabber); + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token") + hr = sampleGrabberBase.QueryInterface (__uuidof (ComTypes::ISampleGrabber), sampleGrabber); + JUCE_END_IGNORE_WARNINGS_GCC_LIKE + if (FAILED (hr)) return; { - AM_MEDIA_TYPE mt = {}; - mt.majortype = MEDIATYPE_Video; - mt.subtype = MEDIASUBTYPE_RGB24; - mt.formattype = FORMAT_VideoInfo; + ComTypes::AM_MEDIA_TYPE mt = {}; + mt.majortype = ComTypes::MEDIATYPE_Video; + mt.subtype = ComTypes::MEDIASUBTYPE_RGB24; + mt.formattype = ComTypes::FORMAT_VideoInfo; sampleGrabber->SetMediaType (&mt); } @@ -127,27 +109,27 @@ struct CameraDevice::Pimpl : public ChangeBroadcaster if (FAILED (hr)) return; - ComSmartPtr grabberInputPin; - if (! (getPin (smartTee, PINDIR_OUTPUT, smartTeeCaptureOutputPin, "capture") - && getPin (smartTee, PINDIR_OUTPUT, smartTeePreviewOutputPin, "preview") - && getPin (sampleGrabberBase, PINDIR_INPUT, grabberInputPin))) + ComSmartPtr grabberInputPin; + if (! (getPin (smartTee, ComTypes::PINDIR_OUTPUT, smartTeeCaptureOutputPin, "capture") + && getPin (smartTee, ComTypes::PINDIR_OUTPUT, smartTeePreviewOutputPin, "preview") + && getPin (sampleGrabberBase, ComTypes::PINDIR_INPUT, grabberInputPin))) return; hr = graphBuilder->Connect (smartTeePreviewOutputPin, grabberInputPin); if (FAILED (hr)) return; - AM_MEDIA_TYPE mt = {}; + ComTypes::AM_MEDIA_TYPE mt = {}; hr = sampleGrabber->GetConnectedMediaType (&mt); - if (auto* pVih = unalignedPointerCast (mt.pbFormat)) + if (auto* pVih = unalignedPointerCast (mt.pbFormat)) { width = pVih->bmiHeader.biWidth; height = pVih->bmiHeader.biHeight; } - ComSmartPtr nullFilter; - hr = nullFilter.CoCreateInstance (CLSID_NullRenderer); + ComSmartPtr nullFilter; + hr = nullFilter.CoCreateInstance (ComTypes::CLSID_NullRenderer); hr = graphBuilder->AddFilter (nullFilter, _T("Null Renderer")); if (connectFilters (sampleGrabberBase, nullFilter) @@ -291,12 +273,12 @@ struct CameraDevice::Pimpl : public ChangeBroadcaster firstRecordedTime = Time::getCurrentTime() - RelativeTime (defaultCameraLatency); recordNextFrameTime = false; - ComSmartPtr pin; - if (getPin (filter, PINDIR_OUTPUT, pin)) + ComSmartPtr pin; + if (getPin (filter, ComTypes::PINDIR_OUTPUT, pin)) { - if (auto pushSource = pin.getInterface()) + if (auto pushSource = pin.getInterface()) { - REFERENCE_TIME latency = 0; + ComTypes::REFERENCE_TIME latency = 0; pushSource->GetLatency (&latency); firstRecordedTime = firstRecordedTime - RelativeTime ((double) latency); @@ -359,11 +341,11 @@ struct CameraDevice::Pimpl : public ChangeBroadcaster recordNextFrameTime = true; previewMaxFPS = 60; - HRESULT hr = asfWriter.CoCreateInstance (CLSID_WMAsfWriter); + HRESULT hr = asfWriter.CoCreateInstance (ComTypes::CLSID_WMAsfWriter); if (SUCCEEDED (hr)) { - if (auto fileSink = asfWriter.getInterface()) + if (auto fileSink = asfWriter.getInterface()) { hr = fileSink->SetFileName (file.getFullPathName().toWideCharPointer(), nullptr); @@ -373,11 +355,19 @@ struct CameraDevice::Pimpl : public ChangeBroadcaster if (SUCCEEDED (hr)) { - if (auto asfConfig = asfWriter.getInterface()) + if (auto asfConfig = asfWriter.getInterface()) { asfConfig->SetIndexMode (true); ComSmartPtr profileManager; - hr = WMCreateProfileManager (profileManager.resetAndGetPointerAddress()); + + using Fn = HRESULT (*) (IWMProfileManager**); + + // This function is available on Windows 2000 and up, but we load it at runtime anway + // because some versions of MinGW ship with libraries that don't include this symbol. + if (auto* fn = reinterpret_cast (wmvcoreLibrary.getFunction ("WMCreateProfileManager"))) + hr = fn (profileManager.resetAndGetPointerAddress()); + else + jassertfalse; // This gibberish is the DirectShow profile for a video-only wmv file. String prof ("" @@ -414,9 +404,9 @@ struct CameraDevice::Pimpl : public ChangeBroadcaster if (SUCCEEDED (hr)) { - ComSmartPtr asfWriterInputPin; + ComSmartPtr asfWriterInputPin; - if (getPin (asfWriter, PINDIR_INPUT, asfWriterInputPin, "Video Input 01")) + if (getPin (asfWriter, ComTypes::PINDIR_INPUT, asfWriterInputPin, "Video Input 01")) { hr = graphBuilder->Connect (smartTeeCaptureOutputPin, asfWriterInputPin); @@ -462,10 +452,10 @@ struct CameraDevice::Pimpl : public ChangeBroadcaster previewMaxFPS = 60; } - static ComSmartPtr enumerateCameras (StringArray* names, const int deviceIndexToOpen) + static ComSmartPtr enumerateCameras (StringArray* names, const int deviceIndexToOpen) { int index = 0; - ComSmartPtr pDevEnum; + ComSmartPtr pDevEnum; struct Deleter { @@ -474,10 +464,10 @@ struct CameraDevice::Pimpl : public ChangeBroadcaster using ContextPtr = std::unique_ptr; - if (SUCCEEDED (pDevEnum.CoCreateInstance (CLSID_SystemDeviceEnum))) + if (SUCCEEDED (pDevEnum.CoCreateInstance (ComTypes::CLSID_SystemDeviceEnum))) { ComSmartPtr enumerator; - HRESULT hr = pDevEnum->CreateClassEnumerator (CLSID_VideoInputDeviceCategory, enumerator.resetAndGetPointerAddress(), 0); + HRESULT hr = pDevEnum->CreateClassEnumerator (ComTypes::CLSID_VideoInputDeviceCategory, enumerator.resetAndGetPointerAddress(), 0); if (SUCCEEDED (hr) && enumerator != nullptr) { @@ -493,8 +483,10 @@ struct CameraDevice::Pimpl : public ChangeBroadcaster return ContextPtr (ptr); }(); - ComSmartPtr captureFilter; - hr = moniker->BindToObject (context.get(), nullptr, IID_IBaseFilter, (void**) captureFilter.resetAndGetPointerAddress()); + ComSmartPtr captureFilter; + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token") + hr = moniker->BindToObject (context.get(), nullptr, __uuidof (ComTypes::IBaseFilter), (void**) captureFilter.resetAndGetPointerAddress()); + JUCE_END_IGNORE_WARNINGS_GCC_LIKE if (SUCCEEDED (hr)) { @@ -535,20 +527,22 @@ struct CameraDevice::Pimpl : public ChangeBroadcaster return devs; } - struct GrabberCallback : public ComBaseClassHelperBase + struct GrabberCallback : public ComBaseClassHelperBase { GrabberCallback (Pimpl& p) : ComBaseClassHelperBase (0), owner (p) {} JUCE_COMRESULT QueryInterface (REFIID refId, void** result) { - if (refId == IID_ISampleGrabberCB) - return castToType (result); + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token") + if (refId == __uuidof (ComTypes::ISampleGrabberCB)) + return castToType (result); + JUCE_END_IGNORE_WARNINGS_GCC_LIKE - return ComBaseClassHelperBase::QueryInterface (refId, result); + return ComBaseClassHelperBase::QueryInterface (refId, result); } - JUCE_COMRESULT SampleCB (double, IMediaSample*) { return E_FAIL; } + JUCE_COMRESULT SampleCB (double, ComTypes::IMediaSample*) { return E_FAIL; } JUCE_COMRESULT BufferCB (double time, BYTE* buffer, long bufferSize) { @@ -561,6 +555,7 @@ struct CameraDevice::Pimpl : public ChangeBroadcaster JUCE_DECLARE_NON_COPYABLE (GrabberCallback) }; + DynamicLibrary wmvcoreLibrary { "wmvcore" }; CameraDevice& owner; ComSmartPtr callback; @@ -577,12 +572,12 @@ struct CameraDevice::Pimpl : public ChangeBroadcaster Array viewerComps; - ComSmartPtr captureGraphBuilder; - ComSmartPtr filter, smartTee, asfWriter; - ComSmartPtr graphBuilder; - ComSmartPtr sampleGrabber; - ComSmartPtr mediaControl; - ComSmartPtr smartTeePreviewOutputPin, smartTeeCaptureOutputPin; + ComSmartPtr captureGraphBuilder; + ComSmartPtr filter, smartTee, asfWriter; + ComSmartPtr graphBuilder; + ComSmartPtr sampleGrabber; + ComSmartPtr mediaControl; + ComSmartPtr smartTeePreviewOutputPin, smartTeeCaptureOutputPin; int activeUsers = 0; Array widths, heights; DWORD graphRegistrationID; @@ -597,7 +592,7 @@ struct CameraDevice::Pimpl : public ChangeBroadcaster JUCE_DECLARE_WEAK_REFERENCEABLE (Pimpl) private: - void getVideoSizes (IAMStreamConfig* const streamConfig) + void getVideoSizes (ComTypes::IAMStreamConfig* const streamConfig) { widths.clear(); heights.clear(); @@ -605,12 +600,12 @@ private: int count = 0, size = 0; streamConfig->GetNumberOfCapabilities (&count, &size); - if (size == sizeof (VIDEO_STREAM_CONFIG_CAPS)) + if (size == (int) sizeof (ComTypes::VIDEO_STREAM_CONFIG_CAPS)) { for (int i = 0; i < count; ++i) { - VIDEO_STREAM_CONFIG_CAPS scc; - AM_MEDIA_TYPE* config; + ComTypes::VIDEO_STREAM_CONFIG_CAPS scc; + ComTypes::AM_MEDIA_TYPE* config; HRESULT hr = streamConfig->GetStreamCaps (i, &config, (BYTE*) &scc); @@ -642,17 +637,17 @@ private: } } - bool selectVideoSize (IAMStreamConfig* const streamConfig, + bool selectVideoSize (ComTypes::IAMStreamConfig* const streamConfig, const int minWidth, const int minHeight, const int maxWidth, const int maxHeight) { int count = 0, size = 0, bestArea = 0, bestIndex = -1; streamConfig->GetNumberOfCapabilities (&count, &size); - if (size == sizeof (VIDEO_STREAM_CONFIG_CAPS)) + if (size == (int) sizeof (ComTypes::VIDEO_STREAM_CONFIG_CAPS)) { - AM_MEDIA_TYPE* config; - VIDEO_STREAM_CONFIG_CAPS scc; + ComTypes::AM_MEDIA_TYPE* config; + ComTypes::VIDEO_STREAM_CONFIG_CAPS scc; for (int i = 0; i < count; ++i) { @@ -690,22 +685,22 @@ private: return false; } - static bool getPin (IBaseFilter* filter, const PIN_DIRECTION wantedDirection, - ComSmartPtr& result, const char* pinName = nullptr) + static bool getPin (ComTypes::IBaseFilter* filter, const ComTypes::PIN_DIRECTION wantedDirection, + ComSmartPtr& result, const char* pinName = nullptr) { - ComSmartPtr enumerator; - ComSmartPtr pin; + ComSmartPtr enumerator; + ComSmartPtr pin; filter->EnumPins (enumerator.resetAndGetPointerAddress()); while (enumerator->Next (1, pin.resetAndGetPointerAddress(), nullptr) == S_OK) { - PIN_DIRECTION dir; + ComTypes::PIN_DIRECTION dir; pin->QueryDirection (&dir); if (wantedDirection == dir) { - PIN_INFO info = {}; + ComTypes::PIN_INFO info = {}; pin->QueryPinInfo (&info); if (pinName == nullptr || String (pinName).equalsIgnoreCase (String (info.achName))) @@ -719,12 +714,12 @@ private: return false; } - bool connectFilters (IBaseFilter* const first, IBaseFilter* const second) const + bool connectFilters (ComTypes::IBaseFilter* const first, ComTypes::IBaseFilter* const second) const { - ComSmartPtr in, out; + ComSmartPtr in, out; - return getPin (first, PINDIR_OUTPUT, out) - && getPin (second, PINDIR_INPUT, in) + return getPin (first, ComTypes::PINDIR_OUTPUT, out) + && getPin (second, ComTypes::PINDIR_INPUT, in) && SUCCEEDED (graphBuilder->Connect (out, in)); } @@ -754,7 +749,7 @@ private: void disconnectAnyViewers(); - static void deleteMediaType (AM_MEDIA_TYPE* const pmt) + static void deleteMediaType (ComTypes::AM_MEDIA_TYPE* const pmt) { if (pmt->cbFormat != 0) CoTaskMemFree ((PVOID) pmt->pbFormat); diff --git a/modules/juce_video/native/juce_win32_ComTypes.h b/modules/juce_video/native/juce_win32_ComTypes.h new file mode 100644 index 0000000000..93c653a134 --- /dev/null +++ b/modules/juce_video/native/juce_win32_ComTypes.h @@ -0,0 +1,512 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2020 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 6 End-User License + Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). + + End User License Agreement: www.juce.com/juce-6-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ +namespace ComTypes +{ +/* + These interfaces would normally be included in the system platform headers. + However, those headers are likely to be incomplete when building with + MinGW. In order to allow building video applications under MinGW, + we reproduce all necessary definitions here. +*/ + +enum PIN_DIRECTION +{ + PINDIR_INPUT = 0, + PINDIR_OUTPUT = PINDIR_INPUT + 1 +}; + +enum VMRMode +{ + VMRMode_Windowed = 0x1, + VMRMode_Windowless = 0x2, + VMRMode_Renderless = 0x4, + VMRMode_Mask = 0x7 +}; + +enum VMR_ASPECT_RATIO_MODE +{ + VMR_ARMODE_NONE = 0, + VMR_ARMODE_LETTER_BOX = VMR_ARMODE_NONE + 1 +}; + +enum MFVideoAspectRatioMode +{ + MFVideoARMode_None = 0, + MFVideoARMode_PreservePicture = 0x1, + MFVideoARMode_PreservePixel = 0x2, + MFVideoARMode_NonLinearStretch = 0x4, + MFVideoARMode_Mask = 0x7 +}; + +enum FILTER_STATE +{ + State_Stopped = 0, + State_Paused = State_Stopped + 1, + State_Running = State_Paused + 1 +}; + +enum WMT_VERSION +{ + WMT_VER_4_0 = 0x40000, + WMT_VER_7_0 = 0x70000, + WMT_VER_8_0 = 0x80000, + WMT_VER_9_0 = 0x90000 +}; + +// We only ever refer to these through a pointer, so we don't need definitions for them. +struct IAMCopyCaptureFileProgress; +struct IBaseFilter; +struct IEnumFilters; +struct IEnumMediaTypes; +struct IReferenceClock; +struct IVMRImageCompositor; + +struct FILTER_INFO; + +struct AM_MEDIA_TYPE +{ + GUID majortype; + GUID subtype; + BOOL bFixedSizeSamples; + BOOL bTemporalCompression; + ULONG lSampleSize; + GUID formattype; + IUnknown* pUnk; + ULONG cbFormat; + BYTE* pbFormat; +}; + +typedef LONGLONG REFERENCE_TIME; +typedef LONG_PTR OAEVENT; +typedef LONG_PTR OAHWND; +typedef double REFTIME; +typedef long OAFilterState; + +enum Constants +{ + EC_STATE_CHANGE = 0x32, + EC_REPAINT = 0x05, + EC_COMPLETE = 0x01, + EC_ERRORABORT = 0x03, + EC_ERRORABORTEX = 0x45, + EC_USERABORT = 0x02, + + VFW_E_INVALID_FILE_FORMAT = (HRESULT) 0x8004022FL, + VFW_E_NOT_FOUND = (HRESULT) 0x80040216L, + VFW_E_UNKNOWN_FILE_TYPE = (HRESULT) 0x80040240L, + VFW_E_UNSUPPORTED_STREAM = (HRESULT) 0x80040265L, + VFW_E_CANNOT_CONNECT = (HRESULT) 0x80040217L, + VFW_E_CANNOT_LOAD_SOURCE_FILTER = (HRESULT) 0x80040241L, + VFW_E_NOT_CONNECTED = (HRESULT) 0x80040209L +}; + +struct MFVideoNormalizedRect +{ + float left; + float top; + float right; + float bottom; +}; + +struct VIDEOINFOHEADER +{ + RECT rcSource; + RECT rcTarget; + DWORD dwBitRate; + DWORD dwBitErrorRate; + REFERENCE_TIME AvgTimePerFrame; + BITMAPINFOHEADER bmiHeader; +}; + +struct VIDEO_STREAM_CONFIG_CAPS +{ + GUID guid; + ULONG VideoStandard; + SIZE InputSize; + SIZE MinCroppingSize; + SIZE MaxCroppingSize; + int CropGranularityX; + int CropGranularityY; + int CropAlignX; + int CropAlignY; + SIZE MinOutputSize; + SIZE MaxOutputSize; + int OutputGranularityX; + int OutputGranularityY; + int StretchTapsX; + int StretchTapsY; + int ShrinkTapsX; + int ShrinkTapsY; + LONGLONG MinFrameInterval; + LONGLONG MaxFrameInterval; + LONG MinBitsPerSecond; + LONG MaxBitsPerSecond; +}; + +struct PIN_INFO +{ + IBaseFilter* pFilter; + PIN_DIRECTION dir; + WCHAR achName[128]; +}; + +JUCE_COMCLASS (ICreateDevEnum, "29840822-5B84-11D0-BD3B-00A0C911CE86") : public IUnknown +{ +public: + JUCE_COMCALL CreateClassEnumerator (REFCLSID clsidDeviceClass, _Out_ IEnumMoniker * *ppEnumMoniker, DWORD dwFlags) = 0; +}; + +JUCE_COMCLASS (IPin, "56a86891-0ad4-11ce-b03a-0020af0ba770") : public IUnknown +{ +public: + JUCE_COMCALL Connect (IPin * pReceivePin, _In_opt_ const AM_MEDIA_TYPE* pmt) = 0; + JUCE_COMCALL ReceiveConnection (IPin * pConnector, const AM_MEDIA_TYPE* pmt) = 0; + JUCE_COMCALL Disconnect() = 0; + JUCE_COMCALL ConnectedTo (_Out_ IPin * *pPin) = 0; + JUCE_COMCALL ConnectionMediaType (_Out_ AM_MEDIA_TYPE * pmt) = 0; + JUCE_COMCALL QueryPinInfo (_Out_ PIN_INFO * pInfo) = 0; + JUCE_COMCALL QueryDirection (_Out_ PIN_DIRECTION * pPinDir) = 0; + JUCE_COMCALL QueryId (_Out_ LPWSTR * Id) = 0; + JUCE_COMCALL QueryAccept (const AM_MEDIA_TYPE* pmt) = 0; + JUCE_COMCALL EnumMediaTypes (_Out_ IEnumMediaTypes * *ppEnum) = 0; + JUCE_COMCALL QueryInternalConnections (_Out_writes_to_opt_ (*nPin, *nPin) IPin * *apPin, ULONG * nPin) = 0; + JUCE_COMCALL EndOfStream() = 0; + JUCE_COMCALL BeginFlush() = 0; + JUCE_COMCALL EndFlush() = 0; + JUCE_COMCALL NewSegment (REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate) = 0; +}; + +JUCE_COMCLASS (IFilterGraph, "56a8689f-0ad4-11ce-b03a-0020af0ba770") : public IUnknown +{ +public: + JUCE_COMCALL AddFilter (IBaseFilter * pFilter, LPCWSTR pName) = 0; + JUCE_COMCALL RemoveFilter (IBaseFilter * pFilter) = 0; + JUCE_COMCALL EnumFilters (_Out_ IEnumFilters * *ppEnum) = 0; + JUCE_COMCALL FindFilterByName (LPCWSTR pName, _Out_ IBaseFilter * *ppFilter) = 0; + JUCE_COMCALL ConnectDirect (IPin * ppinOut, IPin * ppinIn, _In_opt_ const AM_MEDIA_TYPE* pmt) = 0; + JUCE_COMCALL Reconnect (IPin * ppin) = 0; + JUCE_COMCALL Disconnect (IPin * ppin) = 0; + JUCE_COMCALL SetDefaultSyncSource() = 0; +}; + +JUCE_COMCLASS (IGraphBuilder, "56a868a9-0ad4-11ce-b03a-0020af0ba770") : public IFilterGraph +{ +public: + JUCE_COMCALL Connect (IPin * ppinOut, IPin * ppinIn) = 0; + JUCE_COMCALL Render (IPin * ppinOut) = 0; + JUCE_COMCALL RenderFile (LPCWSTR lpcwstrFile, _In_opt_ LPCWSTR lpcwstrPlayList) = 0; + JUCE_COMCALL AddSourceFilter (LPCWSTR lpcwstrFileName, _In_opt_ LPCWSTR lpcwstrFilterName, _Out_ IBaseFilter * *ppFilter) = 0; + JUCE_COMCALL SetLogFile (DWORD_PTR hFile) = 0; + JUCE_COMCALL Abort() = 0; + JUCE_COMCALL ShouldOperationContinue() = 0; +}; + +JUCE_COMCLASS (IMediaFilter, "56a86899-0ad4-11ce-b03a-0020af0ba770") : public IPersist +{ +public: + JUCE_COMCALL Stop() = 0; + JUCE_COMCALL Pause() = 0; + JUCE_COMCALL Run (REFERENCE_TIME tStart) = 0; + JUCE_COMCALL GetState (DWORD dwMilliSecsTimeout, _Out_ FILTER_STATE * State) = 0; + JUCE_COMCALL SetSyncSource (_In_opt_ IReferenceClock * pClock) = 0; + JUCE_COMCALL GetSyncSource (_Outptr_result_maybenull_ IReferenceClock * *pClock) = 0; +}; + +JUCE_COMCLASS (IEnumPins, "56a86892-0ad4-11ce-b03a-0020af0ba770") : public IUnknown +{ +public: + JUCE_COMCALL Next (ULONG cPins, _Out_writes_to_ (cPins, *pcFetched) IPin * *ppPins, _Out_opt_ ULONG * pcFetched) = 0; + JUCE_COMCALL Skip (ULONG cPins) = 0; + JUCE_COMCALL Reset() = 0; + JUCE_COMCALL Clone (_Out_ IEnumPins * *ppEnum) = 0; +}; + +JUCE_COMCLASS (IBaseFilter, "56a86895-0ad4-11ce-b03a-0020af0ba770") : public IMediaFilter +{ +public: + JUCE_COMCALL EnumPins (_Out_ IEnumPins * *ppEnum) = 0; + JUCE_COMCALL FindPin (LPCWSTR Id, _Out_ IPin * *ppPin) = 0; + JUCE_COMCALL QueryFilterInfo (_Out_ FILTER_INFO * pInfo) = 0; + JUCE_COMCALL JoinFilterGraph (_In_opt_ IFilterGraph * pGraph, _In_opt_ LPCWSTR pName) = 0; + JUCE_COMCALL QueryVendorInfo (_Out_ LPWSTR * pVendorInfo) = 0; +}; + +JUCE_COMCLASS (IVMRWindowlessControl, "0eb1088c-4dcd-46f0-878f-39dae86a51b7") : public IUnknown +{ +public: + JUCE_COMCALL GetNativeVideoSize (LONG * lpWidth, LONG * lpHeight, LONG * lpARWidth, LONG * lpARHeight) = 0; + JUCE_COMCALL GetMinIdealVideoSize (LONG * lpWidth, LONG * lpHeight) = 0; + JUCE_COMCALL GetMaxIdealVideoSize (LONG * lpWidth, LONG * lpHeight) = 0; + JUCE_COMCALL SetVideoPosition (const LPRECT lpSRCRect, const LPRECT lpDSTRect) = 0; + JUCE_COMCALL GetVideoPosition (LPRECT lpSRCRect, LPRECT lpDSTRect) = 0; + JUCE_COMCALL GetAspectRatioMode (DWORD * lpAspectRatioMode) = 0; + JUCE_COMCALL SetAspectRatioMode (DWORD AspectRatioMode) = 0; + JUCE_COMCALL SetVideoClippingWindow (HWND hwnd) = 0; + JUCE_COMCALL RepaintVideo (HWND hwnd, HDC hdc) = 0; + JUCE_COMCALL DisplayModeChanged() = 0; + JUCE_COMCALL GetCurrentImage (BYTE * *lpDib) = 0; + JUCE_COMCALL SetBorderColor (COLORREF Clr) = 0; + JUCE_COMCALL GetBorderColor (COLORREF * lpClr) = 0; + JUCE_COMCALL SetColorKey (COLORREF Clr) = 0; + JUCE_COMCALL GetColorKey (COLORREF * lpClr) = 0; +}; + +JUCE_COMCLASS (IVMRFilterConfig, "9e5530c5-7034-48b4-bb46-0b8a6efc8e36") : public IUnknown +{ +public: + JUCE_COMCALL SetImageCompositor (IVMRImageCompositor * lpVMRImgCompositor) = 0; + JUCE_COMCALL SetNumberOfStreams (DWORD dwMaxStreams) = 0; + JUCE_COMCALL GetNumberOfStreams (DWORD * pdwMaxStreams) = 0; + JUCE_COMCALL SetRenderingPrefs (DWORD dwRenderFlags) = 0; + JUCE_COMCALL GetRenderingPrefs (DWORD * pdwRenderFlags) = 0; + JUCE_COMCALL SetRenderingMode (DWORD Mode) = 0; + JUCE_COMCALL GetRenderingMode (DWORD * pMode) = 0; +}; + +JUCE_COMCLASS (IMFVideoDisplayControl, "a490b1e4-ab84-4d31-a1b2-181e03b1077a") : public IUnknown +{ +public: + JUCE_COMCALL GetNativeVideoSize (__RPC__inout_opt SIZE * pszVideo, __RPC__inout_opt SIZE * pszARVideo) = 0; + JUCE_COMCALL GetIdealVideoSize (__RPC__inout_opt SIZE * pszMin, __RPC__inout_opt SIZE * pszMax) = 0; + JUCE_COMCALL SetVideoPosition (__RPC__in_opt const MFVideoNormalizedRect* pnrcSource, __RPC__in_opt const LPRECT prcDest) = 0; + JUCE_COMCALL GetVideoPosition (__RPC__out MFVideoNormalizedRect * pnrcSource, __RPC__out LPRECT prcDest) = 0; + JUCE_COMCALL SetAspectRatioMode (DWORD dwAspectRatioMode) = 0; + JUCE_COMCALL GetAspectRatioMode (__RPC__out DWORD * pdwAspectRatioMode) = 0; + JUCE_COMCALL SetVideoWindow (__RPC__in HWND hwndVideo) = 0; + JUCE_COMCALL GetVideoWindow (__RPC__deref_out_opt HWND * phwndVideo) = 0; + JUCE_COMCALL RepaintVideo() = 0; + JUCE_COMCALL GetCurrentImage (__RPC__inout BITMAPINFOHEADER * pBih, __RPC__deref_out_ecount_full_opt (*pcbDib) BYTE * *pDib, __RPC__out DWORD * pcbDib, __RPC__inout_opt LONGLONG * pTimeStamp) = 0; + JUCE_COMCALL SetBorderColor (COLORREF Clr) = 0; + JUCE_COMCALL GetBorderColor (__RPC__out COLORREF * pClr) = 0; + JUCE_COMCALL SetRenderingPrefs (DWORD dwRenderFlags) = 0; + JUCE_COMCALL GetRenderingPrefs (__RPC__out DWORD * pdwRenderFlags) = 0; + JUCE_COMCALL SetFullscreen (BOOL fFullscreen) = 0; + JUCE_COMCALL GetFullscreen (__RPC__out BOOL * pfFullscreen) = 0; +}; + +JUCE_COMCLASS (IMFGetService, "fa993888-4383-415a-a930-dd472a8cf6f7") : public IUnknown +{ +public: + JUCE_COMCALL GetService (__RPC__in REFGUID guidService, __RPC__in REFIID riid, __RPC__deref_out_opt LPVOID * ppvObject) = 0; +}; + +JUCE_COMCLASS (IMediaControl, "56a868b1-0ad4-11ce-b03a-0020af0ba770") : public IDispatch +{ +public: + JUCE_COMCALL Run() = 0; + JUCE_COMCALL Pause() = 0; + JUCE_COMCALL Stop() = 0; + JUCE_COMCALL GetState (LONG msTimeout, __RPC__out OAFilterState * pfs) = 0; + JUCE_COMCALL RenderFile (__RPC__in BSTR strFilename) = 0; + JUCE_COMCALL AddSourceFilter (__RPC__in BSTR strFilename, __RPC__deref_out_opt IDispatch * *ppUnk) = 0; + JUCE_COMCALL get_FilterCollection (__RPC__deref_out_opt IDispatch * *ppUnk) = 0; + JUCE_COMCALL get_RegFilterCollection (__RPC__deref_out_opt IDispatch * *ppUnk) = 0; + JUCE_COMCALL StopWhenReady() = 0; +}; + +JUCE_COMCLASS (IMediaPosition, "56a868b2-0ad4-11ce-b03a-0020af0ba770") : public IDispatch +{ +public: + JUCE_COMCALL get_Duration (__RPC__out REFTIME * plength) = 0; + JUCE_COMCALL put_CurrentPosition (REFTIME llTime) = 0; + JUCE_COMCALL get_CurrentPosition (__RPC__out REFTIME * pllTime) = 0; + JUCE_COMCALL get_StopTime (__RPC__out REFTIME * pllTime) = 0; + JUCE_COMCALL put_StopTime (REFTIME llTime) = 0; + JUCE_COMCALL get_PrerollTime (__RPC__out REFTIME * pllTime) = 0; + JUCE_COMCALL put_PrerollTime (REFTIME llTime) = 0; + JUCE_COMCALL put_Rate (double dRate) = 0; + JUCE_COMCALL get_Rate (__RPC__out double* pdRate) = 0; + JUCE_COMCALL CanSeekForward (__RPC__out LONG * pCanSeekForward) = 0; + JUCE_COMCALL CanSeekBackward (__RPC__out LONG * pCanSeekBackward) = 0; +}; + +JUCE_COMCLASS (IMediaEvent, "56a868b6-0ad4-11ce-b03a-0020af0ba770") : public IDispatch +{ +public: + JUCE_COMCALL GetEventHandle (__RPC__out OAEVENT * hEvent) = 0; + JUCE_COMCALL GetEvent (__RPC__out long* lEventCode, __RPC__out LONG_PTR* lParam1, __RPC__out LONG_PTR* lParam2, long msTimeout) = 0; + JUCE_COMCALL WaitForCompletion (long msTimeout, __RPC__out long* pEvCode) = 0; + JUCE_COMCALL CancelDefaultHandling (long lEvCode) = 0; + JUCE_COMCALL RestoreDefaultHandling (long lEvCode) = 0; + JUCE_COMCALL FreeEventParams (long lEvCode, LONG_PTR lParam1, LONG_PTR lParam2) = 0; +}; + +JUCE_COMCLASS (IMediaEventEx, "56a868c0-0ad4-11ce-b03a-0020af0ba770") : public IMediaEvent +{ +public: + JUCE_COMCALL SetNotifyWindow (OAHWND hwnd, long lMsg, LONG_PTR lInstanceData) = 0; + JUCE_COMCALL SetNotifyFlags (long lNoNotifyFlags) = 0; + JUCE_COMCALL GetNotifyFlags (__RPC__out long* lplNoNotifyFlags) = 0; +}; + +JUCE_COMCLASS (IBasicAudio, "56a868b3-0ad4-11ce-b03a-0020af0ba770") : public IDispatch +{ +public: + JUCE_COMCALL put_Volume (long lVolume) = 0; + JUCE_COMCALL get_Volume (__RPC__out long* plVolume) = 0; + JUCE_COMCALL put_Balance (long lBalance) = 0; + JUCE_COMCALL get_Balance (__RPC__out long* plBalance) = 0; +}; + +JUCE_COMCLASS (IMediaSample, "56a8689a-0ad4-11ce-b03a-0020af0ba770") : public IUnknown +{ +public: + JUCE_COMCALL GetPointer (BYTE * *ppBuffer) = 0; + virtual long STDMETHODCALLTYPE GetSize() = 0; + JUCE_COMCALL GetTime (_Out_ REFERENCE_TIME * pTimeStart, _Out_ REFERENCE_TIME * pTimeEnd) = 0; + JUCE_COMCALL SetTime (_In_opt_ REFERENCE_TIME * pTimeStart, _In_opt_ REFERENCE_TIME * pTimeEnd) = 0; + JUCE_COMCALL IsSyncPoint() = 0; + JUCE_COMCALL SetSyncPoint (BOOL bIsSyncPoint) = 0; + JUCE_COMCALL IsPreroll() = 0; + JUCE_COMCALL SetPreroll (BOOL bIsPreroll) = 0; + virtual long STDMETHODCALLTYPE GetActualDataLength() = 0; + JUCE_COMCALL SetActualDataLength (long __MIDL__IMediaSample0000) = 0; + JUCE_COMCALL GetMediaType (_Out_ AM_MEDIA_TYPE * *ppMediaType) = 0; + JUCE_COMCALL SetMediaType (_In_ AM_MEDIA_TYPE * pMediaType) = 0; + JUCE_COMCALL IsDiscontinuity() = 0; + JUCE_COMCALL SetDiscontinuity (BOOL bDiscontinuity) = 0; + JUCE_COMCALL GetMediaTime (_Out_ LONGLONG * pTimeStart, _Out_ LONGLONG * pTimeEnd) = 0; + JUCE_COMCALL SetMediaTime (_In_opt_ LONGLONG * pTimeStart, _In_opt_ LONGLONG * pTimeEnd) = 0; +}; + +JUCE_COMCLASS (IFileSinkFilter, "a2104830-7c70-11cf-8bce-00aa00a3f1a6") : public IUnknown +{ +public: + JUCE_COMCALL SetFileName (LPCOLESTR pszFileName, _In_opt_ const AM_MEDIA_TYPE* pmt) = 0; + JUCE_COMCALL GetCurFile (_Out_ LPOLESTR * ppszFileName, _Out_ AM_MEDIA_TYPE * pmt) = 0; +}; + +JUCE_COMCLASS (ICaptureGraphBuilder2, "93E5A4E0-2D50-11d2-ABFA-00A0C9C6E38D") : public IUnknown +{ +public: + JUCE_COMCALL SetFiltergraph (IGraphBuilder * pfg) = 0; + JUCE_COMCALL GetFiltergraph (_Out_ IGraphBuilder * *ppfg) = 0; + JUCE_COMCALL SetOutputFileName (const GUID* pType, LPCOLESTR lpstrFile, _Outptr_ IBaseFilter** ppf, _Outptr_opt_ IFileSinkFilter** ppSink) = 0; + JUCE_COMCALL FindInterface (_In_opt_ const GUID* pCategory, _In_opt_ const GUID* pType, IBaseFilter* pf, REFIID riid, _Out_ void** ppint) = 0; + JUCE_COMCALL RenderStream (_In_opt_ const GUID* pCategory, const GUID* pType, IUnknown* pSource, IBaseFilter* pfCompressor, IBaseFilter* pfRenderer) = 0; + JUCE_COMCALL ControlStream (const GUID* pCategory, const GUID* pType, IBaseFilter* pFilter, _In_opt_ REFERENCE_TIME* pstart, _In_opt_ REFERENCE_TIME* pstop, WORD wStartCookie, WORD wStopCookie) = 0; + JUCE_COMCALL AllocCapFile (LPCOLESTR lpstr, DWORDLONG dwlSize) = 0; + JUCE_COMCALL CopyCaptureFile (_In_ LPOLESTR lpwstrOld, _In_ LPOLESTR lpwstrNew, int fAllowEscAbort, IAMCopyCaptureFileProgress* pCallback) = 0; + JUCE_COMCALL FindPin (IUnknown * pSource, PIN_DIRECTION pindir, _In_opt_ const GUID* pCategory, _In_opt_ const GUID* pType, BOOL fUnconnected, int num, _Out_ IPin** ppPin) = 0; +}; + +JUCE_COMCLASS (IAMStreamConfig, "C6E13340-30AC-11d0-A18C-00A0C9118956") : public IUnknown +{ +public: + JUCE_COMCALL SetFormat (AM_MEDIA_TYPE * pmt) = 0; + JUCE_COMCALL GetFormat (_Out_ AM_MEDIA_TYPE * *ppmt) = 0; + JUCE_COMCALL GetNumberOfCapabilities (_Out_ int* piCount, _Out_ int* piSize) = 0; + JUCE_COMCALL GetStreamCaps (int iIndex, _Out_ AM_MEDIA_TYPE** ppmt, _Out_ BYTE* pSCC) = 0; +}; + +JUCE_COMCLASS (ISampleGrabberCB, "0579154A-2B53-4994-B0D0-E773148EFF85") : public IUnknown +{ + JUCE_COMCALL SampleCB (double, ComTypes::IMediaSample*) = 0; + JUCE_COMCALL BufferCB (double, BYTE*, long) = 0; +}; + +JUCE_COMCLASS (ISampleGrabber, "6B652FFF-11FE-4fce-92AD-0266B5D7C78F") : public IUnknown +{ + JUCE_COMCALL SetOneShot (BOOL) = 0; + JUCE_COMCALL SetMediaType (const ComTypes::AM_MEDIA_TYPE*) = 0; + JUCE_COMCALL GetConnectedMediaType (ComTypes::AM_MEDIA_TYPE*) = 0; + JUCE_COMCALL SetBufferSamples (BOOL) = 0; + JUCE_COMCALL GetCurrentBuffer (long*, long*) = 0; + JUCE_COMCALL GetCurrentSample (ComTypes::IMediaSample**) = 0; + JUCE_COMCALL SetCallback (ISampleGrabberCB*, long) = 0; +}; + +JUCE_COMCLASS (IAMLatency, "62EA93BA-EC62-11d2-B770-00C04FB6BD3D") : public IUnknown +{ +public: + JUCE_COMCALL GetLatency (_Out_ REFERENCE_TIME * prtLatency) = 0; +}; + +JUCE_COMCLASS (IAMPushSource, "F185FE76-E64E-11d2-B76E-00C04FB6BD3D") : public IAMLatency +{ +public: + JUCE_COMCALL GetPushSourceFlags (_Out_ ULONG * pFlags) = 0; + JUCE_COMCALL SetPushSourceFlags (ULONG Flags) = 0; + JUCE_COMCALL SetStreamOffset (REFERENCE_TIME rtOffset) = 0; + JUCE_COMCALL GetStreamOffset (_Out_ REFERENCE_TIME * prtOffset) = 0; + JUCE_COMCALL GetMaxStreamOffset (_Out_ REFERENCE_TIME * prtMaxOffset) = 0; + JUCE_COMCALL SetMaxStreamOffset (REFERENCE_TIME rtMaxOffset) = 0; +}; + +JUCE_COMCLASS (IConfigAsfWriter, "45086030-F7E4-486a-B504-826BB5792A3B") : public IUnknown +{ +public: + JUCE_COMCALL ConfigureFilterUsingProfileId (DWORD dwProfileId) = 0; + JUCE_COMCALL GetCurrentProfileId (__RPC__out DWORD * pdwProfileId) = 0; + JUCE_COMCALL ConfigureFilterUsingProfileGuid (__RPC__in REFGUID guidProfile) = 0; + JUCE_COMCALL GetCurrentProfileGuid (__RPC__out GUID * pProfileGuid) = 0; + JUCE_COMCALL ConfigureFilterUsingProfile (__RPC__in_opt IWMProfile * pProfile) = 0; + JUCE_COMCALL GetCurrentProfile (__RPC__deref_out_opt IWMProfile * *ppProfile) = 0; + JUCE_COMCALL SetIndexMode (BOOL bIndexFile) = 0; + JUCE_COMCALL GetIndexMode (__RPC__out BOOL * pbIndexFile) = 0; +}; + +constexpr CLSID CLSID_CaptureGraphBuilder2 = { 0xBF87B6E1, 0x8C27, 0x11d0, { 0xB3, 0xF0, 0x00, 0xAA, 0x00, 0x37, 0x61, 0xC5 } }; +constexpr CLSID CLSID_EnhancedVideoRenderer = { 0xfa10746c, 0x9b63, 0x4b6c, { 0xbc, 0x49, 0xfc, 0x30, 0x0e, 0xa5, 0xf2, 0x56 } }; +constexpr CLSID CLSID_FilterGraph = { 0xe436ebb3, 0x524f, 0x11ce, { 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 } }; +constexpr CLSID CLSID_NullRenderer = { 0xC1F400A4, 0x3F08, 0x11d3, { 0x9F, 0x0B, 0x00, 0x60, 0x08, 0x03, 0x9E, 0x37 } }; +constexpr CLSID CLSID_SampleGrabber = { 0xC1F400A0, 0x3F08, 0x11d3, { 0x9F, 0x0B, 0x00, 0x60, 0x08, 0x03, 0x9E, 0x37 } }; +constexpr CLSID CLSID_SmartTee = { 0xcc58e280, 0x8aa1, 0x11d1, { 0xb3, 0xf1, 0x00, 0xaa, 0x00, 0x37, 0x61, 0xc5 } }; +constexpr CLSID CLSID_SystemDeviceEnum = { 0x62BE5D10, 0x60EB, 0x11d0, { 0xBD, 0x3B, 0x00, 0xA0, 0xC9, 0x11, 0xCE, 0x86 } }; +constexpr CLSID CLSID_VideoInputDeviceCategory = { 0x860BB310, 0x5D01, 0x11d0, { 0xBD, 0x3B, 0x00, 0xA0, 0xC9, 0x11, 0xCE, 0x86 } }; +constexpr CLSID CLSID_VideoMixingRenderer = { 0xb87beb7b, 0x8d29, 0x423F, { 0xae, 0x4d, 0x65, 0x82, 0xc1, 0x01, 0x75, 0xac } }; +constexpr CLSID CLSID_WMAsfWriter = { 0x7c23220e, 0x55bb, 0x11d3, { 0x8b, 0x16, 0x00, 0xc0, 0x4f, 0xb6, 0xbd, 0x3d } }; +constexpr CLSID FORMAT_VideoInfo = { 0x05589f80, 0xc356, 0x11ce, { 0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a } }; +constexpr CLSID MEDIASUBTYPE_RGB24 = { 0xe436eb7d, 0x524f, 0x11ce, { 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 } }; +constexpr CLSID MEDIATYPE_Video = { 0x73646976, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } }; +constexpr CLSID MR_VIDEO_RENDER_SERVICE = { 0x1092a86c, 0xab1a, 0x459a, { 0xa3, 0x36, 0x83, 0x1f, 0xbc, 0x4d, 0x11, 0xff } }; +constexpr CLSID PIN_CATEGORY_CAPTURE = { 0xfb6c4281, 0x0353, 0x11d1, { 0x90, 0x5f, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba } }; + +} // namespace ComTypes +} // namespace juce + +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL (juce::ComTypes::IAMPushSource, 0xF185FE76, 0xE64E, 0x11d2, 0xB7, 0x6E, 0x00, 0xC0, 0x4F, 0xB6, 0xBD, 0x3D) +__CRT_UUID_DECL (juce::ComTypes::IAMStreamConfig, 0xC6E13340, 0x30AC, 0x11d0, 0xA1, 0x8C, 0x00, 0xA0, 0xC9, 0x11, 0x89, 0x56) +__CRT_UUID_DECL (juce::ComTypes::IBaseFilter, 0x56a86895, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) +__CRT_UUID_DECL (juce::ComTypes::IBasicAudio, 0x56a868b3, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) +__CRT_UUID_DECL (juce::ComTypes::ICaptureGraphBuilder2, 0x93E5A4E0, 0x2D50, 0x11d2, 0xAB, 0xFA, 0x00, 0xA0, 0xC9, 0xC6, 0xE3, 0x8D) +__CRT_UUID_DECL (juce::ComTypes::IConfigAsfWriter, 0x45086030, 0xF7E4, 0x486a, 0xB5, 0x04, 0x82, 0x6B, 0xB5, 0x79, 0x2A, 0x3B) +__CRT_UUID_DECL (juce::ComTypes::ICreateDevEnum, 0x29840822, 0x5B84, 0x11D0, 0xBD, 0x3B, 0x00, 0xA0, 0xC9, 0x11, 0xCE, 0x86) +__CRT_UUID_DECL (juce::ComTypes::IFileSinkFilter, 0xa2104830, 0x7c70, 0x11cf, 0x8b, 0xce, 0x00, 0xaa, 0x00, 0xa3, 0xf1, 0xa6) +__CRT_UUID_DECL (juce::ComTypes::IGraphBuilder, 0x56a868a9, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) +__CRT_UUID_DECL (juce::ComTypes::IMFGetService, 0xfa993888, 0x4383, 0x415a, 0xa9, 0x30, 0xdd, 0x47, 0x2a, 0x8c, 0xf6, 0xf7) +__CRT_UUID_DECL (juce::ComTypes::IMFVideoDisplayControl, 0xa490b1e4, 0xab84, 0x4d31, 0xa1, 0xb2, 0x18, 0x1e, 0x03, 0xb1, 0x07, 0x7a) +__CRT_UUID_DECL (juce::ComTypes::IMediaControl, 0x56a868b1, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) +__CRT_UUID_DECL (juce::ComTypes::IMediaEventEx, 0x56a868c0, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) +__CRT_UUID_DECL (juce::ComTypes::IMediaPosition, 0x56a868b2, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) +__CRT_UUID_DECL (juce::ComTypes::ISampleGrabber, 0x6B652FFF, 0x11FE, 0x4fce, 0x92, 0xAD, 0x02, 0x66, 0xB5, 0xD7, 0xC7, 0x8F) +__CRT_UUID_DECL (juce::ComTypes::ISampleGrabberCB, 0x0579154A, 0x2B53, 0x4994, 0xB0, 0xD0, 0xE7, 0x73, 0x14, 0x8E, 0xFF, 0x85) +__CRT_UUID_DECL (juce::ComTypes::IVMRFilterConfig, 0x9e5530c5, 0x7034, 0x48b4, 0xbb, 0x46, 0x0b, 0x8a, 0x6e, 0xfc, 0x8e, 0x36) +__CRT_UUID_DECL (juce::ComTypes::IVMRWindowlessControl, 0x0eb1088c, 0x4dcd, 0x46f0, 0x87, 0x8f, 0x39, 0xda, 0xe8, 0x6a, 0x51, 0xb7) +#endif diff --git a/modules/juce_video/native/juce_win32_Video.h b/modules/juce_video/native/juce_win32_Video.h index 36d474f4a3..da3f835bdd 100644 --- a/modules/juce_video/native/juce_win32_Video.h +++ b/modules/juce_video/native/juce_win32_Video.h @@ -28,9 +28,9 @@ namespace VideoRenderers //============================================================================== struct Base { - virtual ~Base() {} + virtual ~Base() = default; - virtual HRESULT create (ComSmartPtr&, ComSmartPtr&, HWND) = 0; + virtual HRESULT create (ComSmartPtr&, ComSmartPtr&, HWND) = 0; virtual void setVideoWindow (HWND) = 0; virtual void setVideoPosition (HWND) = 0; virtual void repaintVideo (HWND, HDC) = 0; @@ -43,19 +43,19 @@ namespace VideoRenderers { VMR7() {} - HRESULT create (ComSmartPtr& graphBuilder, - ComSmartPtr& baseFilter, HWND hwnd) override + HRESULT create (ComSmartPtr& graphBuilder, + ComSmartPtr& baseFilter, HWND hwnd) override { - ComSmartPtr filterConfig; + ComSmartPtr filterConfig; - HRESULT hr = baseFilter.CoCreateInstance (CLSID_VideoMixingRenderer); + HRESULT hr = baseFilter.CoCreateInstance (ComTypes::CLSID_VideoMixingRenderer); if (SUCCEEDED (hr)) hr = graphBuilder->AddFilter (baseFilter, L"VMR-7"); if (SUCCEEDED (hr)) hr = baseFilter.QueryInterface (filterConfig); - if (SUCCEEDED (hr)) hr = filterConfig->SetRenderingMode (VMRMode_Windowless); + if (SUCCEEDED (hr)) hr = filterConfig->SetRenderingMode (ComTypes::VMRMode_Windowless); if (SUCCEEDED (hr)) hr = baseFilter.QueryInterface (windowlessControl); if (SUCCEEDED (hr)) hr = windowlessControl->SetVideoClippingWindow (hwnd); - if (SUCCEEDED (hr)) hr = windowlessControl->SetAspectRatioMode (VMR_ARMODE_LETTER_BOX); + if (SUCCEEDED (hr)) hr = windowlessControl->SetAspectRatioMode (ComTypes::VMR_ARMODE_LETTER_BOX); return hr; } @@ -92,7 +92,7 @@ namespace VideoRenderers return windowlessControl->GetNativeVideoSize (&videoWidth, &videoHeight, nullptr, nullptr); } - ComSmartPtr windowlessControl; + ComSmartPtr windowlessControl; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VMR7) }; @@ -101,21 +101,23 @@ namespace VideoRenderers //============================================================================== struct EVR : public Base { - EVR() {} + EVR() = default; - HRESULT create (ComSmartPtr& graphBuilder, - ComSmartPtr& baseFilter, HWND hwnd) override + HRESULT create (ComSmartPtr& graphBuilder, + ComSmartPtr& baseFilter, HWND hwnd) override { - ComSmartPtr getService; + ComSmartPtr getService; - HRESULT hr = baseFilter.CoCreateInstance (CLSID_EnhancedVideoRenderer); + HRESULT hr = baseFilter.CoCreateInstance (ComTypes::CLSID_EnhancedVideoRenderer); if (SUCCEEDED (hr)) hr = graphBuilder->AddFilter (baseFilter, L"EVR"); if (SUCCEEDED (hr)) hr = baseFilter.QueryInterface (getService); - if (SUCCEEDED (hr)) hr = getService->GetService (MR_VIDEO_RENDER_SERVICE, IID_IMFVideoDisplayControl, + JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token") + if (SUCCEEDED (hr)) hr = getService->GetService (ComTypes::MR_VIDEO_RENDER_SERVICE, __uuidof (ComTypes::IMFVideoDisplayControl), (void**) videoDisplayControl.resetAndGetPointerAddress()); + JUCE_END_IGNORE_WARNINGS_GCC_LIKE if (SUCCEEDED (hr)) hr = videoDisplayControl->SetVideoWindow (hwnd); - if (SUCCEEDED (hr)) hr = videoDisplayControl->SetAspectRatioMode (MFVideoARMode_PreservePicture); + if (SUCCEEDED (hr)) hr = videoDisplayControl->SetAspectRatioMode (ComTypes::MFVideoARMode_PreservePicture); return hr; } @@ -127,7 +129,7 @@ namespace VideoRenderers void setVideoPosition (HWND hwnd) override { - const MFVideoNormalizedRect src = { 0.0f, 0.0f, 1.0f, 1.0f }; + const ComTypes::MFVideoNormalizedRect src { 0.0f, 0.0f, 1.0f, 1.0f }; RECT dest; GetClientRect (hwnd, &dest); @@ -151,7 +153,7 @@ namespace VideoRenderers return hr; } - ComSmartPtr videoDisplayControl; + ComSmartPtr videoDisplayControl; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EVR) }; @@ -358,6 +360,7 @@ private: { } + using ComponentMovementWatcher::componentMovedOrResized; void componentMovedOrResized (bool, bool) override { if (owner.videoLoaded) @@ -373,6 +376,7 @@ private: owner.recreateNativeWindowAsync(); } + using ComponentMovementWatcher::componentVisibilityChanged; void componentVisibilityChanged() override { if (owner.videoLoaded) @@ -442,8 +446,8 @@ private: createNativeWindow(); - mediaEvent->CancelDefaultHandling (EC_STATE_CHANGE); - mediaEvent->SetNotifyWindow ((OAHWND) hwnd, graphEventID, 0); + mediaEvent->CancelDefaultHandling (ComTypes::EC_STATE_CHANGE); + mediaEvent->SetNotifyWindow ((ComTypes::OAHWND) hwnd, graphEventID, 0); if (videoRenderer != nullptr) videoRenderer->setVideoWindow (hwnd); @@ -493,7 +497,7 @@ private: if (! createNativeWindow()) return Result::fail ("Can't create window"); - HRESULT hr = graphBuilder.CoCreateInstance (CLSID_FilterGraph); + HRESULT hr = graphBuilder.CoCreateInstance (ComTypes::CLSID_FilterGraph); // basic playback interfaces if (SUCCEEDED (hr)) hr = graphBuilder.QueryInterface (mediaControl); @@ -555,8 +559,8 @@ private: // set window to receive events if (SUCCEEDED (hr)) { - mediaEvent->CancelDefaultHandling (EC_STATE_CHANGE); - hr = mediaEvent->SetNotifyWindow ((OAHWND) hwnd, graphEventID, 0); + mediaEvent->CancelDefaultHandling (ComTypes::EC_STATE_CHANGE); + hr = mediaEvent->SetNotifyWindow ((ComTypes::OAHWND) hwnd, graphEventID, 0); } if (SUCCEEDED (hr)) @@ -577,18 +581,18 @@ private: { switch (hr) { - case VFW_E_INVALID_FILE_FORMAT: return Result::fail ("Invalid file format"); - case VFW_E_NOT_FOUND: return Result::fail ("File not found"); - case VFW_E_UNKNOWN_FILE_TYPE: return Result::fail ("Unknown file type"); - case VFW_E_UNSUPPORTED_STREAM: return Result::fail ("Unsupported stream"); - case VFW_E_CANNOT_CONNECT: return Result::fail ("Cannot connect"); - case VFW_E_CANNOT_LOAD_SOURCE_FILTER: return Result::fail ("Cannot load source filter"); + case ComTypes::VFW_E_INVALID_FILE_FORMAT: return Result::fail ("Invalid file format"); + case ComTypes::VFW_E_NOT_FOUND: return Result::fail ("File not found"); + case ComTypes::VFW_E_UNKNOWN_FILE_TYPE: return Result::fail ("Unknown file type"); + case ComTypes::VFW_E_UNSUPPORTED_STREAM: return Result::fail ("Unsupported stream"); + case ComTypes::VFW_E_CANNOT_CONNECT: return Result::fail ("Cannot connect"); + case ComTypes::VFW_E_CANNOT_LOAD_SOURCE_FILTER: return Result::fail ("Cannot load source filter"); } TCHAR messageBuffer[512] = { 0 }; FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - nullptr, hr, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), + nullptr, (DWORD) hr, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), messageBuffer, (DWORD) numElementsInArray (messageBuffer) - 1, nullptr); return Result::fail (String (messageBuffer)); @@ -633,28 +637,28 @@ private: switch (ec) { - case EC_REPAINT: + case ComTypes::EC_REPAINT: component.repaint(); break; - case EC_COMPLETE: + case ComTypes::EC_COMPLETE: component.stop(); component.setPosition (0.0); break; - case EC_ERRORABORT: - case EC_ERRORABORTEX: + case ComTypes::EC_ERRORABORT: + case ComTypes::EC_ERRORABORTEX: component.errorOccurred (getErrorMessageFromResult ((HRESULT) p1).getErrorMessage()); // intentional fallthrough - case EC_USERABORT: + case ComTypes::EC_USERABORT: component.close(); break; - case EC_STATE_CHANGE: + case ComTypes::EC_STATE_CHANGE: switch (p1) { - case State_Paused: component.playbackStopped(); break; - case State_Running: component.playbackStarted(); break; + case ComTypes::State_Paused: component.playbackStopped(); break; + case ComTypes::State_Running: component.playbackStarted(); break; default: break; } @@ -697,7 +701,7 @@ private: //============================================================================== double getDuration() const { - REFTIME duration; + ComTypes::REFTIME duration; mediaPosition->get_Duration (&duration); return duration; } @@ -711,7 +715,7 @@ private: double getPosition() const { - REFTIME seconds; + ComTypes::REFTIME seconds; mediaPosition->get_CurrentPosition (&seconds); return seconds; } @@ -747,12 +751,12 @@ private: HWND hwnd = {}; HDC hdc = {}; - ComSmartPtr graphBuilder; - ComSmartPtr mediaControl; - ComSmartPtr mediaPosition; - ComSmartPtr mediaEvent; - ComSmartPtr basicAudio; - ComSmartPtr baseFilter; + ComSmartPtr graphBuilder; + ComSmartPtr mediaControl; + ComSmartPtr mediaPosition; + ComSmartPtr mediaEvent; + ComSmartPtr basicAudio; + ComSmartPtr baseFilter; std::unique_ptr videoRenderer; @@ -800,31 +804,31 @@ private: bool isRendererConnected() { - ComSmartPtr enumPins; + ComSmartPtr enumPins; HRESULT hr = baseFilter->EnumPins (enumPins.resetAndGetPointerAddress()); if (SUCCEEDED (hr)) hr = enumPins->Reset(); - ComSmartPtr pin; + ComSmartPtr pin; while (SUCCEEDED (hr) && enumPins->Next (1, pin.resetAndGetPointerAddress(), nullptr) == S_OK) { - ComSmartPtr otherPin; + ComSmartPtr otherPin; hr = pin->ConnectedTo (otherPin.resetAndGetPointerAddress()); if (SUCCEEDED (hr)) { - PIN_DIRECTION direction; + ComTypes::PIN_DIRECTION direction; hr = pin->QueryDirection (&direction); - if (SUCCEEDED (hr) && direction == PINDIR_INPUT) + if (SUCCEEDED (hr) && direction == ComTypes::PINDIR_INPUT) return true; } - else if (hr == VFW_E_NOT_CONNECTED) + else if (hr == ComTypes::VFW_E_NOT_CONNECTED) { hr = S_OK; }