void MainWindow::onTest() { QPoint globalPoint(ui->screen->mapToGlobal(QPoint(0, 0))); testDlg->resize(ui->screen->size()); testDlg->move(globalPoint); testDlg->show(); }
void QDirectFbInput::handleWheelEvent(const DFBEvent &event) { QPoint p(event.window.cx, event.window.cy); QPoint globalPos = globalPoint(event); long timestamp = (event.window.timestamp.tv_sec*1000) + (event.window.timestamp.tv_usec/1000); QWidget *tlw = m_tlwMap.value(event.window.window_id); QWindowSystemInterface::handleWheelEvent(tlw, timestamp, p, globalPos, event.window.step*120, Qt::Vertical); }
void QDirectFbInput::handleMouseEvents(const DFBEvent &event) { QPoint p(event.window.x, event.window.y); QPoint globalPos = globalPoint(event); Qt::MouseButtons buttons = QDirectFbConvenience::mouseButtons(event.window.buttons); QDirectFBPointer<IDirectFBDisplayLayer> layer(QDirectFbConvenience::dfbDisplayLayer()); QDirectFBPointer<IDirectFBWindow> window; layer->GetWindow(layer.data(), event.window.window_id, window.outPtr()); long timestamp = (event.window.timestamp.tv_sec*1000) + (event.window.timestamp.tv_usec/1000); QWidget *tlw = m_tlwMap.value(event.window.window_id); QWindowSystemInterface::handleMouseEvent(tlw, timestamp, p, globalPos, buttons); }
void Ut_MInputContext::testMouseHandler() { // TODO: test mouse button press and maybe double click WidgetStub widget(0); int x = 4; // mouse left button release on (10, 10), no additional modifiers QPoint point(10, 10); QPoint globalPoint(20, 20); QMouseEvent event(QEvent::MouseButtonRelease, point, globalPoint, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); m_subject->setFocusWidget(&widget); m_subject->mouseHandler(x, &event); waitAndProcessEvents(500); QCOMPARE(m_stub->mouseClickedOnPreeditCount(), 1); m_subject->setFocusWidget(0); }
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 QBBEventThread::handlePointerEvent(screen_event_t event) { errno = 0; // Query the window that was clicked void *qnxWindow; int result = screen_get_event_property_pv(event, SCREEN_PROPERTY_WINDOW, &qnxWindow); if (result) { qFatal("QBB: failed to query event window, errno=%d", errno); } // Query the button states int buttonState = 0; result = screen_get_event_property_iv(event, SCREEN_PROPERTY_BUTTONS, &buttonState); if (result) { qFatal("QBB: failed to query event button state, errno=%d", errno); } // Query the window position 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); } // Query the screen position int pos[2]; result = screen_get_event_property_iv(event, SCREEN_PROPERTY_POSITION, pos); if (result) { qFatal("QBB: failed to query event position, errno=%d", errno); } // Query the wheel delta int wheelDelta = 0; result = screen_get_event_property_iv(event, SCREEN_PROPERTY_MOUSE_WHEEL, &wheelDelta); if (result) { qFatal("QBB: failed to query event wheel delta, errno=%d", errno); } // 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 } } // Apply scaling to wheel delta and invert value for Qt. We'll probably want to scale // this via a system preference at some point. But for now this is a sane value and makes // the wheel usable. wheelDelta *= -10; // convert point to local coordinates QPoint globalPoint(pos[0], pos[1]); QPoint localPoint(windowPos[0], windowPos[1]); // Convert buttons. Qt::MouseButtons buttons = Qt::NoButton; if (buttonState & 1) buttons |= Qt::LeftButton; if (buttonState & 2) buttons |= Qt::MidButton; if (buttonState & 4) buttons |= Qt::RightButton; if (w) { // Inject mouse event into Qt only if something has changed. if (mLastGlobalMousePoint != globalPoint || mLastLocalMousePoint != localPoint || mLastButtonState != buttons) { QWindowSystemInterface::handleMouseEvent(w, localPoint, globalPoint, buttons); #if defined(QBBEVENTTHREAD_DEBUG) qDebug() << "QBB: Qt mouse, w=" << w << ", (" << localPoint.x() << "," << localPoint.y() << "), b=" << (int)buttons; #endif } if (wheelDelta) { // Screen only supports a single wheel, so we will assume Vertical orientation for // now since that is pretty much standard. QWindowSystemInterface::handleWheelEvent(w, localPoint, globalPoint, wheelDelta, Qt::Vertical); #if defined(QBBEVENTTHREAD_DEBUG) qDebug() << "QBB: Qt wheel, w=" << w << ", (" << localPoint.x() << "," << localPoint.y() << "), d=" << (int)wheelDelta; #endif } } mLastGlobalMousePoint = globalPoint; mLastLocalMousePoint = localPoint; mLastButtonState = buttons; }
void QQnxScreenEventHandler::handlePointerEvent(screen_event_t event) { errno = 0; // Query the window that was clicked screen_window_t qnxWindow; void *handle; int result = screen_get_event_property_pv(event, SCREEN_PROPERTY_WINDOW, &handle); if (result) { qFatal("QQNX: failed to query event window, errno=%d", errno); } qnxWindow = static_cast<screen_window_t>(handle); // Query the button states int buttonState = 0; result = screen_get_event_property_iv(event, SCREEN_PROPERTY_BUTTONS, &buttonState); if (result) { qFatal("QQNX: failed to query event button state, errno=%d", errno); } // Query the window position 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); } // Query the screen position int pos[2]; result = screen_get_event_property_iv(event, SCREEN_PROPERTY_POSITION, pos); if (result) { qFatal("QQNX: failed to query event position, errno=%d", errno); } // Query the wheel delta int wheelDelta = 0; result = screen_get_event_property_iv(event, SCREEN_PROPERTY_MOUSE_WHEEL, &wheelDelta); if (result) { qFatal("QQNX: failed to query event wheel delta, errno=%d", errno); } // 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; } } // If we don't have a navigator, we don't get activation events. if (buttonState && w && w != QGuiApplication::focusWindow() && !m_qnxIntegration->supportsNavigatorEvents()) QWindowSystemInterface::handleWindowActivated(w); m_lastMouseWindow = qnxWindow; // Apply scaling to wheel delta and invert value for Qt. We'll probably want to scale // this via a system preference at some point. But for now this is a sane value and makes // the wheel usable. wheelDelta *= -10; // convert point to local coordinates QPoint globalPoint(pos[0], pos[1]); QPoint localPoint(windowPos[0], windowPos[1]); // Convert buttons. // Some QNX header files invert 'Right Button versus "Left Button' ('Right' == 0x01). But they also offer a 'Button Swap' bit, // so we may receive events as shown. (If this is wrong, the fix is easy.) // QNX Button mask is 8 buttons wide, with a maximum value of x080. Qt::MouseButtons buttons = Qt::NoButton; if (buttonState & 0x01) buttons |= Qt::LeftButton; if (buttonState & 0x02) buttons |= Qt::MidButton; if (buttonState & 0x04) buttons |= Qt::RightButton; if (buttonState & 0x08) buttons |= Qt::ExtraButton1; // AKA 'Qt::BackButton' if (buttonState & 0x10) buttons |= Qt::ExtraButton2; // AKA 'Qt::ForwardButton' if (buttonState & 0x20) buttons |= Qt::ExtraButton3; if (buttonState & 0x40) buttons |= Qt::ExtraButton4; if (buttonState & 0x80) buttons |= Qt::ExtraButton5; if (w) { // Inject mouse event into Qt only if something has changed. if (m_lastGlobalMousePoint != globalPoint || m_lastLocalMousePoint != localPoint || m_lastButtonState != buttons) { QWindowSystemInterface::handleMouseEvent(w, localPoint, globalPoint, buttons); qScreenEventDebug() << Q_FUNC_INFO << "Qt mouse, w=" << w << ", (" << localPoint.x() << "," << localPoint.y() << "), b=" << static_cast<int>(buttons); } if (wheelDelta) { // Screen only supports a single wheel, so we will assume Vertical orientation for // now since that is pretty much standard. QWindowSystemInterface::handleWheelEvent(w, localPoint, globalPoint, wheelDelta, Qt::Vertical); qScreenEventDebug() << Q_FUNC_INFO << "Qt wheel, w=" << w << ", (" << localPoint.x() << "," << localPoint.y() << "), d=" << static_cast<int>(wheelDelta); } } m_lastGlobalMousePoint = globalPoint; m_lastLocalMousePoint = localPoint; m_lastButtonState = buttons; }