From 60c59b5cf57612216cb55fbfbe6e3ceebcda18e7 Mon Sep 17 00:00:00 2001 From: "Bradley T. Hughes" Date: Wed, 14 Mar 2012 15:06:39 +0100 Subject: Fix shortcut handling in the Cocoa plugin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit KeyPress events could be shortcuts or deadkeys, but we don't know which until we try. Shortcuts take precedence over deadkeys, so send them through QWindowSystemInterface::tryHandleSynchronousShortcutEvent() before passing it onto the input method. Change-Id: I479a3a7ff1c35e7c5692e8a17fb2173576dd0a29 Reviewed-by: Tasuku Suzuki Reviewed-by: Morten Johan Sørvig --- src/plugins/platforms/cocoa/qnsview.mm | 51 +++++++++++++++++----------------- 1 file changed, 26 insertions(+), 25 deletions(-) (limited to 'src/plugins/platforms/cocoa/qnsview.mm') diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm index a28c5959ce..202ad6cc11 100644 --- a/src/plugins/platforms/cocoa/qnsview.mm +++ b/src/plugins/platforms/cocoa/qnsview.mm @@ -570,42 +570,43 @@ static QTouchDevice *touchDevice = 0; return qtMods; } -- (void)handleKeyEvent:(NSEvent *)theEvent eventType:(int)eventType +- (void)handleKeyEvent:(NSEvent *)nsevent eventType:(int)eventType { - NSTimeInterval timestamp = [theEvent timestamp]; + NSTimeInterval timestamp = [nsevent timestamp]; ulong qt_timestamp = timestamp * 1000; - QString characters = QString::fromUtf8([[theEvent characters] UTF8String]); - Qt::KeyboardModifiers modifiers = [self convertKeyModifiers : [theEvent modifierFlags]]; - QChar ch([[theEvent charactersIgnoringModifiers] characterAtIndex:0]); - int keyCode = [self convertKeyCode : ch]; + QString characters = QString::fromUtf8([[nsevent characters] UTF8String]); + Qt::KeyboardModifiers modifiers = [self convertKeyModifiers:[nsevent modifierFlags]]; + QChar ch([[nsevent charactersIgnoringModifiers] characterAtIndex:0]); + int keyCode = [self convertKeyCode:ch]; - QWindowSystemInterface::handleKeyEvent(m_window, qt_timestamp, QEvent::Type(eventType), keyCode, modifiers, characters); -} + if (eventType == QEvent::KeyPress) { + if (!m_keyEventsAccepted && m_composingText.isEmpty()) + m_keyEventsAccepted = QWindowSystemInterface::tryHandleSynchronousShortcutEvent(m_window, qt_timestamp, keyCode, modifiers, characters); -- (void)keyDown:(NSEvent *)theEvent -{ - QObject *fo = QGuiApplication::focusObject(); - m_keyEventsAccepted = false; - if (fo) { - QInputMethodQueryEvent queryEvent(Qt::ImHints); - if (QCoreApplication::sendEvent(fo, &queryEvent)) { - Qt::InputMethodHints hints = static_cast(queryEvent.value(Qt::ImHints).toUInt()); - if (!(hints & Qt::ImhDigitsOnly || hints & Qt::ImhFormattedNumbersOnly || hints & Qt::ImhHiddenText)) { - [self interpretKeyEvents:[NSArray arrayWithObject: theEvent]]; + QObject *fo = QGuiApplication::focusObject(); + if (!m_keyEventsAccepted && fo) { + QInputMethodQueryEvent queryEvent(Qt::ImHints); + if (QCoreApplication::sendEvent(fo, &queryEvent)) { + Qt::InputMethodHints hints = static_cast(queryEvent.value(Qt::ImHints).toUInt()); + if (!(hints & Qt::ImhDigitsOnly || hints & Qt::ImhFormattedNumbersOnly || hints & Qt::ImhHiddenText)) + [self interpretKeyEvents:[NSArray arrayWithObject:nsevent]]; } } } - if (!m_keyEventsAccepted && m_composingText.isEmpty()) { - [self handleKeyEvent : theEvent eventType :int(QEvent::KeyPress)]; - } + if (!m_keyEventsAccepted && m_composingText.isEmpty()) + QWindowSystemInterface::handleKeyEvent(m_window, qt_timestamp, QEvent::Type(eventType), keyCode, modifiers, characters); } -- (void)keyUp:(NSEvent *)theEvent +- (void)keyDown:(NSEvent *)nsevent { - if (!m_keyEventsAccepted && m_composingText.isEmpty()) { - [self handleKeyEvent : theEvent eventType :int(QEvent::KeyRelease)]; - } + m_keyEventsAccepted = false; + [self handleKeyEvent:nsevent eventType:int(QEvent::KeyPress)]; +} + +- (void)keyUp:(NSEvent *)nsevent +{ + [self handleKeyEvent:nsevent eventType:int(QEvent::KeyRelease)]; } - (void) doCommandBySelector:(SEL)aSelector -- cgit v1.2.3