OS X: Fix pan gestures.
The QPanGesture recognizer requires single-point touch events. The touch implementation in Qt 4 would test Qt::WA_TouchPadAcceptSingleTouchEvents and forward single touch events if set. Making this work in Qt 5 is a little bit more involved since the platform plugins don't know about widgets. Change the Cocoa touch implementation to send single-point touch events to QWidgetWindow windows only. Make QApplication forward single-point touch events only if the target widget has the Qt::WA_TouchPadAcceptSingleTouchEvents attribute set. Task-number: QTBUG-35893 Change-Id: I68712a5e3efb4ece7a81ca42f49c412e525eeb3a Reviewed-by: Jake Petroules <jake.petroules@petroules.com>
This commit is contained in:
parent
7dce962200
commit
30bb830fc1
@ -1124,10 +1124,17 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent)
|
||||
}
|
||||
}
|
||||
|
||||
- (bool) shouldSendSingleTouch
|
||||
{
|
||||
// QtWidgets expects single-point touch events, QtDeclarative does not.
|
||||
// Until there is an API we solve this by looking at the window class type.
|
||||
return m_window->inherits("QWidgetWindow");
|
||||
}
|
||||
|
||||
- (void)touchesBeganWithEvent:(NSEvent *)event
|
||||
{
|
||||
const NSTimeInterval timestamp = [event timestamp];
|
||||
const QList<QWindowSystemInterface::TouchPoint> points = QCocoaTouch::getCurrentTouchPointList(event, /*acceptSingleTouch= ### true or false?*/false);
|
||||
const QList<QWindowSystemInterface::TouchPoint> points = QCocoaTouch::getCurrentTouchPointList(event, [self shouldSendSingleTouch]);
|
||||
qCDebug(lcQpaTouch) << "touchesBeganWithEvent" << points;
|
||||
QWindowSystemInterface::handleTouchEvent(m_window, timestamp * 1000, touchDevice, points);
|
||||
}
|
||||
@ -1135,7 +1142,7 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent)
|
||||
- (void)touchesMovedWithEvent:(NSEvent *)event
|
||||
{
|
||||
const NSTimeInterval timestamp = [event timestamp];
|
||||
const QList<QWindowSystemInterface::TouchPoint> points = QCocoaTouch::getCurrentTouchPointList(event, /*acceptSingleTouch= ### true or false?*/false);
|
||||
const QList<QWindowSystemInterface::TouchPoint> points = QCocoaTouch::getCurrentTouchPointList(event, [self shouldSendSingleTouch]);
|
||||
qCDebug(lcQpaTouch) << "touchesMovedWithEvent" << points;
|
||||
QWindowSystemInterface::handleTouchEvent(m_window, timestamp * 1000, touchDevice, points);
|
||||
}
|
||||
@ -1143,7 +1150,7 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent)
|
||||
- (void)touchesEndedWithEvent:(NSEvent *)event
|
||||
{
|
||||
const NSTimeInterval timestamp = [event timestamp];
|
||||
const QList<QWindowSystemInterface::TouchPoint> points = QCocoaTouch::getCurrentTouchPointList(event, /*acceptSingleTouch= ### true or false?*/false);
|
||||
const QList<QWindowSystemInterface::TouchPoint> points = QCocoaTouch::getCurrentTouchPointList(event, [self shouldSendSingleTouch]);
|
||||
qCDebug(lcQpaTouch) << "touchesEndedWithEvent" << points;
|
||||
QWindowSystemInterface::handleTouchEvent(m_window, timestamp * 1000, touchDevice, points);
|
||||
}
|
||||
@ -1151,7 +1158,7 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent)
|
||||
- (void)touchesCancelledWithEvent:(NSEvent *)event
|
||||
{
|
||||
const NSTimeInterval timestamp = [event timestamp];
|
||||
const QList<QWindowSystemInterface::TouchPoint> points = QCocoaTouch::getCurrentTouchPointList(event, /*acceptSingleTouch= ### true or false?*/false);
|
||||
const QList<QWindowSystemInterface::TouchPoint> points = QCocoaTouch::getCurrentTouchPointList(event, [self shouldSendSingleTouch]);
|
||||
qCDebug(lcQpaTouch) << "touchesCancelledWithEvent" << points;
|
||||
QWindowSystemInterface::handleTouchEvent(m_window, timestamp * 1000, touchDevice, points);
|
||||
}
|
||||
|
@ -4343,7 +4343,16 @@ bool QApplicationPrivate::translateRawTouchEvent(QWidget *window,
|
||||
}
|
||||
Q_ASSERT(target.data() != 0);
|
||||
|
||||
StatesAndTouchPoints &maskAndPoints = widgetsNeedingEvents[static_cast<QWidget *>(target.data())];
|
||||
QWidget *targetWidget = static_cast<QWidget *>(target.data());
|
||||
|
||||
#ifdef Q_OS_OSX
|
||||
// Single-touch events are normally not sent unless WA_TouchPadAcceptSingleTouchEvents is set.
|
||||
// In Qt 4 this check was in OS X-only coode. That behavior is preserved here by the #ifdef.
|
||||
if (touchPoints.count() == 1 && !targetWidget->testAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents))
|
||||
continue;
|
||||
#endif
|
||||
|
||||
StatesAndTouchPoints &maskAndPoints = widgetsNeedingEvents[targetWidget];
|
||||
maskAndPoints.first |= touchPoint.state();
|
||||
maskAndPoints.second.append(touchPoint);
|
||||
}
|
||||
|
@ -1976,7 +1976,9 @@ public:
|
||||
|
||||
TouchEventPropagationTestWidget(QWidget *parent = 0)
|
||||
: QWidget(parent), seenTouchEvent(false), acceptTouchEvent(false), seenMouseEvent(false), acceptMouseEvent(false)
|
||||
{ }
|
||||
{
|
||||
setAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents);
|
||||
}
|
||||
|
||||
void reset()
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user