diff options
author | Denis Dzyubenko <denis.dzyubenko@nokia.com> | 2010-03-09 13:48:38 +0100 |
---|---|---|
committer | Samuli Piippo <samuli.piippo@digia.com> | 2011-06-09 13:05:20 +0300 |
commit | 77d0a5a040c583fb5ba2f41b1444ddf9aa058952 (patch) | |
tree | 0b17f22ce963be0dfc0ceb5f0b80eeac16f345fa /src | |
parent | c7d10b6155f5c98e2cc50ee791ad0c02aedb5819 (diff) | |
download | qt4-tools-77d0a5a040c583fb5ba2f41b1444ddf9aa058952.tar.gz |
Do not deliver the same key event multiple times in Cocoa.
When QCocoaView receives a keyDown or keyUp event, we translate it to QKeyEvent
and deliver it to qt widgets, propagating if necessary. However if none of Qt
widgets accepted the event we should propagate it back to cocoa - to get a beep
from it, or for example if Qt widget is embedded into a native widget.
Task-number: related to QTBUG-6444
Task-number: QTCREATORBUG-698
Reviewed-by: Richard Moe Gustavsen
(cherry picked from commit 90dfb5e5d8fc8cb841b0762cd88aa4b996c38312)
Diffstat (limited to 'src')
-rw-r--r-- | src/gui/kernel/qcocoasharedwindowmethods_mac_p.h | 20 | ||||
-rw-r--r-- | src/gui/kernel/qcocoaview_mac.mm | 20 | ||||
-rw-r--r-- | src/gui/kernel/qt_cocoa_helpers_mac.mm | 7 |
3 files changed, 19 insertions, 28 deletions
diff --git a/src/gui/kernel/qcocoasharedwindowmethods_mac_p.h b/src/gui/kernel/qcocoasharedwindowmethods_mac_p.h index 8d87d61717..bdb60b4dff 100644 --- a/src/gui/kernel/qcocoasharedwindowmethods_mac_p.h +++ b/src/gui/kernel/qcocoasharedwindowmethods_mac_p.h @@ -74,26 +74,6 @@ QT_END_NAMESPACE [super toggleToolbarShown:sender]; } -/* - The methods keyDown, keyUp, and flagsChanged... These really shouldn't ever - get hit. We automatically say we can be first responder if we are a window. - So, the handling should get handled by the view. This is here more as a - last resort (i.e., this is code that can potentially be removed). - */ -- (void)keyDown:(NSEvent *)theEvent -{ - bool keyOK = qt_dispatchKeyEvent(theEvent, [self QT_MANGLE_NAMESPACE(qt_qwidget)]); - if (!keyOK) - [super keyDown:theEvent]; -} - -- (void)keyUp:(NSEvent *)theEvent -{ - bool keyOK = qt_dispatchKeyEvent(theEvent, [self QT_MANGLE_NAMESPACE(qt_qwidget)]); - if (!keyOK) - [super keyUp:theEvent]; -} - - (void)flagsChanged:(NSEvent *)theEvent { qt_dispatchModifiersChanged(theEvent, [self QT_MANGLE_NAMESPACE(qt_qwidget)]); diff --git a/src/gui/kernel/qcocoaview_mac.mm b/src/gui/kernel/qcocoaview_mac.mm index 2482fb34ee..47772b632f 100644 --- a/src/gui/kernel/qcocoaview_mac.mm +++ b/src/gui/kernel/qcocoaview_mac.mm @@ -1099,8 +1099,15 @@ extern "C" { } if (sendKeyEvents && !composing) { bool keyOK = qt_dispatchKeyEvent(theEvent, widgetToGetKey); - if (!keyOK && !sendToPopup) - [super keyDown:theEvent]; + if (!keyOK && !sendToPopup) { + // find the first responder that is not created by Qt and forward + // the event to it (for example if Qt widget is embedded into native). + QWidget *toplevel = qwidget->window(); + if (toplevel && qt_widget_private(toplevel)->topData()->embedded) { + if (NSResponder *w = [qt_mac_nativeview_for(toplevel) superview]) + [w keyDown:theEvent]; + } + } } } @@ -1109,8 +1116,13 @@ extern "C" { { if (sendKeyEvents) { bool keyOK = qt_dispatchKeyEvent(theEvent, qwidget); - if (!keyOK) - [super keyUp:theEvent]; + if (!keyOK) { + QWidget *toplevel = qwidget->window(); + if (toplevel && qt_widget_private(toplevel)->topData()->embedded) { + if (NSResponder *w = [qt_mac_nativeview_for(toplevel) superview]) + [w keyUp:theEvent]; + } + } } } diff --git a/src/gui/kernel/qt_cocoa_helpers_mac.mm b/src/gui/kernel/qt_cocoa_helpers_mac.mm index e9489e1118..cf77e8806f 100644 --- a/src/gui/kernel/qt_cocoa_helpers_mac.mm +++ b/src/gui/kernel/qt_cocoa_helpers_mac.mm @@ -642,8 +642,7 @@ bool qt_dispatchKeyEventWithCocoa(void * /*NSEvent * */ keyEvent, QWidget *widge UInt32 macScanCode = 1; QKeyEventEx ke(cocoaEvent2QtEvent([event type]), qtKey, keyMods, text, [event isARepeat], qMax(1, keyLength), macScanCode, [event keyCode], [event modifierFlags]); - qt_sendSpontaneousEvent(widgetToGetEvent, &ke); - return ke.isAccepted(); + return qt_sendSpontaneousEvent(widgetToGetEvent, &ke) && ke.isAccepted(); } #endif @@ -670,8 +669,8 @@ bool qt_dispatchKeyEvent(void * /*NSEvent * */ keyEvent, QWidget *widgetToGetEve if (mustUseCocoaKeyEvent()) return qt_dispatchKeyEventWithCocoa(keyEvent, widgetToGetEvent); bool isAccepted; - qt_keymapper_private()->translateKeyEvent(widgetToGetEvent, 0, key_event, &isAccepted, true); - return isAccepted; + bool consumed = qt_keymapper_private()->translateKeyEvent(widgetToGetEvent, 0, key_event, &isAccepted, true); + return consumed && isAccepted; #endif } |