diff options
author | Andre de la Rocha <andre.rocha@qt.io> | 2018-02-27 19:59:54 +0100 |
---|---|---|
committer | Andre de la Rocha <andre.rocha@qt.io> | 2018-04-17 17:36:48 +0000 |
commit | 436faee8b3704f9aae5620bc69f14c3461fc208c (patch) | |
tree | 12481600628f9ad052f039beab0b0b76d7679d8d /src/corelib/kernel/qeventdispatcher_winrt.cpp | |
parent | c555c8b9f5c5bb1f390d94cf43d249e74ecb86f6 (diff) |
WinRT: Add Windows UI Automation support
Adds support to accessibility tools and programmatic UI control to the
WinRT platform through Windows UI Automation, using the AutomationPeer API.
[ChangeLog][winrt][feature] Added support to Windows UI Automation to the
WinRT QPA, allowing Qt-based UWP applications to operate with accessibility
and programmatic UI control tools.
Change-Id: If0a8edbebc7c16c4896d749f2d7e11809b4b37b3
Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
Diffstat (limited to 'src/corelib/kernel/qeventdispatcher_winrt.cpp')
-rw-r--r-- | src/corelib/kernel/qeventdispatcher_winrt.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/corelib/kernel/qeventdispatcher_winrt.cpp b/src/corelib/kernel/qeventdispatcher_winrt.cpp index 33753ed507..600c6c38fd 100644 --- a/src/corelib/kernel/qeventdispatcher_winrt.cpp +++ b/src/corelib/kernel/qeventdispatcher_winrt.cpp @@ -43,6 +43,8 @@ #include <QtCore/QThread> #include <QtCore/QHash> #include <QtCore/QMutex> +#include <QtCore/QSemaphore> +#include <QtCore/QSharedPointer> #include <QtCore/qfunctions_winrt.h> #include <private/qabstracteventdispatcher_p.h> #include <private/qcoreapplication_p.h> @@ -293,6 +295,26 @@ HRESULT QEventDispatcherWinRT::runOnXamlThread(const std::function<HRESULT ()> & return QWinRTFunctions::await(op); } +HRESULT QEventDispatcherWinRT::runOnMainThread(const std::function<HRESULT()> &delegate, int timeout) +{ + if (QThread::currentThread() == QCoreApplication::instance()->thread()) + return delegate(); + + auto semaphore = QSharedPointer<QSemaphore>(new QSemaphore); + auto ptrSemaphore = new QSharedPointer<QSemaphore>(semaphore); + auto result = QSharedPointer<HRESULT>(new HRESULT); + auto ptrResult = new QSharedPointer<HRESULT>(result); + + QMetaObject::invokeMethod(QCoreApplication::instance(), [delegate, ptrSemaphore, ptrResult]() { + **ptrResult = delegate(); + delete ptrResult; + (*ptrSemaphore)->release(); + delete ptrSemaphore; + }, nullptr); + + return semaphore->tryAcquire(1, timeout) ? *result : E_FAIL; +} + bool QEventDispatcherWinRT::processEvents(QEventLoop::ProcessEventsFlags flags) { Q_D(QEventDispatcherWinRT); |