summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorGabriel de Dietrich <gabriel.dedietrich@digia.com>2013-02-08 17:12:02 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-02-11 17:51:24 +0100
commitd57e9b35c94ae6075db0688b954624cb6f32ec51 (patch)
tree12b55be036c7740bed3610313ba1eab7c00158b3 /src/plugins
parent34a3f2cd442ff1396e508f7a8890b968f1bb3179 (diff)
QPA Cocoa Menu: Make sure mouse button state is clean after popup
Calling popUpMenuPositioningItem:atLocation:inView: will swallow any mouse up/released event, if we popup on mouse down/pressed. Since we cache the button state in QNSView, the safest way seems to be to clear this button state. Another option would be to send Cocoa mouse up events for each mouse button, but we prefer to keep things simple. Change-Id: I7f3f369c45e9f5ed9d2ab693bffd8be4a4596ae6 Reviewed-by: Morten Johan Sørvig <morten.sorvig@digia.com>
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenu.mm17
-rw-r--r--src/plugins/platforms/cocoa/qnsview.h2
-rw-r--r--src/plugins/platforms/cocoa/qnsview.mm5
3 files changed, 12 insertions, 12 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoamenu.mm b/src/plugins/platforms/cocoa/qcocoamenu.mm
index ff3aeaeb11..a92f4e875c 100644
--- a/src/plugins/platforms/cocoa/qcocoamenu.mm
+++ b/src/plugins/platforms/cocoa/qcocoamenu.mm
@@ -48,6 +48,7 @@
#include "qcocoaapplication.h"
#include "qcocoamenuloader.h"
#include "qcocoawindow.h"
+#import "qnsview.h"
static inline QT_MANGLE_NAMESPACE(QCocoaMenuLoader) *getMenuLoader()
{
@@ -313,18 +314,10 @@ void QCocoaMenu::showPopup(const QWindow *parentWindow, QPoint pos, const QPlatf
NSPoint nsPos = NSMakePoint(pos.x(), pos.y());
[m_nativeMenu popUpMenuPositioningItem:nsItem atLocation:nsPos inView:view];
- // The call above blocks and swallows the mouse release event, so we send a
- // synthetic one to bring back any QQuickMouseArea back to a more normal state.
- NSEvent *releaseEvent = [NSEvent mouseEventWithType:NSLeftMouseUp
- location:nsPos
- modifierFlags:0
- timestamp:0
- windowNumber:view.window.windowNumber
- context:[NSGraphicsContext currentContext]
- eventNumber:0
- clickCount:0
- pressure:1.0];
- [view.window sendEvent:releaseEvent];
+ // The call above blocks, and also swallows any mouse release event,
+ // so we need to clear any mouse button that triggered the menu popup.
+ if ([view isKindOfClass:[QNSView class]])
+ [(QNSView *)view resetMouseButtons];
}
QPlatformMenuItem *QCocoaMenu::menuItemAt(int position) const
diff --git a/src/plugins/platforms/cocoa/qnsview.h b/src/plugins/platforms/cocoa/qnsview.h
index 8bccc2cf33..eec0cfe5f6 100644
--- a/src/plugins/platforms/cocoa/qnsview.h
+++ b/src/plugins/platforms/cocoa/qnsview.h
@@ -84,6 +84,8 @@ QT_END_NAMESPACE
- (BOOL)acceptsFirstResponder;
- (BOOL)becomeFirstResponder;
+- (void)resetMouseButtons;
+
- (void)handleMouseEvent:(NSEvent *)theEvent;
- (void)mouseDown:(NSEvent *)theEvent;
- (void)mouseDragged:(NSEvent *)theEvent;
diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm
index 5d39dd2d9c..82fde6221d 100644
--- a/src/plugins/platforms/cocoa/qnsview.mm
+++ b/src/plugins/platforms/cocoa/qnsview.mm
@@ -398,6 +398,11 @@ static QTouchDevice *touchDevice = 0;
}
}
+- (void)resetMouseButtons
+{
+ m_buttons = Qt::NoButton;
+}
+
- (void)handleMouseEvent:(NSEvent *)theEvent
{
QPoint qtWindowPoint, qtScreenPoint;