macOS: Move Cocoa modifier mapping logic to QCocoaKeyMapper
Along with similar logic for Carbon. Change-Id: Ie32f8ffa336006387d50d3b9e8491816aba4ea04 Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
This commit is contained in:
parent
0ad35db302
commit
0a52eba3c0
@ -375,7 +375,7 @@ QT_USE_NAMESPACE
|
||||
return;
|
||||
|
||||
QScopedScopeLevelCounter scopeLevelCounter(QGuiApplicationPrivate::instance()->threadData.loadRelaxed());
|
||||
QGuiApplicationPrivate::modifier_buttons = [QNSView convertKeyModifiers:[NSEvent modifierFlags]];
|
||||
QGuiApplicationPrivate::modifier_buttons = QCocoaKeyMapper::fromCocoaModifiers([NSEvent modifierFlags]);
|
||||
|
||||
static QMetaMethod activatedSignal = QMetaMethod::fromSignal(&QCocoaMenuItem::activated);
|
||||
activatedSignal.invoke(platformItem, Qt::QueuedConnection);
|
||||
|
@ -82,6 +82,8 @@ public:
|
||||
static Qt::KeyboardModifiers queryKeyboardModifiers();
|
||||
QList<int> possibleKeys(const QKeyEvent *event) const;
|
||||
|
||||
static Qt::KeyboardModifiers fromCocoaModifiers(NSEventModifierFlags cocoaModifiers);
|
||||
|
||||
private:
|
||||
bool updateKeyboard();
|
||||
void deleteLayouts();
|
||||
|
@ -50,6 +50,23 @@ Q_LOGGING_CATEGORY(lcQpaKeyMapper, "qt.qpa.keymapper");
|
||||
Q_LOGGING_CATEGORY(lcQpaKeyMapperKeys, "qt.qpa.keymapper.keys");
|
||||
Q_LOGGING_CATEGORY(lcQpaKeyMapperModifiers, "qt.qpa.keymapper.modifiers");
|
||||
|
||||
Qt::KeyboardModifiers QCocoaKeyMapper::fromCocoaModifiers(NSEventModifierFlags cocoaModifiers)
|
||||
{
|
||||
const bool dontSwapCtrlAndMeta = qApp->testAttribute(Qt::AA_MacDontSwapCtrlAndMeta);
|
||||
Qt::KeyboardModifiers qtMods =Qt::NoModifier;
|
||||
if (cocoaModifiers & NSEventModifierFlagShift)
|
||||
qtMods |= Qt::ShiftModifier;
|
||||
if (cocoaModifiers & NSEventModifierFlagControl)
|
||||
qtMods |= dontSwapCtrlAndMeta ? Qt::ControlModifier : Qt::MetaModifier;
|
||||
if (cocoaModifiers & NSEventModifierFlagOption)
|
||||
qtMods |= Qt::AltModifier;
|
||||
if (cocoaModifiers & NSEventModifierFlagCommand)
|
||||
qtMods |= dontSwapCtrlAndMeta ? Qt::MetaModifier : Qt::ControlModifier;
|
||||
if (cocoaModifiers & NSEventModifierFlagNumericPad)
|
||||
qtMods |= Qt::KeypadModifier;
|
||||
return qtMods;
|
||||
}
|
||||
|
||||
static constexpr std::tuple<int, Qt::KeyboardModifier> carbonModifierMap[] = {
|
||||
{ shiftKey, Qt::ShiftModifier },
|
||||
{ rightShiftKey, Qt::ShiftModifier },
|
||||
|
@ -46,6 +46,7 @@
|
||||
#include "qcocoawindow.h"
|
||||
#include "qnsview.h"
|
||||
#include "qcocoahelpers.h"
|
||||
#include "qcocoakeymapper.h"
|
||||
|
||||
#include <QtCore/qcoreapplication.h>
|
||||
#include <QtCore/qcoreevent.h>
|
||||
@ -253,7 +254,7 @@ static NSString *qt_mac_removePrivateUnicode(NSString *string)
|
||||
QChar ch;
|
||||
int keyCode;
|
||||
ulong nativeModifiers = event.modifierFlags;
|
||||
Qt::KeyboardModifiers modifiers = [QNSView convertKeyModifiers:nativeModifiers];
|
||||
Qt::KeyboardModifiers modifiers = QCocoaKeyMapper::fromCocoaModifiers(nativeModifiers);
|
||||
NSString *charactersIgnoringModifiers = event.charactersIgnoringModifiers;
|
||||
NSString *characters = event.characters;
|
||||
|
||||
|
@ -60,10 +60,6 @@ QT_DECLARE_NAMESPACED_OBJC_INTERFACE(QNSView, NSView
|
||||
- (void)resetMouseButtons;
|
||||
@end
|
||||
|
||||
@interface QNSView (KeysAPI)
|
||||
+ (Qt::KeyboardModifiers)convertKeyModifiers:(ulong)modifierFlags;
|
||||
@end
|
||||
|
||||
@interface QNSView (ComplexTextAPI)
|
||||
- (void)unmarkText;
|
||||
- (void)cancelComposingText;
|
||||
|
@ -197,7 +197,7 @@ static QPoint mapWindowCoordinates(QWindow *source, QWindow *target, QPoint poin
|
||||
if (!target)
|
||||
return NSDragOperationNone;
|
||||
|
||||
const auto modifiers = [QNSView convertKeyModifiers:NSApp.currentEvent.modifierFlags];
|
||||
const auto modifiers = QCocoaKeyMapper::fromCocoaModifiers(NSApp.currentEvent.modifierFlags);
|
||||
const auto buttons = currentlyPressedMouseButtons();
|
||||
const auto point = mapWindowCoordinates(m_platformWindow->window(), target, windowPoint);
|
||||
|
||||
@ -261,7 +261,7 @@ static QPoint mapWindowCoordinates(QWindow *source, QWindow *target, QPoint poin
|
||||
|
||||
QPlatformDropQtResponse response(false, Qt::IgnoreAction);
|
||||
QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag();
|
||||
const auto modifiers = [QNSView convertKeyModifiers:NSApp.currentEvent.modifierFlags];
|
||||
const auto modifiers = QCocoaKeyMapper::fromCocoaModifiers(NSApp.currentEvent.modifierFlags);
|
||||
const auto buttons = currentlyPressedMouseButtons();
|
||||
const auto point = mapWindowCoordinates(m_platformWindow->window(), target, windowPoint);
|
||||
|
||||
@ -302,7 +302,7 @@ static QPoint mapWindowCoordinates(QWindow *source, QWindow *target, QPoint poin
|
||||
// this case won't send the matching release event, so we have to
|
||||
// synthesize it here.
|
||||
m_buttons = currentlyPressedMouseButtons();
|
||||
const auto modifiers = [QNSView convertKeyModifiers:NSApp.currentEvent.modifierFlags];
|
||||
const auto modifiers = QCocoaKeyMapper::fromCocoaModifiers(NSApp.currentEvent.modifierFlags);
|
||||
|
||||
NSPoint windowPoint = [self.window convertRectFromScreen:NSMakeRect(screenPoint.x, screenPoint.y, 1, 1)].origin;
|
||||
NSPoint nsViewPoint = [self convertPoint: windowPoint fromView: nil];
|
||||
|
@ -39,27 +39,6 @@
|
||||
|
||||
// This file is included from qnsview.mm, and only used to organize the code
|
||||
|
||||
@implementation QNSView (KeysAPI)
|
||||
|
||||
+ (Qt::KeyboardModifiers)convertKeyModifiers:(ulong)modifierFlags
|
||||
{
|
||||
const bool dontSwapCtrlAndMeta = qApp->testAttribute(Qt::AA_MacDontSwapCtrlAndMeta);
|
||||
Qt::KeyboardModifiers qtMods =Qt::NoModifier;
|
||||
if (modifierFlags & NSEventModifierFlagShift)
|
||||
qtMods |= Qt::ShiftModifier;
|
||||
if (modifierFlags & NSEventModifierFlagControl)
|
||||
qtMods |= dontSwapCtrlAndMeta ? Qt::ControlModifier : Qt::MetaModifier;
|
||||
if (modifierFlags & NSEventModifierFlagOption)
|
||||
qtMods |= Qt::AltModifier;
|
||||
if (modifierFlags & NSEventModifierFlagCommand)
|
||||
qtMods |= dontSwapCtrlAndMeta ? Qt::MetaModifier : Qt::ControlModifier;
|
||||
if (modifierFlags & NSEventModifierFlagNumericPad)
|
||||
qtMods |= Qt::KeypadModifier;
|
||||
return qtMods;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation QNSView (Keys)
|
||||
|
||||
- (int)convertKeyCode:(QChar)keyChar
|
||||
@ -71,7 +50,7 @@
|
||||
{
|
||||
ulong timestamp = [nsevent timestamp] * 1000;
|
||||
ulong nativeModifiers = [nsevent modifierFlags];
|
||||
Qt::KeyboardModifiers modifiers = [QNSView convertKeyModifiers: nativeModifiers];
|
||||
Qt::KeyboardModifiers modifiers = QCocoaKeyMapper::fromCocoaModifiers(nativeModifiers);
|
||||
NSString *charactersIgnoringModifiers = [nsevent charactersIgnoringModifiers];
|
||||
NSString *characters = [nsevent characters];
|
||||
if (m_inputSource != characters) {
|
||||
@ -219,7 +198,7 @@
|
||||
{
|
||||
ulong timestamp = [nsevent timestamp] * 1000;
|
||||
ulong modifiers = [nsevent modifierFlags];
|
||||
Qt::KeyboardModifiers qmodifiers = [QNSView convertKeyModifiers:modifiers];
|
||||
Qt::KeyboardModifiers qmodifiers = QCocoaKeyMapper::fromCocoaModifiers(modifiers);
|
||||
|
||||
// calculate the delta and remember the current modifiers for next time
|
||||
static ulong m_lastKnownModifiers;
|
||||
@ -255,7 +234,7 @@
|
||||
timestamp,
|
||||
(lastKnownModifiers & mac_mask) ? QEvent::KeyRelease : QEvent::KeyPress,
|
||||
qtCode,
|
||||
qmodifiers ^ [QNSView convertKeyModifiers:mac_mask]);
|
||||
qmodifiers ^ QCocoaKeyMapper::fromCocoaModifiers(mac_mask));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -281,7 +281,7 @@
|
||||
QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag();
|
||||
nativeDrag->setLastMouseEvent(theEvent, self);
|
||||
|
||||
const auto modifiers = [QNSView convertKeyModifiers:theEvent.modifierFlags];
|
||||
const auto modifiers = QCocoaKeyMapper::fromCocoaModifiers(theEvent.modifierFlags);
|
||||
auto button = cocoaButton2QtButton(theEvent);
|
||||
if (button == Qt::LeftButton && m_sendUpAsRightButton)
|
||||
button = Qt::RightButton;
|
||||
@ -432,7 +432,7 @@
|
||||
[[NSTextInputContext currentInputContext] handleEvent:theEvent];
|
||||
} else {
|
||||
auto ctrlOrMetaModifier = qApp->testAttribute(Qt::AA_MacDontSwapCtrlAndMeta) ? Qt::ControlModifier : Qt::MetaModifier;
|
||||
if (!m_dontOverrideCtrlLMB && [QNSView convertKeyModifiers:[theEvent modifierFlags]] & ctrlOrMetaModifier) {
|
||||
if (!m_dontOverrideCtrlLMB && QCocoaKeyMapper::fromCocoaModifiers(theEvent.modifierFlags) & ctrlOrMetaModifier) {
|
||||
m_buttons |= Qt::RightButton;
|
||||
m_sendUpAsRightButton = true;
|
||||
} else {
|
||||
@ -681,7 +681,7 @@
|
||||
// after scrolling in Qt Creator: not taking the phase into account causes
|
||||
// the end of the event stream to be interpreted as font size changes.
|
||||
if (theEvent.momentumPhase == NSEventPhaseNone)
|
||||
m_currentWheelModifiers = [QNSView convertKeyModifiers:[theEvent modifierFlags]];
|
||||
m_currentWheelModifiers = QCocoaKeyMapper::fromCocoaModifiers(theEvent.modifierFlags);
|
||||
|
||||
// "isInverted": natural OS X scrolling, inverted from the Qt/other platform/Jens perspective.
|
||||
bool isInverted = [theEvent isDirectionInvertedFromDevice];
|
||||
|
@ -109,7 +109,7 @@ Q_GLOBAL_STATIC(QCocoaTabletDeviceDataHash, tabletDeviceDataHash)
|
||||
if (rotation > 180.0)
|
||||
rotation -= 360.0;
|
||||
|
||||
Qt::KeyboardModifiers keyboardModifiers = [QNSView convertKeyModifiers:[theEvent modifierFlags]];
|
||||
Qt::KeyboardModifiers keyboardModifiers = QCocoaKeyMapper::fromCocoaModifiers(theEvent.modifierFlags);
|
||||
Qt::MouseButtons buttons = ignoreButtonMapping ? static_cast<Qt::MouseButtons>(static_cast<uint>([theEvent buttonMask])) : m_buttons;
|
||||
|
||||
qCDebug(lcQpaTablet, "event on tablet %d with tool %hd type %hd unique ID %lld pos %6.1f, %6.1f root pos %6.1f, %6.1f buttons 0x%x pressure %4.2lf tilt %d, %d rotation %6.2lf",
|
||||
|
Loading…
x
Reference in New Issue
Block a user