void QBBEventThread::handleTouchEvent(screen_event_t event, int qnxType) { // get display coordinates of touch errno = 0; int pos[2]; int result = screen_get_event_property_iv(event, SCREEN_PROPERTY_POSITION, pos); if (result) { qFatal("QBB: failed to query event position, errno=%d", errno); } // get window coordinates of touch errno = 0; int windowPos[2]; result = screen_get_event_property_iv(event, SCREEN_PROPERTY_SOURCE_POSITION, windowPos); if (result) { qFatal("QBB: failed to query event window position, errno=%d", errno); } // determine which finger touched errno = 0; int touchId; result = screen_get_event_property_iv(event, SCREEN_PROPERTY_TOUCH_ID, &touchId); if (result) { qFatal("QBB: failed to query event touch id, errno=%d", errno); } // determine which window was touched errno = 0; void *qnxWindow; result = screen_get_event_property_pv(event, SCREEN_PROPERTY_WINDOW, &qnxWindow); if (result) { qFatal("QBB: failed to query event window, errno=%d", errno); } // check if finger is valid if (touchId < MAX_TOUCH_POINTS) { // map window to top-level widget QWidget* w = QWidget::find( (WId)qnxWindow ); // Generate enter and leave events as needed. if (qnxWindow != mLastMouseWindow) { QWidget* wOld = QWidget::find( (WId)mLastMouseWindow ); if (wOld) { QWindowSystemInterface::handleLeaveEvent(wOld); #if defined(QBBEVENTTHREAD_DEBUG) qDebug() << "QBB: Qt leave, w=" << wOld; #endif } if (w) { QWindowSystemInterface::handleEnterEvent(w); #if defined(QBBEVENTTHREAD_DEBUG) qDebug() << "QBB: Qt enter, w=" << w; #endif } } if (w) { // convert primary touch to mouse event if (touchId == 0) { // convert point to local coordinates QPoint globalPoint(pos[0], pos[1]); QPoint localPoint(windowPos[0], windowPos[1]); // map touch state to button state Qt::MouseButtons buttons = (qnxType == SCREEN_EVENT_MTOUCH_RELEASE) ? Qt::NoButton : Qt::LeftButton; // inject event into Qt QWindowSystemInterface::handleMouseEvent(w, localPoint, globalPoint, buttons); #if defined(QBBEVENTTHREAD_DEBUG) qDebug() << "QBB: Qt mouse, w=" << w << ", (" << localPoint.x() << "," << localPoint.y() << "), b=" << buttons; #endif } // get size of screen which contains window QPlatformScreen* platformScreen = QPlatformScreen::platformScreenForWidget(w); QSize screenSize = platformScreen->physicalSize(); // update cached position of current touch point mTouchPoints[touchId].normalPosition = QPointF( ((qreal)pos[0]) / screenSize.width(), ((qreal)pos[1]) / screenSize.height() ); mTouchPoints[touchId].area = QRectF( pos[0], pos[1], 0.0, 0.0 ); // determine event type and update state of current touch point QEvent::Type type = QEvent::None; switch (qnxType) { case SCREEN_EVENT_MTOUCH_TOUCH: mTouchPoints[touchId].state = Qt::TouchPointPressed; type = QEvent::TouchBegin; break; case SCREEN_EVENT_MTOUCH_MOVE: mTouchPoints[touchId].state = Qt::TouchPointMoved; type = QEvent::TouchUpdate; break; case SCREEN_EVENT_MTOUCH_RELEASE: mTouchPoints[touchId].state = Qt::TouchPointReleased; type = QEvent::TouchEnd; break; } // build list of active touch points QList<QWindowSystemInterface::TouchPoint> pointList; for (int i = 0; i < MAX_TOUCH_POINTS; i++) { if (i == touchId) { // current touch point is always active pointList.append(mTouchPoints[i]); } else if (mTouchPoints[i].state != Qt::TouchPointReleased) { // finger is down but did not move mTouchPoints[i].state = Qt::TouchPointStationary; pointList.append(mTouchPoints[i]); } } // inject event into Qt QWindowSystemInterface::handleTouchEvent(w, type, QTouchEvent::TouchScreen, pointList); #if defined(QBBEVENTTHREAD_DEBUG) qDebug() << "QBB: Qt touch, w=" << w << ", p=(" << pos[0] << "," << pos[1] << "), t=" << type; #endif } } }
void QQnxScreenEventHandler::handleTouchEvent(screen_event_t event, int qnxType) { // get display coordinates of touch errno = 0; int pos[2]; int result = screen_get_event_property_iv(event, SCREEN_PROPERTY_POSITION, pos); if (result) { qFatal("QQNX: failed to query event position, errno=%d", errno); } // get window coordinates of touch errno = 0; int windowPos[2]; result = screen_get_event_property_iv(event, SCREEN_PROPERTY_SOURCE_POSITION, windowPos); if (result) { qFatal("QQNX: failed to query event window position, errno=%d", errno); } // determine which finger touched errno = 0; int touchId; result = screen_get_event_property_iv(event, SCREEN_PROPERTY_TOUCH_ID, &touchId); if (result) { qFatal("QQNX: failed to query event touch id, errno=%d", errno); } // determine which window was touched errno = 0; void *handle; result = screen_get_event_property_pv(event, SCREEN_PROPERTY_WINDOW, &handle); if (result) { qFatal("QQNX: failed to query event window, errno=%d", errno); } screen_window_t qnxWindow = static_cast<screen_window_t>(handle); // check if finger is valid if (touchId < MaximumTouchPoints) { // Map window handle to top-level QWindow QWindow *w = QQnxIntegration::window(qnxWindow); // Generate enter and leave events as needed. if (qnxWindow != m_lastMouseWindow) { QWindow *wOld = QQnxIntegration::window(m_lastMouseWindow); if (wOld) { QWindowSystemInterface::handleLeaveEvent(wOld); qScreenEventDebug() << Q_FUNC_INFO << "Qt leave, w=" << wOld; } if (w) { QWindowSystemInterface::handleEnterEvent(w); qScreenEventDebug() << Q_FUNC_INFO << "Qt enter, w=" << w; } } m_lastMouseWindow = qnxWindow; if (w) { // get size of screen which contains window QPlatformScreen *platformScreen = QPlatformScreen::platformScreenForWindow(w); QSizeF screenSize = platformScreen->physicalSize(); // update cached position of current touch point m_touchPoints[touchId].normalPosition = QPointF( static_cast<qreal>(pos[0]) / screenSize.width(), static_cast<qreal>(pos[1]) / screenSize.height() ); m_touchPoints[touchId].area = QRectF( pos[0], pos[1], 0.0, 0.0 ); // determine event type and update state of current touch point QEvent::Type type = QEvent::None; switch (qnxType) { case SCREEN_EVENT_MTOUCH_TOUCH: m_touchPoints[touchId].state = Qt::TouchPointPressed; type = QEvent::TouchBegin; break; case SCREEN_EVENT_MTOUCH_MOVE: m_touchPoints[touchId].state = Qt::TouchPointMoved; type = QEvent::TouchUpdate; break; case SCREEN_EVENT_MTOUCH_RELEASE: m_touchPoints[touchId].state = Qt::TouchPointReleased; type = QEvent::TouchEnd; break; } // build list of active touch points QList<QWindowSystemInterface::TouchPoint> pointList; for (int i = 0; i < MaximumTouchPoints; i++) { if (i == touchId) { // current touch point is always active pointList.append(m_touchPoints[i]); } else if (m_touchPoints[i].state != Qt::TouchPointReleased) { // finger is down but did not move m_touchPoints[i].state = Qt::TouchPointStationary; pointList.append(m_touchPoints[i]); } } // inject event into Qt QWindowSystemInterface::handleTouchEvent(w, m_touchDevice, pointList); qScreenEventDebug() << Q_FUNC_INFO << "Qt touch, w =" << w << ", p=(" << pos[0] << "," << pos[1] << "), t=" << type; } } }