Cocoa: Unify mouse handling logic

Reduce the code duplication for the various button
type handlers. Fan in: (example)
	rightMouseDown
	handleMouseDownEvent
	handleMouseEvent

The primary mouseDown function is still separate
with some duplicated logic.

Remove the "invalid button tracking" warning. qWarnings
are for application developers in case of improper
use of API etc, not internal Qt errors.

Change-Id: Idb1a311e37446399668c2a207831fccc84716ca1
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@theqtcompany.com>
This commit is contained in:
Morten Johan Sørvig 2015-11-10 12:43:59 +01:00 committed by Timur Pocheptsov
parent 3ee01f7403
commit 820e69d6c2
2 changed files with 106 additions and 66 deletions

View File

@ -118,6 +118,9 @@ Q_FORWARD_DECLARE_OBJC_CLASS(QT_MANGLE_NAMESPACE(QNSViewMouseMoveHelper));
- (void)resetMouseButtons; - (void)resetMouseButtons;
- (void)handleMouseEvent:(NSEvent *)theEvent; - (void)handleMouseEvent:(NSEvent *)theEvent;
- (bool)handleMouseDownEvent:(NSEvent *)theEvent;
- (bool)handleMouseDraggedEvent:(NSEvent *)theEvent;
- (bool)handleMouseUpEvent:(NSEvent *)theEvent;
- (void)mouseDown:(NSEvent *)theEvent; - (void)mouseDown:(NSEvent *)theEvent;
- (void)mouseDragged:(NSEvent *)theEvent; - (void)mouseDragged:(NSEvent *)theEvent;
- (void)mouseUp:(NSEvent *)theEvent; - (void)mouseUp:(NSEvent *)theEvent;

View File

@ -818,6 +818,61 @@ QT_WARNING_POP
QWindowSystemInterface::handleFrameStrutMouseEvent(m_window, timestamp, qtWindowPoint, qtScreenPoint, m_frameStrutButtons); QWindowSystemInterface::handleFrameStrutMouseEvent(m_window, timestamp, qtWindowPoint, qtScreenPoint, m_frameStrutButtons);
} }
- (bool)handleMouseDownEvent:(NSEvent *)theEvent
{
if (m_window && (m_window->flags() & Qt::WindowTransparentForInput))
return false;
Qt::MouseButton button = cocoaButton2QtButton([theEvent buttonNumber]);
if (button == Qt::RightButton)
m_sendUpAsRightButton = true;
m_buttons |= button;
[self handleMouseEvent:theEvent];
return true;
}
- (bool)handleMouseDraggedEvent:(NSEvent *)theEvent
{
if (m_window && (m_window->flags() & Qt::WindowTransparentForInput))
return false;
Qt::MouseButton button = cocoaButton2QtButton([theEvent buttonNumber]);
// Forward the event to the next responder if Qt did not accept the
// corresponding mouse down for this button
if (!m_acceptedMouseDowns.contains(button))
return false;
if (!(m_buttons & (m_sendUpAsRightButton ? Qt::RightButton : Qt::LeftButton))) {
qCWarning(lcQpaCocoaWindow) << "QNSView mouseDragged: Internal mouse button tracking"
<< "invalid (missing Qt::LeftButton)";
}
[self handleMouseEvent:theEvent];
return true;
}
- (bool)handleMouseUpEvent:(NSEvent *)theEvent
{
if (m_window && (m_window->flags() & Qt::WindowTransparentForInput))
return false;
Qt::MouseButton button = cocoaButton2QtButton([theEvent buttonNumber]);
if (m_sendUpAsRightButton && button == Qt::LeftButton)
button = Qt::RightButton;
if (button == Qt::RightButton)
m_sendUpAsRightButton = false;
m_buttons &= ~button;
[self handleMouseEvent:theEvent];
return true;
}
- (void)mouseDown:(NSEvent *)theEvent - (void)mouseDown:(NSEvent *)theEvent
{ {
if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) ) if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
@ -871,24 +926,58 @@ QT_WARNING_POP
- (void)mouseDragged:(NSEvent *)theEvent - (void)mouseDragged:(NSEvent *)theEvent
{ {
if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) ) const bool accepted = [self handleMouseDraggedEvent:theEvent];
return [super mouseDragged:theEvent]; if (!accepted)
if (!(m_buttons & (m_sendUpAsRightButton ? Qt::RightButton : Qt::LeftButton))) [super mouseDragged:theEvent];
qWarning("QNSView mouseDragged: Internal mouse button tracking invalid (missing Qt::LeftButton)");
[self handleMouseEvent:theEvent];
} }
- (void)mouseUp:(NSEvent *)theEvent - (void)mouseUp:(NSEvent *)theEvent
{ {
if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) ) const bool accepted = [self handleMouseUpEvent:theEvent];
return [super mouseUp:theEvent]; if (!accepted)
if (m_sendUpAsRightButton) { [super mouseUp:theEvent];
m_buttons &= ~Qt::RightButton; }
m_sendUpAsRightButton = false;
} else { - (void)rightMouseDown:(NSEvent *)theEvent
m_buttons &= ~Qt::LeftButton; {
} const bool accepted = [self handleMouseDownEvent:theEvent];
[self handleMouseEvent:theEvent]; if (!accepted)
[super rightMouseDown:theEvent];
}
- (void)rightMouseDragged:(NSEvent *)theEvent
{
const bool accepted = [self handleMouseDraggedEvent:theEvent];
if (!accepted)
[super rightMouseDragged:theEvent];
}
- (void)rightMouseUp:(NSEvent *)theEvent
{
const bool accepted = [self handleMouseUpEvent:theEvent];
if (!accepted)
[super rightMouseUp:theEvent];
}
- (void)otherMouseDown:(NSEvent *)theEvent
{
const bool accepted = [self handleMouseDownEvent:theEvent];
if (!accepted)
[super otherMouseDown:theEvent];
}
- (void)otherMouseDragged:(NSEvent *)theEvent
{
const bool accepted = [self handleMouseDraggedEvent:theEvent];
if (!accepted)
[super otherMouseDragged:theEvent];
}
- (void)otherMouseUp:(NSEvent *)theEvent
{
const bool accepted = [self handleMouseUpEvent:theEvent];
if (!accepted)
[super otherMouseUp:theEvent];
} }
- (void)updateTrackingAreas - (void)updateTrackingAreas
@ -999,58 +1088,6 @@ QT_WARNING_POP
m_platformWindow->m_enterLeaveTargetWindow = 0; m_platformWindow->m_enterLeaveTargetWindow = 0;
} }
- (void)rightMouseDown:(NSEvent *)theEvent
{
if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
return [super rightMouseDown:theEvent];
m_buttons |= Qt::RightButton;
m_sendUpAsRightButton = true;
[self handleMouseEvent:theEvent];
}
- (void)rightMouseDragged:(NSEvent *)theEvent
{
if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
return [super rightMouseDragged:theEvent];
if (!(m_buttons & Qt::RightButton))
qWarning("QNSView rightMouseDragged: Internal mouse button tracking invalid (missing Qt::RightButton)");
[self handleMouseEvent:theEvent];
}
- (void)rightMouseUp:(NSEvent *)theEvent
{
if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
return [super rightMouseUp:theEvent];
m_buttons &= ~Qt::RightButton;
m_sendUpAsRightButton = false;
[self handleMouseEvent:theEvent];
}
- (void)otherMouseDown:(NSEvent *)theEvent
{
if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
return [super otherMouseDown:theEvent];
m_buttons |= cocoaButton2QtButton([theEvent buttonNumber]);
[self handleMouseEvent:theEvent];
}
- (void)otherMouseDragged:(NSEvent *)theEvent
{
if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
return [super otherMouseDragged:theEvent];
if (!(m_buttons & ~(Qt::LeftButton | Qt::RightButton)))
qWarning("QNSView otherMouseDragged: Internal mouse button tracking invalid (missing Qt::MiddleButton or Qt::ExtraButton*)");
[self handleMouseEvent:theEvent];
}
- (void)otherMouseUp:(NSEvent *)theEvent
{
if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
return [super otherMouseUp:theEvent];
m_buttons &= ~cocoaButton2QtButton([theEvent buttonNumber]);
[self handleMouseEvent:theEvent];
}
struct QCocoaTabletDeviceData struct QCocoaTabletDeviceData
{ {
QTabletEvent::TabletDevice device; QTabletEvent::TabletDevice device;