int QWidget::metric(PaintDeviceMetric m) const { Q_D(const QWidget); QScreen *screen = 0; if (QWidget *topLevel = window()) if (QWindow *topLevelWindow = topLevel->windowHandle()) { QPlatformScreen *platformScreen = QPlatformScreen::platformScreenForWindow(topLevelWindow); if (platformScreen) screen = platformScreen->screen(); } if (!screen && QGuiApplication::primaryScreen()) screen = QGuiApplication::primaryScreen(); if (!screen) { if (m == PdmDpiX || m == PdmDpiY) return 72; return QPaintDevice::metric(m); } int val; if (m == PdmWidth) { val = data->crect.width(); } else if (m == PdmWidthMM) { val = data->crect.width() * screen->physicalSize().width() / screen->geometry().width(); } else if (m == PdmHeight) { val = data->crect.height(); } else if (m == PdmHeightMM) { val = data->crect.height() * screen->physicalSize().height() / screen->geometry().height(); } else if (m == PdmDepth) { return screen->depth(); } else if (m == PdmDpiX) { if (d->extra && d->extra->customDpiX) return d->extra->customDpiX; else if (d->parent) return static_cast<QWidget *>(d->parent)->metric(m); return qRound(screen->logicalDotsPerInchX()); } else if (m == PdmDpiY) { if (d->extra && d->extra->customDpiY) return d->extra->customDpiY; else if (d->parent) return static_cast<QWidget *>(d->parent)->metric(m); return qRound(screen->logicalDotsPerInchY()); } else if (m == PdmPhysicalDpiX) { return qRound(screen->physicalDotsPerInchX()); } else if (m == PdmPhysicalDpiY) { return qRound(screen->physicalDotsPerInchY()); } else if (m == PdmDevicePixelRatio) { return screen->devicePixelRatio(); } else { val = QPaintDevice::metric(m);// XXX } return val; }
int main(int argc, char **argv) { QGuiApplication app(argc, argv); QPlatformScreen *screenHandle = app.screens().first()->handle(); screenHandle->geometry(); QPixmap pixmap; QPlatformPixmap *pixmapHandle = pixmap.handle(); pixmapHandle->width(); return 0; }
static void setSurface(JNIEnv *env, jobject /*thiz*/, jobject jSurface) { #ifndef ANDROID_PLUGIN_OPENGL if (m_surface) env->DeleteGlobalRef(m_surface); m_surface = env->NewGlobalRef(jSurface); #else m_surfaceMutex.lock(); EGLNativeWindowType nativeWindow = ANativeWindow_fromSurface(env, jSurface); bool sameNativeWindow = (nativeWindow != 0 && nativeWindow == m_nativeWindow); m_nativeWindow = nativeWindow; if (m_waitForWindow) m_waitForWindowSemaphore.release(); if (m_androidPlatformIntegration) { // Use the desktop size. // On some devices, the getters for the native window size gives wrong values QSize size = QAndroidPlatformIntegration::defaultDesktopSize(); QPlatformScreen *screen = m_androidPlatformIntegration->screen(); QRect geometry(QPoint(0, 0), size); if (screen) { QWindowSystemInterface::handleScreenAvailableGeometryChange(screen->screen(), geometry); QWindowSystemInterface::handleScreenGeometryChange(screen->screen(), geometry); } if (!sameNativeWindow) { m_surfaceMutex.unlock(); m_androidPlatformIntegration->surfaceChanged(); } else { // Resize all top level windows, since they share the same surface foreach (QWindow *w, QGuiApplication::topLevelWindows()) { QAndroidOpenGLPlatformWindow *window = static_cast<QAndroidOpenGLPlatformWindow *>(w->handle()); if (window != 0) { window->lock(); window->scheduleResize(size); QWindowSystemInterface::handleExposeEvent(window->window(), QRegion(window->window()->geometry())); window->unlock(); } } m_surfaceMutex.unlock(); } } else {
QPlatformWindow *QWindowsIntegration::createPlatformWindow(QWindow *window) const { QWindowsWindowData requested; requested.flags = window->flags(); requested.geometry = QHighDpi::toNativePixels(window->geometry(), window); // Apply custom margins (see QWindowsWindow::setCustomMargins())). const QVariant customMarginsV = window->property("_q_windowsCustomMargins"); if (customMarginsV.isValid()) requested.customMargins = qvariant_cast<QMargins>(customMarginsV); QWindowsWindowData obtained = QWindowsWindowData::create(window, requested, window->title()); qCDebug(lcQpaWindows).nospace() << __FUNCTION__ << ' ' << window << "\n Requested: " << requested.geometry << " frame incl.=" << QWindowsGeometryHint::positionIncludesFrame(window) << ' ' << requested.flags << "\n Obtained : " << obtained.geometry << " margins=" << obtained.frame << " handle=" << obtained.hwnd << ' ' << obtained.flags << '\n'; if (Q_UNLIKELY(!obtained.hwnd)) return Q_NULLPTR; QWindowsWindow *result = createPlatformWindowHelper(window, obtained); Q_ASSERT(result); if (requested.flags != obtained.flags) window->setFlags(obtained.flags); // Trigger geometry change (unless it has a special state in which case setWindowState() // will send the message) and screen change signals of QWindow. if ((obtained.flags & Qt::Desktop) != Qt::Desktop) { const Qt::WindowState state = window->windowState(); if (state != Qt::WindowMaximized && state != Qt::WindowFullScreen && requested.geometry != obtained.geometry) { QWindowSystemInterface::handleGeometryChange(window, obtained.geometry); } QPlatformScreen *screen = result->screenForGeometry(obtained.geometry); if (screen && result->screen() != screen) QWindowSystemInterface::handleWindowScreenChanged(window, screen->screen()); } return result; }
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; } } }