From 7a9c5eea815dbc124503180d91eb835ede3f3e50 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Thu, 30 Jun 2011 12:24:35 +0300 Subject: Add a touchscreen generic qpa plugin. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Iaf79df05eb4f60d254d95f5d0f280a8f8f8a8de8 Reviewed-on: http://codereview.qt.nokia.com/941 Reviewed-by: Jørgen Lind --- .../generic/touchscreen/qtoucheventsenderqpa.cpp | 113 +++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 src/plugins/generic/touchscreen/qtoucheventsenderqpa.cpp (limited to 'src/plugins/generic/touchscreen/qtoucheventsenderqpa.cpp') diff --git a/src/plugins/generic/touchscreen/qtoucheventsenderqpa.cpp b/src/plugins/generic/touchscreen/qtoucheventsenderqpa.cpp new file mode 100644 index 0000000000..7dff55b1bc --- /dev/null +++ b/src/plugins/generic/touchscreen/qtoucheventsenderqpa.cpp @@ -0,0 +1,113 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the plugins module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qtoucheventsenderqpa.h" +#include +#include +#include + +QT_BEGIN_NAMESPACE + +//#define POINT_DEBUG +//#define FORCE_TO_ACTIVE_WINDOW + +void QTouchEventSenderQPA::touch_configure(int x_min, int x_max, int y_min, int y_max) +{ + hw_range_x_min = x_min; + hw_range_x_max = x_max; + hw_range_y_min = y_min; + hw_range_y_max = y_max; +} + +void QTouchEventSenderQPA::touch_point(QEvent::Type state, + const QList &points) +{ +#ifdef FORCE_TO_ACTIVE_WINDOW + QWidget *win = QApplication::activeWindow(); // ### migrate to QWindow later on + if (!win) { +#ifdef POINT_DEBUG + qDebug("sendTouchEvent: No active window"); +#endif + return; + } + const QRect winRect = win->geometry(); +#else + const QRect winRect = QApplication::desktop()->screenGeometry(); +#endif + +#ifdef POINT_DEBUG + qDebug() << points.size() << "points" << winRect << state; +#endif + + QList touchPoints = points; + // Translate the coordinates and set the normalized position. QPA expects + // 'area' to be in screen coordinates, while the device reports them in its + // own system with (0, 0) being the center point of the device. + for (int i = 0; i < touchPoints.size(); ++i) { + QWindowSystemInterface::TouchPoint &tp(touchPoints[i]); + + // Translate so that (0, 0) is the top-left corner. + const int hw_x = qBound(hw_range_x_min, int(tp.area.left()), hw_range_x_max) - hw_range_x_min; + const int hw_y = qBound(hw_range_y_min, int(tp.area.top()), hw_range_y_max) - hw_range_y_min; + + // Get a normalized position in range 0..1. + const int hw_w = hw_range_x_max - hw_range_x_min; + const int hw_h = hw_range_y_max - hw_range_y_min; + tp.normalPosition = QPointF(hw_x / qreal(hw_w), + hw_y / qreal(hw_h)); + + qreal nx = tp.normalPosition.x(); + qreal ny = tp.normalPosition.y(); + + // Generate a screen position that is always inside the active window or the default screen. + const int wx = winRect.left() + int(nx * winRect.width()); + const int wy = winRect.top() + int(ny * winRect.height()); + tp.area.moveTopLeft(QPoint(wx, wy)); + +#ifdef POINT_DEBUG + qDebug() << " " << i << tp.area << tp.state << tp.id << tp.isPrimary << tp.pressure; +#endif + } + + QWindowSystemInterface::handleTouchEvent(0, state, QTouchEvent::TouchScreen, touchPoints); +} + +QT_END_NAMESPACE -- cgit v1.2.3