Android: Report something sensible for screen geometry
We can't get the actual screen geometry on Android, but in Qt 5.3.0 we would always return the screen geometry minus the size of the status bar. After the available geometry was initialized to 0x0 instead of this arbitrary value, some applications that depended on this as a constant value would break if they collected the information before the window surface had been initialized and they forgot to listen to QScreen::geometryChanged(). To reduce the risk of regressions, this patch makes sure we return the same thing as before for the screen geometry and that this is not linked directly to the available screen geometry. Task-number: QTBUG-39464 Change-Id: Ie63337b3b10d2eb5130e4fece6c5b144e8230164 Reviewed-by: Paul Olav Tvete <paul.tvete@digia.com> Reviewed-by: Christian Stromme <christian.stromme@digia.com>
This commit is contained in:
parent
9c80a3be4b
commit
fb3f47b638
@ -549,7 +549,7 @@ static void setSurface(JNIEnv *env, jobject /*thiz*/, jint id, jobject jSurface,
|
||||
}
|
||||
|
||||
static void setDisplayMetrics(JNIEnv */*env*/, jclass /*clazz*/,
|
||||
jint /*widthPixels*/, jint /*heightPixels*/,
|
||||
jint widthPixels, jint heightPixels,
|
||||
jint desktopWidthPixels, jint desktopHeightPixels,
|
||||
jdouble xdpi, jdouble ydpi, jdouble scaledDensity)
|
||||
{
|
||||
@ -558,13 +558,17 @@ static void setDisplayMetrics(JNIEnv */*env*/, jclass /*clazz*/,
|
||||
m_scaledDensity = scaledDensity;
|
||||
|
||||
if (!m_androidPlatformIntegration) {
|
||||
QAndroidPlatformIntegration::setDefaultDisplayMetrics(desktopWidthPixels,desktopHeightPixels,
|
||||
qRound(double(desktopWidthPixels) / xdpi * 25.4),
|
||||
qRound(double(desktopHeightPixels) / ydpi * 25.4));
|
||||
QAndroidPlatformIntegration::setDefaultDisplayMetrics(desktopWidthPixels,
|
||||
desktopHeightPixels,
|
||||
qRound(double(desktopWidthPixels) / xdpi * 25.4),
|
||||
qRound(double(desktopHeightPixels) / ydpi * 25.4),
|
||||
widthPixels,
|
||||
heightPixels);
|
||||
} else {
|
||||
m_androidPlatformIntegration->setDisplayMetrics(qRound(double(desktopWidthPixels) / xdpi * 25.4),
|
||||
qRound(double(desktopHeightPixels) / ydpi * 25.4));
|
||||
m_androidPlatformIntegration->setDesktopSize(desktopWidthPixels, desktopHeightPixels);
|
||||
m_androidPlatformIntegration->setScreenSize(widthPixels, heightPixels);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -74,6 +74,8 @@ QT_BEGIN_NAMESPACE
|
||||
|
||||
int QAndroidPlatformIntegration::m_defaultGeometryWidth = 320;
|
||||
int QAndroidPlatformIntegration::m_defaultGeometryHeight = 455;
|
||||
int QAndroidPlatformIntegration::m_defaultScreenWidth = 320;
|
||||
int QAndroidPlatformIntegration::m_defaultScreenHeight = 455;
|
||||
int QAndroidPlatformIntegration::m_defaultPhysicalSizeWidth = 50;
|
||||
int QAndroidPlatformIntegration::m_defaultPhysicalSizeHeight = 71;
|
||||
|
||||
@ -121,7 +123,8 @@ QAndroidPlatformIntegration::QAndroidPlatformIntegration(const QStringList ¶
|
||||
m_primaryScreen = new QAndroidPlatformScreen();
|
||||
screenAdded(m_primaryScreen);
|
||||
m_primaryScreen->setPhysicalSize(QSize(m_defaultPhysicalSizeWidth, m_defaultPhysicalSizeHeight));
|
||||
m_primaryScreen->setGeometry(QRect(0, 0, m_defaultGeometryWidth, m_defaultGeometryHeight));
|
||||
m_primaryScreen->setAvailableGeometry(QRect(0, 0, m_defaultGeometryWidth, m_defaultGeometryHeight));
|
||||
m_primaryScreen->setSize(QSize(m_defaultScreenWidth, m_defaultScreenHeight));
|
||||
|
||||
m_mainThread = QThread::currentThread();
|
||||
QtAndroid::setAndroidPlatformIntegration(this);
|
||||
@ -312,12 +315,14 @@ QPlatformTheme *QAndroidPlatformIntegration::createPlatformTheme(const QString &
|
||||
return 0;
|
||||
}
|
||||
|
||||
void QAndroidPlatformIntegration::setDefaultDisplayMetrics(int gw, int gh, int sw, int sh)
|
||||
void QAndroidPlatformIntegration::setDefaultDisplayMetrics(int gw, int gh, int sw, int sh, int screenWidth, int screenHeight)
|
||||
{
|
||||
m_defaultGeometryWidth = gw;
|
||||
m_defaultGeometryHeight = gh;
|
||||
m_defaultPhysicalSizeWidth = sw;
|
||||
m_defaultPhysicalSizeHeight = sh;
|
||||
m_defaultScreenWidth = screenWidth;
|
||||
m_defaultScreenHeight = screenHeight;
|
||||
}
|
||||
|
||||
void QAndroidPlatformIntegration::setDefaultDesktopSize(int gw, int gh)
|
||||
@ -345,7 +350,7 @@ QPlatformAccessibility *QAndroidPlatformIntegration::accessibility() const
|
||||
void QAndroidPlatformIntegration::setDesktopSize(int width, int height)
|
||||
{
|
||||
if (m_primaryScreen)
|
||||
QMetaObject::invokeMethod(m_primaryScreen, "setGeometry", Qt::AutoConnection, Q_ARG(QRect, QRect(0,0,width, height)));
|
||||
QMetaObject::invokeMethod(m_primaryScreen, "setAvailableGeometry", Qt::AutoConnection, Q_ARG(QRect, QRect(0,0,width, height)));
|
||||
}
|
||||
|
||||
void QAndroidPlatformIntegration::setDisplayMetrics(int width, int height)
|
||||
@ -354,4 +359,10 @@ void QAndroidPlatformIntegration::setDisplayMetrics(int width, int height)
|
||||
QMetaObject::invokeMethod(m_primaryScreen, "setPhysicalSize", Qt::AutoConnection, Q_ARG(QSize, QSize(width, height)));
|
||||
}
|
||||
|
||||
void QAndroidPlatformIntegration::setScreenSize(int width, int height)
|
||||
{
|
||||
if (m_primaryScreen)
|
||||
QMetaObject::invokeMethod(m_primaryScreen, "setSize", Qt::AutoConnection, Q_ARG(QSize, QSize(width, height)));
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
@ -86,6 +86,7 @@ public:
|
||||
|
||||
virtual void setDesktopSize(int width, int height);
|
||||
virtual void setDisplayMetrics(int width, int height);
|
||||
void setScreenSize(int width, int height);
|
||||
bool isVirtualDesktop() { return true; }
|
||||
|
||||
QPlatformFontDatabase *fontDatabase() const;
|
||||
@ -108,7 +109,7 @@ public:
|
||||
QStringList themeNames() const;
|
||||
QPlatformTheme *createPlatformTheme(const QString &name) const;
|
||||
|
||||
static void setDefaultDisplayMetrics(int gw, int gh, int sw, int sh);
|
||||
static void setDefaultDisplayMetrics(int gw, int gh, int sw, int sh, int width, int height);
|
||||
static void setDefaultDesktopSize(int gw, int gh);
|
||||
static void setScreenOrientation(Qt::ScreenOrientation currentOrientation,
|
||||
Qt::ScreenOrientation nativeOrientation);
|
||||
@ -135,6 +136,8 @@ private:
|
||||
static int m_defaultGeometryHeight;
|
||||
static int m_defaultPhysicalSizeWidth;
|
||||
static int m_defaultPhysicalSizeHeight;
|
||||
static int m_defaultScreenWidth;
|
||||
static int m_defaultScreenHeight;
|
||||
|
||||
static Qt::ScreenOrientation m_orientation;
|
||||
static Qt::ScreenOrientation m_nativeOrientation;
|
||||
|
@ -86,7 +86,8 @@ private:
|
||||
|
||||
QAndroidPlatformScreen::QAndroidPlatformScreen():QObject(),QPlatformScreen()
|
||||
{
|
||||
m_geometry = QRect(0, 0, QAndroidPlatformIntegration::m_defaultGeometryWidth, QAndroidPlatformIntegration::m_defaultGeometryHeight);
|
||||
m_availableGeometry = QRect(0, 0, QAndroidPlatformIntegration::m_defaultGeometryWidth, QAndroidPlatformIntegration::m_defaultGeometryHeight);
|
||||
m_size = QSize(QAndroidPlatformIntegration::m_defaultScreenWidth, QAndroidPlatformIntegration::m_defaultScreenHeight);
|
||||
// Raster only apps should set QT_ANDROID_RASTER_IMAGE_DEPTH to 16
|
||||
// is way much faster than 32
|
||||
if (qgetenv("QT_ANDROID_RASTER_IMAGE_DEPTH").toInt() == 16) {
|
||||
@ -204,7 +205,7 @@ void QAndroidPlatformScreen::scheduleUpdate()
|
||||
|
||||
void QAndroidPlatformScreen::setDirty(const QRect &rect)
|
||||
{
|
||||
QRect intersection = rect.intersected(m_geometry);
|
||||
QRect intersection = rect.intersected(m_availableGeometry);
|
||||
m_dirtyRect |= intersection;
|
||||
scheduleUpdate();
|
||||
}
|
||||
@ -214,15 +215,21 @@ void QAndroidPlatformScreen::setPhysicalSize(const QSize &size)
|
||||
m_physicalSize = size;
|
||||
}
|
||||
|
||||
void QAndroidPlatformScreen::setGeometry(const QRect &rect)
|
||||
void QAndroidPlatformScreen::setSize(const QSize &size)
|
||||
{
|
||||
m_size = size;
|
||||
QWindowSystemInterface::handleScreenGeometryChange(QPlatformScreen::screen(), geometry());
|
||||
}
|
||||
|
||||
void QAndroidPlatformScreen::setAvailableGeometry(const QRect &rect)
|
||||
{
|
||||
QMutexLocker lock(&m_surfaceMutex);
|
||||
if (m_geometry == rect)
|
||||
if (m_availableGeometry == rect)
|
||||
return;
|
||||
|
||||
QRect oldGeometry = m_geometry;
|
||||
QRect oldGeometry = m_availableGeometry;
|
||||
|
||||
m_geometry = rect;
|
||||
m_availableGeometry = rect;
|
||||
QWindowSystemInterface::handleScreenGeometryChange(QPlatformScreen::screen(), geometry());
|
||||
QWindowSystemInterface::handleScreenAvailableGeometryChange(QPlatformScreen::screen(), availableGeometry());
|
||||
resizeMaximizedWindows();
|
||||
@ -271,7 +278,7 @@ void QAndroidPlatformScreen::doRedraw()
|
||||
|
||||
QMutexLocker lock(&m_surfaceMutex);
|
||||
if (m_id == -1 && m_rasterSurfaces) {
|
||||
m_id = QtAndroid::createSurface(this, m_geometry, true, m_depth);
|
||||
m_id = QtAndroid::createSurface(this, m_availableGeometry, true, m_depth);
|
||||
m_surfaceWaitCondition.wait(&m_surfaceMutex);
|
||||
}
|
||||
|
||||
|
@ -66,7 +66,8 @@ public:
|
||||
QAndroidPlatformScreen();
|
||||
~QAndroidPlatformScreen();
|
||||
|
||||
QRect geometry() const { return m_geometry; }
|
||||
QRect geometry() const { return QRect(QPoint(), m_size); }
|
||||
QRect availableGeometry() const { return m_availableGeometry; }
|
||||
int depth() const { return m_depth; }
|
||||
QImage::Format format() const { return m_format; }
|
||||
QSizeF physicalSize() const { return m_physicalSize; }
|
||||
@ -87,7 +88,8 @@ public:
|
||||
public slots:
|
||||
void setDirty(const QRect &rect);
|
||||
void setPhysicalSize(const QSize &size);
|
||||
void setGeometry(const QRect &rect);
|
||||
void setAvailableGeometry(const QRect &rect);
|
||||
void setSize(const QSize &size);
|
||||
|
||||
protected:
|
||||
typedef QList<QAndroidPlatformWindow *> WindowStackType;
|
||||
@ -95,7 +97,7 @@ protected:
|
||||
QRect m_dirtyRect;
|
||||
QTimer m_redrawTimer;
|
||||
|
||||
QRect m_geometry;
|
||||
QRect m_availableGeometry;
|
||||
int m_depth;
|
||||
QImage::Format m_format;
|
||||
QSizeF m_physicalSize;
|
||||
@ -114,6 +116,7 @@ private:
|
||||
QAtomicInt m_rasterSurfaces = 0;
|
||||
ANativeWindow* m_nativeSurface = nullptr;
|
||||
QWaitCondition m_surfaceWaitCondition;
|
||||
QSize m_size;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
Loading…
x
Reference in New Issue
Block a user