summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohan Klokkhammer Helsing <johan.helsing@qt.io>2019-09-04 11:47:13 +0200
committerJohan Helsing <johan.helsing@qt.io>2019-09-10 08:59:09 +0000
commit4121e26d2bc235703603e812eef533b8b2e16d18 (patch)
treec3b71ed12b48e88035281b77a67cd768f64214e0
parentac80dfb5b921437b699a992d1f211e8edf4d7844 (diff)
Client: Fix touch rounding errors
Touch now accounts for fractional input in the same way as for pointer input. Task-number: QTBUG-77457 Change-Id: I18e633bf7c7033187a641f757b8b24f52479971a Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io> (cherry picked from commit b1a534a536892035fdf1e826a066bda6ab34b93a) Reviewed-by: Pier Luigi Fiorini <pierluigi.fiorini@liri.io>
-rw-r--r--src/client/qwaylandinputdevice.cpp18
-rw-r--r--src/client/qwaylandinputdevice_p.h2
2 files changed, 13 insertions, 7 deletions
diff --git a/src/client/qwaylandinputdevice.cpp b/src/client/qwaylandinputdevice.cpp
index 6016589a6..e781d4768 100644
--- a/src/client/qwaylandinputdevice.cpp
+++ b/src/client/qwaylandinputdevice.cpp
@@ -867,14 +867,15 @@ void QWaylandInputDevice::Touch::touch_down(uint32_t serial,
mParent->mSerial = serial;
mFocus = window;
mParent->mQDisplay->setLastInputDevice(mParent, serial, mFocus);
- mParent->handleTouchPoint(id, wl_fixed_to_double(x), wl_fixed_to_double(y), Qt::TouchPointPressed);
+ QPointF position(wl_fixed_to_double(x), wl_fixed_to_double(y));
+ mParent->handleTouchPoint(id, Qt::TouchPointPressed, position);
}
void QWaylandInputDevice::Touch::touch_up(uint32_t serial, uint32_t time, int32_t id)
{
Q_UNUSED(serial);
Q_UNUSED(time);
- mParent->handleTouchPoint(id, 0, 0, Qt::TouchPointReleased);
+ mParent->handleTouchPoint(id, Qt::TouchPointReleased);
if (allTouchPointsReleased()) {
mFocus = nullptr;
@@ -893,7 +894,8 @@ void QWaylandInputDevice::Touch::touch_up(uint32_t serial, uint32_t time, int32_
void QWaylandInputDevice::Touch::touch_motion(uint32_t time, int32_t id, wl_fixed_t x, wl_fixed_t y)
{
Q_UNUSED(time);
- mParent->handleTouchPoint(id, wl_fixed_to_double(x), wl_fixed_to_double(y), Qt::TouchPointMoved);
+ QPointF position(wl_fixed_to_double(x), wl_fixed_to_double(y));
+ mParent->handleTouchPoint(id, Qt::TouchPointMoved, position);
}
void QWaylandInputDevice::Touch::touch_cancel()
@@ -907,7 +909,7 @@ void QWaylandInputDevice::Touch::touch_cancel()
QWindowSystemInterface::handleTouchCancelEvent(nullptr, mParent->mTouchDevice);
}
-void QWaylandInputDevice::handleTouchPoint(int id, double x, double y, Qt::TouchPointState state)
+void QWaylandInputDevice::handleTouchPoint(int id, Qt::TouchPointState state, const QPointF &surfacePosition)
{
auto end = mTouch->mPendingTouchPoints.end();
auto it = std::find_if(mTouch->mPendingTouchPoints.begin(), end, [id](auto tp){ return tp.id == id; });
@@ -919,7 +921,6 @@ void QWaylandInputDevice::handleTouchPoint(int id, double x, double y, Qt::Touch
// Only moved and pressed needs to update/set position
if (state == Qt::TouchPointMoved || state == Qt::TouchPointPressed) {
- // x and y are surface relative.
// We need a global (screen) position.
QWaylandWindow *win = mTouch->mFocus;
@@ -933,7 +934,12 @@ void QWaylandInputDevice::handleTouchPoint(int id, double x, double y, Qt::Touch
tp.area = QRectF(0, 0, 8, 8);
QMargins margins = win->frameMargins();
- tp.area.moveCenter(win->window()->mapToGlobal(QPoint(x - margins.left(), y - margins.top())));
+ QPointF localPosition = surfacePosition - QPointF(margins.left(), margins.top());
+ // TODO: This doesn't account for high dpi scaling for the delta, but at least it matches
+ // what we have for mouse input.
+ QPointF delta = localPosition - localPosition.toPoint();
+ QPointF globalPosition = win->window()->mapToGlobal(localPosition.toPoint()) + delta;
+ tp.area.moveCenter(globalPosition);
}
tp.state = state;
diff --git a/src/client/qwaylandinputdevice_p.h b/src/client/qwaylandinputdevice_p.h
index d9bae9836..b6bd514c3 100644
--- a/src/client/qwaylandinputdevice_p.h
+++ b/src/client/qwaylandinputdevice_p.h
@@ -165,7 +165,7 @@ private:
uint32_t mSerial = 0;
void seat_capabilities(uint32_t caps) override;
- void handleTouchPoint(int id, double x, double y, Qt::TouchPointState state);
+ void handleTouchPoint(int id, Qt::TouchPointState state, const QPointF &surfacePosition = QPoint());
QTouchDevice *mTouchDevice = nullptr;