| @@ -657,6 +657,157 @@ private: | |||
| juce_ImplementSingleton_SingleThreaded (OnScreenKeyboard) | |||
| //============================================================================== | |||
| class UWPUIViewSettings | |||
| { | |||
| public: | |||
| UWPUIViewSettings() | |||
| { | |||
| ComBaseModule dll (L"api-ms-win-core-winrt-l1-1-0"); | |||
| if (dll.h != nullptr) | |||
| { | |||
| roInitialize = (RoInitializeFuncPtr) ::GetProcAddress (dll.h, "RoInitialize"); | |||
| roGetActivationFactory = (RoGetActivationFactoryFuncPtr) ::GetProcAddress (dll.h, "RoGetActivationFactory"); | |||
| createHString = (WindowsCreateStringFuncPtr) ::GetProcAddress (dll.h, "WindowsCreateString"); | |||
| deleteHString = (WindowsDeleteStringFuncPtr) ::GetProcAddress (dll.h, "WindowsDeleteString"); | |||
| if (roInitialize == nullptr || roGetActivationFactory == nullptr | |||
| || createHString == nullptr || deleteHString == nullptr) | |||
| return; | |||
| ::HRESULT status = roInitialize (1); | |||
| if (status != S_OK && status != S_FALSE && status != 0x80010106L) | |||
| return; | |||
| LPCWSTR uwpClassName = L"Windows.UI.ViewManagement.UIViewSettings"; | |||
| HSTRING uwpClassId; | |||
| if (createHString (uwpClassName, (::UINT32) wcslen (uwpClassName), &uwpClassId) != S_OK | |||
| || uwpClassId == nullptr) | |||
| return; | |||
| status = roGetActivationFactory (uwpClassId, __uuidof (IUIViewSettingsInterop), (void**) viewSettingsInterop.resetAndGetPointerAddress()); | |||
| deleteHString (uwpClassId); | |||
| if (status != S_OK || viewSettingsInterop == nullptr) | |||
| return; | |||
| // move dll into member var | |||
| comBaseDLL = static_cast<ComBaseModule&&> (dll); | |||
| } | |||
| } | |||
| bool isTabletModeActivatedForWindow (::HWND hWnd) const | |||
| { | |||
| if (viewSettingsInterop == nullptr) | |||
| return false; | |||
| ComSmartPtr<IUIViewSettings> viewSettings; | |||
| if (viewSettingsInterop->GetForWindow(hWnd, __uuidof (IUIViewSettings), (void**) viewSettings.resetAndGetPointerAddress()) == S_OK | |||
| && viewSettings != nullptr) | |||
| { | |||
| IUIViewSettings::UserInteractionMode mode; | |||
| if (viewSettings->GetUserInteractionMode (&mode) == S_OK) | |||
| return (mode == IUIViewSettings::Touch); | |||
| } | |||
| return false; | |||
| } | |||
| private: | |||
| struct HSTRING_PRIVATE; | |||
| typedef HSTRING_PRIVATE* HSTRING; | |||
| //============================================================================== | |||
| class IInspectable : public IUnknown | |||
| { | |||
| public: | |||
| virtual ::HRESULT STDMETHODCALLTYPE GetIids (ULONG* ,IID**) = 0; | |||
| virtual ::HRESULT STDMETHODCALLTYPE GetRuntimeClassName(HSTRING*) = 0; | |||
| virtual ::HRESULT STDMETHODCALLTYPE GetTrustLevel(void*) = 0; | |||
| }; | |||
| //============================================================================== | |||
| class | |||
| #if (! JUCE_MINGW) | |||
| __declspec (uuid ("3694dbf9-8f68-44be-8ff5-195c98ede8a6")) | |||
| #endif | |||
| IUIViewSettingsInterop : public IInspectable | |||
| { | |||
| public: | |||
| virtual HRESULT STDMETHODCALLTYPE GetForWindow(HWND hwnd, REFIID riid, void **ppv) = 0; | |||
| }; | |||
| #if JUCE_MINGW || (! (defined (_MSC_VER) || defined (__uuidof))) | |||
| template <> | |||
| struct UUIDGetter<IUIViewSettingsInterop> | |||
| { | |||
| static CLSID get() | |||
| { | |||
| GUID g = {0x3694dbf9, 0x8f68, 0x44be, {0x8f, 0xf5, 0x19, 0x5c, 0x98, 0xed, 0xe8, 0xa6}}; | |||
| return g; | |||
| } | |||
| }; | |||
| #endif | |||
| //============================================================================== | |||
| class | |||
| #if (! JUCE_MINGW) | |||
| __declspec (uuid ("C63657F6-8850-470D-88F8-455E16EA2C26")) | |||
| #endif | |||
| IUIViewSettings : public IInspectable | |||
| { | |||
| public: | |||
| enum UserInteractionMode | |||
| { | |||
| Mouse = 0, | |||
| Touch = 1 | |||
| }; | |||
| virtual HRESULT STDMETHODCALLTYPE GetUserInteractionMode (UserInteractionMode *value) = 0; | |||
| }; | |||
| #if JUCE_MINGW || (! (defined (_MSC_VER) || defined (__uuidof))) | |||
| template <> | |||
| struct UUIDGetter<IUIViewSettings> | |||
| { | |||
| static CLSID get() | |||
| { | |||
| GUID g = {0xC63657F6, 0x8850, 0x470D, {0x88, 0xf8, 0x45, 0x5e, 0x16, 0xea, 0x2c, 0x26}}; | |||
| return g; | |||
| } | |||
| }; | |||
| #endif | |||
| //============================================================================== | |||
| struct ComBaseModule | |||
| { | |||
| ::HMODULE h; | |||
| ComBaseModule() : h (nullptr) {} | |||
| ComBaseModule(LPCWSTR libraryName) : h (::LoadLibrary (libraryName)) {} | |||
| ComBaseModule(ComBaseModule&& o) : h (o.h) { o.h = nullptr; } | |||
| ~ComBaseModule() { if (h != nullptr) ::FreeLibrary (h); h = nullptr; } | |||
| ComBaseModule& operator=(ComBaseModule&& o) { h = o.h; o.h = nullptr; return *this; } | |||
| }; | |||
| typedef HRESULT (WINAPI* RoInitializeFuncPtr) (int); | |||
| typedef HRESULT (WINAPI* RoGetActivationFactoryFuncPtr) (HSTRING, REFIID, void**); | |||
| typedef HRESULT (WINAPI* WindowsCreateStringFuncPtr) (LPCWSTR,UINT32, HSTRING*); | |||
| typedef HRESULT (WINAPI* WindowsDeleteStringFuncPtr) (HSTRING); | |||
| ComBaseModule comBaseDLL; | |||
| ComSmartPtr<IUIViewSettingsInterop> viewSettingsInterop; | |||
| RoInitializeFuncPtr roInitialize; | |||
| RoGetActivationFactoryFuncPtr roGetActivationFactory; | |||
| WindowsCreateStringFuncPtr createHString; | |||
| WindowsDeleteStringFuncPtr deleteHString; | |||
| }; | |||
| //============================================================================== | |||
| class HWNDComponentPeer : public ComponentPeer, | |||
| private Timer | |||
| @@ -704,6 +855,9 @@ public: | |||
| if (shadower != nullptr) | |||
| shadower->setOwner (&component); | |||
| } | |||
| // make sure that the on-screen keyboard code is loaded | |||
| OnScreenKeyboard::getInstance(); | |||
| } | |||
| ~HWNDComponentPeer() | |||
| @@ -1019,13 +1173,16 @@ public: | |||
| ShowCaret (hwnd); | |||
| SetCaretPos (0, 0); | |||
| OnScreenKeyboard::getInstance()->activate(); | |||
| if (uwpViewSettings.isTabletModeActivatedForWindow (hwnd)) | |||
| OnScreenKeyboard::getInstance()->activate(); | |||
| } | |||
| void dismissPendingTextInput() override | |||
| { | |||
| imeHandler.handleSetContext (hwnd, false); | |||
| OnScreenKeyboard::getInstance()->deactivate(); | |||
| if (uwpViewSettings.isTabletModeActivatedForWindow (hwnd)) | |||
| OnScreenKeyboard::getInstance()->deactivate(); | |||
| } | |||
| void repaint (const Rectangle<int>& area) override | |||
| @@ -1283,6 +1440,7 @@ private: | |||
| HICON currentWindowIcon; | |||
| JuceDropTarget* dropTarget; | |||
| uint8 updateLayeredWindowAlpha; | |||
| UWPUIViewSettings uwpViewSettings; | |||
| MultiTouchMapper<DWORD> currentTouches; | |||
| #if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client | |||
| ModifierKeyProvider* modProvider; | |||