winrt: Fix dnd with non mouse input device
When using anything but the mouse, there is no release event sent. Instead one needs to subscribe to the ICorePointerRedirector. Task-number: QTBUG-58781 Change-Id: I664ba24bd89ea9f513f8f11b385e2f06ece42fd0 Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
This commit is contained in:
parent
df43ef7b6d
commit
995719cebd
@ -91,6 +91,7 @@ typedef ITypedEventHandler<CoreWindow*, PointerEventArgs*> PointerHandler;
|
||||
typedef ITypedEventHandler<CoreWindow*, WindowSizeChangedEventArgs*> SizeChangedHandler;
|
||||
typedef ITypedEventHandler<CoreWindow*, VisibilityChangedEventArgs*> VisibilityChangedHandler;
|
||||
typedef ITypedEventHandler<DisplayInformation*, IInspectable*> DisplayInformationHandler;
|
||||
typedef ITypedEventHandler<ICorePointerRedirector*, PointerEventArgs*> RedirectHandler;
|
||||
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)
|
||||
typedef ITypedEventHandler<ApplicationView*, IInspectable*> VisibleBoundsChangedHandler;
|
||||
#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)
|
||||
@ -454,6 +455,8 @@ typedef HRESULT (__stdcall ICoreWindow::*CoreWindowCallbackRemover)(EventRegistr
|
||||
uint qHash(CoreWindowCallbackRemover key) { void *ptr = *(void **)(&key); return qHash(ptr); }
|
||||
typedef HRESULT (__stdcall IDisplayInformation::*DisplayCallbackRemover)(EventRegistrationToken);
|
||||
uint qHash(DisplayCallbackRemover key) { void *ptr = *(void **)(&key); return qHash(ptr); }
|
||||
typedef HRESULT (__stdcall ICorePointerRedirector::*RedirectorCallbackRemover)(EventRegistrationToken);
|
||||
uint qHash(RedirectorCallbackRemover key) { void *ptr = *(void **)(&key); return qHash(ptr); }
|
||||
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)
|
||||
typedef HRESULT (__stdcall IApplicationView2::*ApplicationView2CallbackRemover)(EventRegistrationToken);
|
||||
uint qHash(ApplicationView2CallbackRemover key) { void *ptr = *(void **)(&key); return qHash(ptr); }
|
||||
@ -464,6 +467,7 @@ class QWinRTScreenPrivate
|
||||
public:
|
||||
QTouchDevice *touchDevice;
|
||||
ComPtr<ICoreWindow> coreWindow;
|
||||
ComPtr<ICorePointerRedirector> redirect;
|
||||
ComPtr<Xaml::IDependencyObject> canvas;
|
||||
ComPtr<IApplicationView> view;
|
||||
ComPtr<IDisplayInformation> displayInformation;
|
||||
@ -482,6 +486,7 @@ public:
|
||||
QHash<Qt::Key, KeyInfo> activeKeys;
|
||||
QHash<CoreWindowCallbackRemover, EventRegistrationToken> windowTokens;
|
||||
QHash<DisplayCallbackRemover, EventRegistrationToken> displayTokens;
|
||||
QHash<RedirectorCallbackRemover, EventRegistrationToken> redirectTokens;
|
||||
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)
|
||||
QHash<ApplicationView2CallbackRemover, EventRegistrationToken> view2Tokens;
|
||||
ComPtr<IApplicationView2> view2;
|
||||
@ -513,6 +518,10 @@ QWinRTScreen::QWinRTScreen()
|
||||
|
||||
hr = window->get_CoreWindow(&d->coreWindow);
|
||||
Q_ASSERT_SUCCEEDED(hr);
|
||||
|
||||
hr = d->coreWindow.As(&d->redirect);
|
||||
Q_ASSERT_SUCCEEDED(hr);
|
||||
|
||||
hr = d->coreWindow->Activate();
|
||||
Q_ASSERT_SUCCEEDED(hr);
|
||||
|
||||
@ -595,6 +604,10 @@ QWinRTScreen::~QWinRTScreen()
|
||||
hr = (d->displayInformation.Get()->*i.key())(i.value());
|
||||
Q_ASSERT_SUCCEEDED(hr);
|
||||
}
|
||||
for (QHash<RedirectorCallbackRemover, EventRegistrationToken>::const_iterator i = d->redirectTokens.begin(); i != d->redirectTokens.end(); ++i) {
|
||||
hr = (d->redirect.Get()->*i.key())(i.value());
|
||||
Q_ASSERT_SUCCEEDED(hr);
|
||||
}
|
||||
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)
|
||||
for (QHash<ApplicationView2CallbackRemover, EventRegistrationToken>::const_iterator i = d->view2Tokens.begin(); i != d->view2Tokens.end(); ++i) {
|
||||
hr = (d->view2.Get()->*i.key())(i.value());
|
||||
@ -754,6 +767,9 @@ void QWinRTScreen::initialize()
|
||||
Q_ASSERT_SUCCEEDED(hr);
|
||||
onOrientationChanged(Q_NULLPTR, Q_NULLPTR);
|
||||
onVisibilityChanged(nullptr, nullptr);
|
||||
|
||||
hr = d->redirect->add_PointerRoutedReleased(Callback<RedirectHandler>(this, &QWinRTScreen::onRedirectReleased).Get(), &d->redirectTokens[&ICorePointerRedirector::remove_PointerRoutedReleased]);
|
||||
Q_ASSERT_SUCCEEDED(hr);
|
||||
}
|
||||
|
||||
void QWinRTScreen::setCursorRect(const QRectF &cursorRect)
|
||||
@ -1378,6 +1394,13 @@ HRESULT QWinRTScreen::onDpiChanged(IDisplayInformation *, IInspectable *)
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT QWinRTScreen::onRedirectReleased(ICorePointerRedirector *, IPointerEventArgs *args)
|
||||
{
|
||||
// When dragging ends with a non-mouse input device then onRedirectRelease is invoked.
|
||||
// QTBUG-58781
|
||||
return onPointerUpdated(nullptr, args);
|
||||
}
|
||||
|
||||
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)
|
||||
HRESULT QWinRTScreen::onWindowSizeChanged(IApplicationView *, IInspectable *)
|
||||
#else
|
||||
|
@ -52,6 +52,7 @@ namespace ABI {
|
||||
namespace Core {
|
||||
struct IAutomationProviderRequestedEventArgs;
|
||||
struct ICharacterReceivedEventArgs;
|
||||
struct ICorePointerRedirector;
|
||||
struct ICoreWindow;
|
||||
struct ICoreWindowEventArgs;
|
||||
struct IKeyEventArgs;
|
||||
@ -149,6 +150,7 @@ private:
|
||||
#else
|
||||
HRESULT onWindowSizeChanged(ABI::Windows::UI::Core::ICoreWindow *, ABI::Windows::UI::Core::IWindowSizeChangedEventArgs *);
|
||||
#endif
|
||||
HRESULT onRedirectReleased(ABI::Windows::UI::Core::ICorePointerRedirector *, ABI::Windows::UI::Core::IPointerEventArgs *);
|
||||
|
||||
QScopedPointer<QWinRTScreenPrivate> d_ptr;
|
||||
QRectF mCursorRect;
|
||||
|
Loading…
Reference in New Issue
Block a user