macOS: Don't rely on Carbon for QCocoaKeyMapper::queryKeyboardModifiers()

The semantics of the Cocoa API matches that of the Carbon API we are
replacing, in that it reflects the "state of devices combined with
synthesized events at the moment, independent of which events have
been delivered via the event stream.", which is the same semantics
as QGuiApplication::queryKeyboardModifiers() expects.

Change-Id: Ic00ccbb3e8ae571522245df30924952aa2cc71de
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
bb10
Tor Arne Vestbø 2020-07-07 20:57:03 +02:00
parent b982385bcf
commit 055c2bebda
1 changed files with 12 additions and 23 deletions

View File

@ -84,34 +84,23 @@ Qt::KeyboardModifiers QCocoaKeyMapper::fromCocoaModifiers(NSEventModifierFlags c
return swapModifiersIfNeeded(qtModifiers);
}
static constexpr std::tuple<int, Qt::KeyboardModifier> carbonModifierMap[] = {
{ shiftKey, Qt::ShiftModifier },
{ rightShiftKey, Qt::ShiftModifier },
{ controlKey, Qt::ControlModifier },
{ rightControlKey, Qt::ControlModifier },
{ cmdKey, Qt::MetaModifier },
{ optionKey, Qt::AltModifier },
{ rightOptionKey, Qt::AltModifier },
{ kEventKeyModifierNumLockMask, Qt::KeypadModifier }
};
using CarbonModifiers = UInt32; // As opposed to EventModifiers which is UInt16
Qt::KeyboardModifiers fromCarbonModifiers(CarbonModifiers carbonModifiers)
{
Qt::KeyboardModifiers qtModifiers = Qt::NoModifier;
for (const auto &[carbonModifier, qtModifier] : carbonModifierMap) {
if (carbonModifiers & carbonModifier)
qtModifiers |= qtModifier;
}
return swapModifiersIfNeeded(qtModifiers);
}
static CarbonModifiers toCarbonModifiers(Qt::KeyboardModifiers qtModifiers)
{
qtModifiers = swapModifiersIfNeeded(qtModifiers);
static constexpr std::tuple<int, Qt::KeyboardModifier> carbonModifierMap[] = {
{ shiftKey, Qt::ShiftModifier },
{ rightShiftKey, Qt::ShiftModifier },
{ controlKey, Qt::ControlModifier },
{ rightControlKey, Qt::ControlModifier },
{ cmdKey, Qt::MetaModifier },
{ optionKey, Qt::AltModifier },
{ rightOptionKey, Qt::AltModifier },
{ kEventKeyModifierNumLockMask, Qt::KeypadModifier }
};
CarbonModifiers carbonModifiers = 0;
for (const auto &[carbonModifier, qtModifier] : carbonModifierMap) {
if (qtModifiers & qtModifier)
@ -394,7 +383,7 @@ QCocoaKeyMapper::~QCocoaKeyMapper()
Qt::KeyboardModifiers QCocoaKeyMapper::queryKeyboardModifiers()
{
return fromCarbonModifiers(GetCurrentKeyModifiers());
return fromCocoaModifiers(NSEvent.modifierFlags);
}
bool QCocoaKeyMapper::updateKeyboard()