summaryrefslogtreecommitdiffstats
path: root/src/gui/kernel/qcocoapanel_mac.mm
diff options
context:
space:
mode:
authorDenis Dzyubenko <denis.dzyubenko@nokia.com>2009-11-26 16:32:51 (GMT)
committerDenis Dzyubenko <denis.dzyubenko@nokia.com>2009-12-02 16:10:55 (GMT)
commit0b2eab87ad3bd73a0744469a45c29ca098649c9b (patch)
treed5b26bc05eaf96c3b665aaf750135c7676db6002 /src/gui/kernel/qcocoapanel_mac.mm
parent271936b063fb261293e3f77f7a2273e3a4dbb5d6 (diff)
downloadQt-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.mm25
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];
}