diff --git a/repos/libports/src/lib/qt5/qtbase/src/plugins/platforms/nitpicker/qnitpickerplatformwindow.cpp b/repos/libports/src/lib/qt5/qtbase/src/plugins/platforms/nitpicker/qnitpickerplatformwindow.cpp
index 6864d0aad..f202dfcfe 100644
--- a/repos/libports/src/lib/qt5/qtbase/src/plugins/platforms/nitpicker/qnitpickerplatformwindow.cpp
+++ b/repos/libports/src/lib/qt5/qtbase/src/plugins/platforms/nitpicker/qnitpickerplatformwindow.cpp
@@ -13,10 +13,10 @@
/* Genode includes */
+#include
#include
/* Qt includes */
-#include
#include
#include
#include
@@ -27,15 +27,70 @@ QT_BEGIN_NAMESPACE
static const bool qnpw_verbose = false/*true*/;
+QTouchDevice * QNitpickerPlatformWindow::_init_touch_device()
+{
+ QVector::iterator i = _touch_points.begin();
+ for (unsigned n = 0; i != _touch_points.end(); ++i, ++n) {
+ i->id = n;
+ i->state = Qt::TouchPointReleased;
+ }
+
+ QTouchDevice *dev = new QTouchDevice;
+
+ dev->setName("Genode multi-touch device");
+ dev->setType(QTouchDevice::TouchScreen);
+ dev->setCapabilities(QTouchDevice::Position);
+
+ QWindowSystemInterface::registerTouchDevice(dev);
+
+ return dev;
+}
+
+void QNitpickerPlatformWindow::_process_touch_events(QList const &events)
+{
+ if (events.empty()) return;
+
+ QList touch_points;
+ for (QList::const_iterator i = events.begin(); i != events.end(); ++i) {
+
+ /*
+ * Coordinates must be normalized to positions of the platform window.
+ * We lack information about the value ranges (min and max) of touch
+ * coordinates to normalize ourselves.
+ */
+ QPointF const pos((qreal)i->ax(), (qreal)i->ay() );
+
+ QWindowSystemInterface::TouchPoint &otp = _touch_points[i->code()];
+ QWindowSystemInterface::TouchPoint tp;
+
+ tp.id = i->code();
+ tp.area = QRectF(QPointF(0, 0), QSize(1, 1));
+
+ /* report 1x1 rectangular area centered at screen coordinates */
+ tp.area.moveCenter(QPointF(i->ax(), i->ay()));
+
+ if (i->rx() == -1 && i->ry() == -1) {
+ tp.state = Qt::TouchPointReleased;
+ tp.pressure = 0;
+ } else {
+ tp.state = otp.state == Qt::TouchPointReleased
+ ? Qt::TouchPointPressed : Qt::TouchPointMoved;
+ tp.pressure = 1;
+ }
+
+ otp = tp;
+ touch_points.push_back(tp);
+ }
+
+ QWindowSystemInterface::handleTouchEvent(0, _touch_device, touch_points);
+}
+
void QNitpickerPlatformWindow::_process_mouse_event(Input::Event *ev)
{
QPoint global_position(ev->ax(), ev->ay());
QPoint local_position(global_position.x() - geometry().x(),
global_position.y() - geometry().y());
- //qDebug() << "local_position =" << local_position;
- //qDebug() << "global_position =" << global_position;
-
switch (ev->type()) {
case Input::Event::PRESS:
@@ -136,6 +191,7 @@ void QNitpickerPlatformWindow::_key_repeat()
void QNitpickerPlatformWindow::_handle_input(unsigned int)
{
+ QList touch_events;
for (int i = 0, num_ev = _input_session.flush(); i < num_ev; i++) {
Input::Event *ev = &_ev_buf[i];
@@ -145,8 +201,8 @@ void QNitpickerPlatformWindow::_handle_input(unsigned int)
bool const is_mouse_button_event =
is_key_event && (ev->code() == Input::BTN_LEFT ||
- ev->code() == Input::BTN_MIDDLE ||
- ev->code() == Input::BTN_RIGHT);
+ ev->code() == Input::BTN_MIDDLE ||
+ ev->code() == Input::BTN_RIGHT);
if (ev->type() == Input::Event::MOTION ||
ev->type() == Input::Event::WHEEL ||
@@ -154,12 +210,19 @@ void QNitpickerPlatformWindow::_handle_input(unsigned int)
_process_mouse_event(ev);
+ } else if (ev->type() == Input::Event::TOUCH) {
+
+ touch_events.push_back(*ev);
+
} else if (is_key_event && (ev->code() < 128)) {
_process_key_event(ev);
}
}
+
+ /* process all gathered touch events */
+ _process_touch_events(touch_events);
}
@@ -265,7 +328,8 @@ QNitpickerPlatformWindow::QNitpickerPlatformWindow(QWindow *window,
_input_signal_dispatcher(_signal_receiver, *this,
&QNitpickerPlatformWindow::_input),
_mode_changed_signal_dispatcher(_signal_receiver, *this,
- &QNitpickerPlatformWindow::_mode_changed)
+ &QNitpickerPlatformWindow::_mode_changed),
+ _touch_device(_init_touch_device())
{
if (qnpw_verbose)
if (window->transientParent())
diff --git a/repos/libports/src/lib/qt5/qtbase/src/plugins/platforms/nitpicker/qnitpickerplatformwindow.h b/repos/libports/src/lib/qt5/qtbase/src/plugins/platforms/nitpicker/qnitpickerplatformwindow.h
index 8aa355275..97765fa0a 100644
--- a/repos/libports/src/lib/qt5/qtbase/src/plugins/platforms/nitpicker/qnitpickerplatformwindow.h
+++ b/repos/libports/src/lib/qt5/qtbase/src/plugins/platforms/nitpicker/qnitpickerplatformwindow.h
@@ -24,7 +24,9 @@
/* Qt includes */
#include
+#include
#include
+#include
/* Qoost includes */
#include
@@ -64,8 +66,13 @@ class QNitpickerPlatformWindow : public QObject, public QPlatformWindow
Genode::Signal_dispatcher _input_signal_dispatcher;
Genode::Signal_dispatcher _mode_changed_signal_dispatcher;
+ QVector _touch_points { 16 };
+ QTouchDevice *_touch_device;
+ QTouchDevice * _init_touch_device();
+
void _process_mouse_event(Input::Event *ev);
void _process_key_event(Input::Event *ev);
+ void _process_touch_events(QList const &events);
Nitpicker::Session::View_handle _create_view();
void _adjust_and_set_geometry(const QRect &rect);