Added rotation parameter to qevdevtouch

In some cases the event coordinates reported by evdev are in different
orientation compared to the primary orientation of the platform window.
This commit adds plugin parameter rotate=[90, 180, 270] to rotate the
normalized coordinate system before reporting the touch event.

Change-Id: Ic830a2d259f9d3c5fb63b80afb795d8b400c2ece
Reviewed-by: Andy Nichols <andy.nichols@digia.com>
This commit is contained in:
Mikko Harju 2013-06-03 15:26:27 +03:00 committed by The Qt Project
parent c9398312fe
commit fdde071b06

View File

@ -125,6 +125,7 @@ public:
bool m_forceToActiveWindow;
QTouchDevice *m_device;
bool m_typeB;
QTransform m_rotate;
};
QEvdevTouchScreenData::QEvdevTouchScreenData(QEvdevTouchScreenHandler *q_ptr, const QStringList &args)
@ -177,10 +178,24 @@ QEvdevTouchScreenHandler::QEvdevTouchScreenHandler(const QString &specification,
QStringList args = spec.split(QLatin1Char(':'));
int rotationAngle = 0;
for (int i = 0; i < args.count(); ++i) {
if (args.at(i).startsWith(QLatin1String("/dev/"))) {
if (args.at(i).startsWith(QLatin1String("/dev/")) && dev.isEmpty()) {
dev = args.at(i);
break;
} else if (args.at(i).startsWith(QLatin1String("rotate"))) {
QString rotateArg = args.at(i).section(QLatin1Char('='), 1, 1);
bool ok;
uint argValue = rotateArg.toUInt(&ok);
if (ok) {
switch (argValue) {
case 90:
case 180:
case 270:
rotationAngle = argValue;
default:
break;
}
}
}
}
@ -265,6 +280,9 @@ QEvdevTouchScreenHandler::QEvdevTouchScreenHandler(const QString &specification,
#endif
qDebug("Protocol type %c %s", d->m_typeB ? 'B' : 'A', mtdevStr);
if (rotationAngle)
d->m_rotate = QTransform::fromTranslate(0.5, 0.5).rotate(rotationAngle).translate(-0.5, -0.5);
d->registerDevice();
}
@ -421,6 +439,9 @@ void QEvdevTouchScreenData::processInputEvent(input_event *data)
tp.normalPosition = QPointF((contact.x - hw_range_x_min) / qreal(hw_range_x_max - hw_range_x_min),
(contact.y - hw_range_y_min) / qreal(hw_range_y_max - hw_range_y_min));
if (!m_rotate.isIdentity())
tp.normalPosition = m_rotate.map(tp.normalPosition);
tp.rawPositions.append(QPointF(contact.x, contact.y));
m_touchPoints.append(tp);