diff options
author | Denis Dzyubenko <denis.dzyubenko@nokia.com> | 2009-11-26 16:32:51 (GMT) |
---|---|---|
committer | Denis Dzyubenko <denis.dzyubenko@nokia.com> | 2009-12-02 16:10:55 (GMT) |
commit | 0b2eab87ad3bd73a0744469a45c29ca098649c9b (patch) | |
tree | d5b26bc05eaf96c3b665aaf750135c7676db6002 /src/gui/kernel/qcocoapanel_mac.mm | |
parent | 271936b063fb261293e3f77f7a2273e3a4dbb5d6 (diff) | |
download | Qt-0b2eab87ad3bd73a0744469a45c29ca098649c9b.zip Qt-0b2eab87ad3bd73a0744469a45c29ca098649c9b.tar.gz Qt-0b2eab87ad3bd73a0744469a45c29ca098649c9b.tar.bz2 |
Improved implicit mouse grabbing on Cocoa.
This improves 106121a74bca32a6411b9ca968ee415f8bdfbff1 which was incomplete and
didn't work properly for comboboxes (or in general - when a popup window opens
due to a mouse press).
Reviewed-by: Prasanth
Diffstat (limited to 'src/gui/kernel/qcocoapanel_mac.mm')
-rw-r--r-- | src/gui/kernel/qcocoapanel_mac.mm | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/src/gui/kernel/qcocoapanel_mac.mm b/src/gui/kernel/qcocoapanel_mac.mm index a26d775..d201653 100644 --- a/src/gui/kernel/qcocoapanel_mac.mm +++ b/src/gui/kernel/qcocoapanel_mac.mm @@ -52,6 +52,7 @@ QT_FORWARD_DECLARE_CLASS(QWidget); QT_BEGIN_NAMESPACE extern Qt::MouseButton cocoaButton2QtButton(NSInteger buttonNum); // qcocoaview.mm +extern QPointer<QWidget> qt_button_down; //qapplication_mac.cpp QT_END_NAMESPACE QT_USE_NAMESPACE @@ -132,38 +133,41 @@ QT_USE_NAMESPACE QT_MANGLE_NAMESPACE(QCocoaView) *view = static_cast<QT_MANGLE_NAMESPACE(QCocoaView) *>(qt_mac_nativeview_for(widget)); Qt::MouseButton mouseButton = cocoaButton2QtButton([event buttonNumber]); + bool handled = false; // sometimes need to redirect mouse events to the popup. QWidget *popup = qAppInstance()->activePopupWidget(); - if (popup && popup != widget) { + if (popup) { switch([event type]) { case NSLeftMouseDown: - qt_mac_handleMouseEvent(view, event, QEvent::MouseButtonPress, mouseButton); + if (!qt_button_down) + qt_button_down = widget; + handled = qt_mac_handleMouseEvent(view, event, QEvent::MouseButtonPress, mouseButton); // Don't call super here. This prevents us from getting the mouseUp event, // which we need to send even if the mouseDown event was not accepted. // (this is standard Qt behavior.) break; case NSRightMouseDown: case NSOtherMouseDown: - if (!qt_mac_handleMouseEvent(view, event, QEvent::MouseButtonPress, mouseButton)) - [super sendEvent:event]; + if (!qt_button_down) + qt_button_down = widget; + handled = qt_mac_handleMouseEvent(view, event, QEvent::MouseButtonPress, mouseButton); break; case NSLeftMouseUp: case NSRightMouseUp: case NSOtherMouseUp: - if (!qt_mac_handleMouseEvent(view, event, QEvent::MouseButtonRelease, mouseButton)) - [super sendEvent:event]; + handled = qt_mac_handleMouseEvent(view, event, QEvent::MouseButtonRelease, mouseButton); + qt_button_down = 0; break; case NSMouseMoved: - qt_mac_handleMouseEvent(view, event, QEvent::MouseMove, Qt::NoButton); + handled = qt_mac_handleMouseEvent(view, event, QEvent::MouseMove, Qt::NoButton); break; case NSLeftMouseDragged: case NSRightMouseDragged: case NSOtherMouseDragged: [QT_MANGLE_NAMESPACE(QCocoaView) currentMouseEvent]->view = view; [QT_MANGLE_NAMESPACE(QCocoaView) currentMouseEvent]->theEvent = event; - if (!qt_mac_handleMouseEvent(view, event, QEvent::MouseMove, mouseButton)) - [super sendEvent:event]; + handled = qt_mac_handleMouseEvent(view, event, QEvent::MouseMove, mouseButton); break; default: [super sendEvent:event]; @@ -172,8 +176,9 @@ QT_USE_NAMESPACE } else { [super sendEvent:event]; } - qt_mac_dispatchNCMouseMessage(self, event, [self QT_MANGLE_NAMESPACE(qt_qwidget)], leftButtonIsRightButton); + if (!handled) + qt_mac_dispatchNCMouseMessage(self, event, [self QT_MANGLE_NAMESPACE(qt_qwidget)], leftButtonIsRightButton); [self release]; } |