27 if (unicode >= 0xF700 && unicode <= 0xF8FF)
33@implementation QNSView (Keys)
35- (bool)handleKeyEvent:(NSEvent *)nsevent
37 qCDebug(lcQpaKeys) <<
"Handling" << nsevent;
50 bool didInterpretKeyEvent =
false;
57 qCDebug(lcQpaKeys) <<
"Trying potential shortcuts in" <<
window
58 <<
"for" << shortcutEvent;
60 if (shortcutEvent.sendWindowSystemEvent(
window)) {
61 qCDebug(lcQpaKeys) <<
"Found matching shortcut; will not send as key event";
64 qCDebug(lcQpaKeys) <<
"No matching shortcuts; continuing with key event delivery";
68 QObject *focusObject = m_platformWindow ? m_platformWindow->window()->focusObject() :
nullptr;
71 auto hints =
static_cast<Qt::InputMethodHints
>(queryResult.value(
Qt::ImHints).toUInt());
74 const bool isDeadKey = !nsevent.characters.length;
92 if (!(nsevent.modifierFlags & (NSEventModifierFlagCommand | NSEventModifierFlagControl)))
93 [NSCursor setHiddenUntilMouseMoves:YES];
95 qCDebug(lcQpaKeys) <<
"Interpreting key event for focus object" << focusObject;
97 [
self interpretKeyEvents:@[nsevent]];
99 didInterpretKeyEvent =
true;
110 bool accepted =
true;
116 qCDebug(lcQpaKeys) <<
"Sending as" << keyEvent;
117 accepted = keyEvent.sendWindowSystemEvent(
window);
122- (
void)keyDown:(NSEvent *)nsevent
124 if ([self isTransparentForUserInput])
125 return [
super keyDown:nsevent];
127 const bool accepted = [
self handleKeyEvent:nsevent];
137 if (!shouldPropagate)
141 [
super keyDown:nsevent];
144- (
void)keyUp:(NSEvent *)nsevent
146 if ([self isTransparentForUserInput])
147 return [
super keyUp:nsevent];
149 const bool keyUpAccepted = [
self handleKeyEvent:nsevent];
155 if (!keyUpAccepted && !keyDownAccepted)
156 [
super keyUp:nsevent];
159- (
void)cancelOperation:(
id)sender
163 NSEvent *currentEvent = NSApp.currentEvent;
164 if (!currentEvent || currentEvent.type != NSEventTypeKeyDown)
177 [
self handleKeyEvent:currentEvent];
180- (
void)flagsChanged:(NSEvent *)nsevent
185 qCDebug(lcQpaKeys) <<
"Flags changed resulting in" << keyEvent.modifiers;
188 static NSEventModifierFlags m_lastKnownModifiers;
189 NSEventModifierFlags lastKnownModifiers = m_lastKnownModifiers;
190 NSEventModifierFlags newModifiers = lastKnownModifiers ^ keyEvent.nativeModifiers;
191 m_lastKnownModifiers = keyEvent.nativeModifiers;
193 static constexpr std::tuple<NSEventModifierFlags, Qt::Key> modifierMap[] = {
201 for (
auto [macModifier,
qtKey] : modifierMap) {
202 if (!(newModifiers & macModifier))
214 modifierEvent.
type = lastKnownModifiers & macModifier
220 modifierEvent.
modifiers ^= QAppleKeyMapper::fromCocoaModifiers(macModifier);
221 modifierEvent.nativeModifiers ^= macModifier;
226 qCDebug(lcQpaKeys) <<
"Sending" << modifierEvent;
227 modifierEvent.sendWindowSystemEvent(
window);
237 timestamp = nsevent.timestamp * 1000;
238 nativeModifiers = nsevent.modifierFlags;
239 modifiers = QAppleKeyMapper::fromCocoaModifiers(nativeModifiers);
241 switch (nsevent.type) {
247 switch (nsevent.type) {
248 case NSEventTypeKeyDown:
249 case NSEventTypeKeyUp:
250 case NSEventTypeFlagsChanged:
251 nativeVirtualKey = nsevent.keyCode;
256 if (nsevent.type == NSEventTypeKeyDown || nsevent.type == NSEventTypeKeyUp) {
257 NSString *charactersIgnoringModifiers = nsevent.charactersIgnoringModifiers;
267 if (
characters.length || charactersIgnoringModifiers.length) {
268 if (nativeModifiers & (NSEventModifierFlagControl | NSEventModifierFlagOption)
269 && charactersIgnoringModifiers.length)
270 character =
QChar([charactersIgnoringModifiers characterAtIndex:0]);
273 key = QAppleKeyMapper::fromCocoaKey(character);
278 isRepeat = nsevent.ARepeat;
287 key,
modifiers, nativeScanCode, nativeVirtualKey, nativeModifiers,
292 static const int count = 1;
308 debug.nospace().verbosity(0) <<
"KeyEvent("
309 <<
e.type <<
", timestamp=" <<
e.timestamp
310 <<
", key=" <<
e.key <<
", modifiers=" <<
e.modifiers
311 <<
", text="<<
e.text <<
", isRepeat=" <<
e.isRepeat
312 <<
", nativeVirtualKey=" <<
e.nativeVirtualKey
313 <<
", nativeModifiers=" <<
e.nativeModifiers
constexpr char16_t unicode() const noexcept
Returns the numeric Unicode value of the QChar.
static bool testAttribute(Qt::ApplicationAttribute attribute)
Returns true if attribute attribute is set; otherwise returns false.
bool remove(const T &value)
iterator insert(const T &value)
\macro QT_RESTRICTED_CAST_FROM_ASCII
const QChar at(qsizetype i) const
Returns the character at the given index position in the string.
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
qsizetype length() const
Returns the number of characters in this string.
static bool flushWindowSystemEvents(QEventLoop::ProcessEventsFlags flags=QEventLoop::AllEvents)
Make Qt Gui process all events on the event queue immediately.
static bool handleExtendedKeyEvent(QWindow *window, QEvent::Type type, int key, Qt::KeyboardModifiers modifiers, quint32 nativeScanCode, quint32 nativeVirtualKey, quint32 nativeModifiers, const QString &text=QString(), bool autorep=false, ushort count=1)
static bool handleShortcutEvent(QWindow *window, ulong timestamp, int k, Qt::KeyboardModifiers mods, quint32 nativeScanCode, quint32 nativeVirtualKey, quint32 nativeModifiers, const QString &text=QString(), bool autorep=false, ushort count=1)
EGLImageKHR int int EGLuint64KHR * modifiers
@ ImhFormattedNumbersOnly
@ AA_MacDontSwapCtrlAndMeta
InputMethodQueryResult queryInputMethod(QObject *object, Qt::InputMethodQueries queries)
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
#define qCDebug(category,...)
NSEvent * m_currentlyInterpretedKeyEvent
QSet< quint32 > m_acceptedKeyDowns
bool m_sendKeyEventWithoutText
static bool isSpecialKey(const QString &text)
GLenum GLenum GLsizei count
static QString qtKey(CFStringRef cfkey)
QList< QChar > characters
KeyEvent(EventType type, emscripten::val webEvent)
QFlags< Qt::KeyboardModifier > modifiers