summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/winrt/qwinrtscreen.cpp
diff options
context:
space:
mode:
authorOliver Wolff <oliver.wolff@qt.io>2017-04-19 08:29:36 +0200
committerOliver Wolff <oliver.wolff@qt.io>2017-04-19 10:27:35 +0000
commit32b92b9e21a7a684fa9c23b881cda5b913699574 (patch)
treed1e0f9b23df66954aa96d21e2a355dc55d050ef9 /src/plugins/platforms/winrt/qwinrtscreen.cpp
parentad0249cc793772a342bf6ced40fb44cd52b2b0e6 (diff)
winrt: Fix keyboard modifier states
CoreWindow::GetAsyncKeyState returns flags and not enums so checking equality does not give the needed result. As seen in qwindowskeymapper.cpp key events that only contain a modifier key should not have the key itself as a modifier when calling handleExtendedKeyEvent. With the current approach the modifier states are the same as on desktop Windows. Task-number: QTBUG-58750 Change-Id: Ie0f3e1d3e8294e1a6b41c9223a7a5153306579f6 Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
Diffstat (limited to 'src/plugins/platforms/winrt/qwinrtscreen.cpp')
-rw-r--r--src/plugins/platforms/winrt/qwinrtscreen.cpp37
1 files changed, 26 insertions, 11 deletions
diff --git a/src/plugins/platforms/winrt/qwinrtscreen.cpp b/src/plugins/platforms/winrt/qwinrtscreen.cpp
index 3a4c3b871c..7ac4bdac6c 100644
--- a/src/plugins/platforms/winrt/qwinrtscreen.cpp
+++ b/src/plugins/platforms/winrt/qwinrtscreen.cpp
@@ -685,21 +685,26 @@ Qt::KeyboardModifiers QWinRTScreen::keyboardModifiers() const
Qt::KeyboardModifiers mods;
CoreVirtualKeyStates mod;
- d->coreWindow->GetAsyncKeyState(VirtualKey_Shift, &mod);
- if (mod == CoreVirtualKeyStates_Down)
+ HRESULT hr = d->coreWindow->GetAsyncKeyState(VirtualKey_Shift, &mod);
+ Q_ASSERT_SUCCEEDED(hr);
+ if (mod & CoreVirtualKeyStates_Down)
mods |= Qt::ShiftModifier;
- d->coreWindow->GetAsyncKeyState(VirtualKey_Menu, &mod);
- if (mod == CoreVirtualKeyStates_Down)
+ hr = d->coreWindow->GetAsyncKeyState(VirtualKey_Menu, &mod);
+ Q_ASSERT_SUCCEEDED(hr);
+ if (mod & CoreVirtualKeyStates_Down)
mods |= Qt::AltModifier;
- d->coreWindow->GetAsyncKeyState(VirtualKey_Control, &mod);
- if (mod == CoreVirtualKeyStates_Down)
+ hr = d->coreWindow->GetAsyncKeyState(VirtualKey_Control, &mod);
+ Q_ASSERT_SUCCEEDED(hr);
+ if (mod & CoreVirtualKeyStates_Down)
mods |= Qt::ControlModifier;
- d->coreWindow->GetAsyncKeyState(VirtualKey_LeftWindows, &mod);
- if (mod == CoreVirtualKeyStates_Down) {
+ hr = d->coreWindow->GetAsyncKeyState(VirtualKey_LeftWindows, &mod);
+ Q_ASSERT_SUCCEEDED(hr);
+ if (mod & CoreVirtualKeyStates_Down) {
mods |= Qt::MetaModifier;
} else {
- d->coreWindow->GetAsyncKeyState(VirtualKey_RightWindows, &mod);
- if (mod == CoreVirtualKeyStates_Down)
+ hr = d->coreWindow->GetAsyncKeyState(VirtualKey_RightWindows, &mod);
+ Q_ASSERT_SUCCEEDED(hr);
+ if (mod & CoreVirtualKeyStates_Down)
mods |= Qt::MetaModifier;
}
return mods;
@@ -997,11 +1002,21 @@ HRESULT QWinRTScreen::onKeyDown(ABI::Windows::UI::Core::ICoreWindow *, ABI::Wind
if (key == Qt::Key_unknown || (key >= Qt::Key_Space && key <= Qt::Key_ydiaeresis))
return S_OK;
+ Qt::KeyboardModifiers modifiers = keyboardModifiers();
+ // If the key actually pressed is a modifier key, then we remove its modifier key from the
+ // state, since a modifier-key can't have itself as a modifier (see qwindowskeymapper.cpp)
+ if (key == Qt::Key_Control)
+ modifiers = modifiers ^ Qt::ControlModifier;
+ else if (key == Qt::Key_Shift)
+ modifiers = modifiers ^ Qt::ShiftModifier;
+ else if (key == Qt::Key_Alt)
+ modifiers = modifiers ^ Qt::AltModifier;
+
QWindowSystemInterface::handleExtendedKeyEvent(
topWindow(),
QEvent::KeyPress,
key,
- keyboardModifiers(),
+ modifiers,
!status.ScanCode ? -1 : status.ScanCode,
virtualKey,
0,