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;
|
return;
|
||||||
|
|
||||||
QScopedScopeLevelCounter scopeLevelCounter(QGuiApplicationPrivate::instance()->threadData.loadRelaxed());
|
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);
|
static QMetaMethod activatedSignal = QMetaMethod::fromSignal(&QCocoaMenuItem::activated);
|
||||||
activatedSignal.invoke(platformItem, Qt::QueuedConnection);
|
activatedSignal.invoke(platformItem, Qt::QueuedConnection);
|
||||||
|
@ -82,6 +82,8 @@ public:
|
|||||||
static Qt::KeyboardModifiers queryKeyboardModifiers();
|
static Qt::KeyboardModifiers queryKeyboardModifiers();
|
||||||
QList<int> possibleKeys(const QKeyEvent *event) const;
|
QList<int> possibleKeys(const QKeyEvent *event) const;
|
||||||
|
|
||||||
|
static Qt::KeyboardModifiers fromCocoaModifiers(NSEventModifierFlags cocoaModifiers);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool updateKeyboard();
|
bool updateKeyboard();
|
||||||
void deleteLayouts();
|
void deleteLayouts();
|
||||||
|
@ -50,6 +50,23 @@ Q_LOGGING_CATEGORY(lcQpaKeyMapper, "qt.qpa.keymapper");
|
|||||||
Q_LOGGING_CATEGORY(lcQpaKeyMapperKeys, "qt.qpa.keymapper.keys");
|
Q_LOGGING_CATEGORY(lcQpaKeyMapperKeys, "qt.qpa.keymapper.keys");
|
||||||
Q_LOGGING_CATEGORY(lcQpaKeyMapperModifiers, "qt.qpa.keymapper.modifiers");
|
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[] = {
|
static constexpr std::tuple<int, Qt::KeyboardModifier> carbonModifierMap[] = {
|
||||||
{ shiftKey, Qt::ShiftModifier },
|
{ shiftKey, Qt::ShiftModifier },
|
||||||
{ rightShiftKey, Qt::ShiftModifier },
|
{ rightShiftKey, Qt::ShiftModifier },
|
||||||
|
@ -46,6 +46,7 @@
|
|||||||
#include "qcocoawindow.h"
|
#include "qcocoawindow.h"
|
||||||
#include "qnsview.h"
|
#include "qnsview.h"
|
||||||
#include "qcocoahelpers.h"
|
#include "qcocoahelpers.h"
|
||||||
|
#include "qcocoakeymapper.h"
|
||||||
|
|
||||||
#include <QtCore/qcoreapplication.h>
|
#include <QtCore/qcoreapplication.h>
|
||||||
#include <QtCore/qcoreevent.h>
|
#include <QtCore/qcoreevent.h>
|
||||||
@ -253,7 +254,7 @@ static NSString *qt_mac_removePrivateUnicode(NSString *string)
|
|||||||
QChar ch;
|
QChar ch;
|
||||||
int keyCode;
|
int keyCode;
|
||||||
ulong nativeModifiers = event.modifierFlags;
|
ulong nativeModifiers = event.modifierFlags;
|
||||||
Qt::KeyboardModifiers modifiers = [QNSView convertKeyModifiers:nativeModifiers];
|
Qt::KeyboardModifiers modifiers = QCocoaKeyMapper::fromCocoaModifiers(nativeModifiers);
|
||||||
NSString *charactersIgnoringModifiers = event.charactersIgnoringModifiers;
|
NSString *charactersIgnoringModifiers = event.charactersIgnoringModifiers;
|
||||||
NSString *characters = event.characters;
|
NSString *characters = event.characters;
|
||||||
|
|
||||||
|
@ -60,10 +60,6 @@ QT_DECLARE_NAMESPACED_OBJC_INTERFACE(QNSView, NSView
|
|||||||
- (void)resetMouseButtons;
|
- (void)resetMouseButtons;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface QNSView (KeysAPI)
|
|
||||||
+ (Qt::KeyboardModifiers)convertKeyModifiers:(ulong)modifierFlags;
|
|
||||||
@end
|
|
||||||
|
|
||||||
@interface QNSView (ComplexTextAPI)
|
@interface QNSView (ComplexTextAPI)
|
||||||
- (void)unmarkText;
|
- (void)unmarkText;
|
||||||
- (void)cancelComposingText;
|
- (void)cancelComposingText;
|
||||||
|
@ -197,7 +197,7 @@ static QPoint mapWindowCoordinates(QWindow *source, QWindow *target, QPoint poin
|
|||||||
if (!target)
|
if (!target)
|
||||||
return NSDragOperationNone;
|
return NSDragOperationNone;
|
||||||
|
|
||||||
const auto modifiers = [QNSView convertKeyModifiers:NSApp.currentEvent.modifierFlags];
|
const auto modifiers = QCocoaKeyMapper::fromCocoaModifiers(NSApp.currentEvent.modifierFlags);
|
||||||
const auto buttons = currentlyPressedMouseButtons();
|
const auto buttons = currentlyPressedMouseButtons();
|
||||||
const auto point = mapWindowCoordinates(m_platformWindow->window(), target, windowPoint);
|
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);
|
QPlatformDropQtResponse response(false, Qt::IgnoreAction);
|
||||||
QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag();
|
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 buttons = currentlyPressedMouseButtons();
|
||||||
const auto point = mapWindowCoordinates(m_platformWindow->window(), target, windowPoint);
|
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
|
// this case won't send the matching release event, so we have to
|
||||||
// synthesize it here.
|
// synthesize it here.
|
||||||
m_buttons = currentlyPressedMouseButtons();
|
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 windowPoint = [self.window convertRectFromScreen:NSMakeRect(screenPoint.x, screenPoint.y, 1, 1)].origin;
|
||||||
NSPoint nsViewPoint = [self convertPoint: windowPoint fromView: nil];
|
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
|
// 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)
|
@implementation QNSView (Keys)
|
||||||
|
|
||||||
- (int)convertKeyCode:(QChar)keyChar
|
- (int)convertKeyCode:(QChar)keyChar
|
||||||
@ -71,7 +50,7 @@
|
|||||||
{
|
{
|
||||||
ulong timestamp = [nsevent timestamp] * 1000;
|
ulong timestamp = [nsevent timestamp] * 1000;
|
||||||
ulong nativeModifiers = [nsevent modifierFlags];
|
ulong nativeModifiers = [nsevent modifierFlags];
|
||||||
Qt::KeyboardModifiers modifiers = [QNSView convertKeyModifiers: nativeModifiers];
|
Qt::KeyboardModifiers modifiers = QCocoaKeyMapper::fromCocoaModifiers(nativeModifiers);
|
||||||
NSString *charactersIgnoringModifiers = [nsevent charactersIgnoringModifiers];
|
NSString *charactersIgnoringModifiers = [nsevent charactersIgnoringModifiers];
|
||||||
NSString *characters = [nsevent characters];
|
NSString *characters = [nsevent characters];
|
||||||
if (m_inputSource != characters) {
|
if (m_inputSource != characters) {
|
||||||
@ -219,7 +198,7 @@
|
|||||||
{
|
{
|
||||||
ulong timestamp = [nsevent timestamp] * 1000;
|
ulong timestamp = [nsevent timestamp] * 1000;
|
||||||
ulong modifiers = [nsevent modifierFlags];
|
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
|
// calculate the delta and remember the current modifiers for next time
|
||||||
static ulong m_lastKnownModifiers;
|
static ulong m_lastKnownModifiers;
|
||||||
@ -255,7 +234,7 @@
|
|||||||
timestamp,
|
timestamp,
|
||||||
(lastKnownModifiers & mac_mask) ? QEvent::KeyRelease : QEvent::KeyPress,
|
(lastKnownModifiers & mac_mask) ? QEvent::KeyRelease : QEvent::KeyPress,
|
||||||
qtCode,
|
qtCode,
|
||||||
qmodifiers ^ [QNSView convertKeyModifiers:mac_mask]);
|
qmodifiers ^ QCocoaKeyMapper::fromCocoaModifiers(mac_mask));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -281,7 +281,7 @@
|
|||||||
QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag();
|
QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag();
|
||||||
nativeDrag->setLastMouseEvent(theEvent, self);
|
nativeDrag->setLastMouseEvent(theEvent, self);
|
||||||
|
|
||||||
const auto modifiers = [QNSView convertKeyModifiers:theEvent.modifierFlags];
|
const auto modifiers = QCocoaKeyMapper::fromCocoaModifiers(theEvent.modifierFlags);
|
||||||
auto button = cocoaButton2QtButton(theEvent);
|
auto button = cocoaButton2QtButton(theEvent);
|
||||||
if (button == Qt::LeftButton && m_sendUpAsRightButton)
|
if (button == Qt::LeftButton && m_sendUpAsRightButton)
|
||||||
button = Qt::RightButton;
|
button = Qt::RightButton;
|
||||||
@ -432,7 +432,7 @@
|
|||||||
[[NSTextInputContext currentInputContext] handleEvent:theEvent];
|
[[NSTextInputContext currentInputContext] handleEvent:theEvent];
|
||||||
} else {
|
} else {
|
||||||
auto ctrlOrMetaModifier = qApp->testAttribute(Qt::AA_MacDontSwapCtrlAndMeta) ? Qt::ControlModifier : Qt::MetaModifier;
|
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_buttons |= Qt::RightButton;
|
||||||
m_sendUpAsRightButton = true;
|
m_sendUpAsRightButton = true;
|
||||||
} else {
|
} else {
|
||||||
@ -681,7 +681,7 @@
|
|||||||
// after scrolling in Qt Creator: not taking the phase into account causes
|
// 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.
|
// the end of the event stream to be interpreted as font size changes.
|
||||||
if (theEvent.momentumPhase == NSEventPhaseNone)
|
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.
|
// "isInverted": natural OS X scrolling, inverted from the Qt/other platform/Jens perspective.
|
||||||
bool isInverted = [theEvent isDirectionInvertedFromDevice];
|
bool isInverted = [theEvent isDirectionInvertedFromDevice];
|
||||||
|
@ -109,7 +109,7 @@ Q_GLOBAL_STATIC(QCocoaTabletDeviceDataHash, tabletDeviceDataHash)
|
|||||||
if (rotation > 180.0)
|
if (rotation > 180.0)
|
||||||
rotation -= 360.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;
|
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",
|
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