diff options
author | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com> | 2013-07-30 12:06:07 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-07-31 12:34:14 +0200 |
commit | 0bbc32a0cb3b71012a9245b84f69cdc8405ce5fc (patch) | |
tree | 35f2f2c9cafa458f9b497f72bfcec9ba82c5a558 | |
parent | 1d2941f978bc15d98a166c9a657d50b0227fdf5a (diff) |
Android: Fix crash when setting WA_NativeWindow
We don't support native widgets in Android, so we can get into a mess
when people set this widget attribute, since the FB compositor
will assume that all widgets have their own backing store. This adds
a capability flag to the QPlatformIntegration which allows the plugin
to disable the WA_NativeWindow feature.
Task-number: QTBUG-32685
Change-Id: Ic200487da4a297f71ab594cf7c90d1e1d53bacd3
Reviewed-by: Gunnar Sletta <gunnar.sletta@digia.com>
-rw-r--r-- | src/gui/kernel/qplatformintegration.cpp | 2 | ||||
-rw-r--r-- | src/gui/kernel/qplatformintegration.h | 3 | ||||
-rw-r--r-- | src/plugins/platforms/android/src/qandroidplatformintegration.cpp | 1 | ||||
-rw-r--r-- | src/widgets/kernel/qwidget.cpp | 7 |
4 files changed, 11 insertions, 2 deletions
diff --git a/src/gui/kernel/qplatformintegration.cpp b/src/gui/kernel/qplatformintegration.cpp index 2910bb9280..434344df08 100644 --- a/src/gui/kernel/qplatformintegration.cpp +++ b/src/gui/kernel/qplatformintegration.cpp @@ -237,7 +237,7 @@ QPlatformServices *QPlatformIntegration::services() const bool QPlatformIntegration::hasCapability(Capability cap) const { - return cap == NonFullScreenWindows; + return cap == NonFullScreenWindows || cap == NativeWidgets; } QPlatformPixmap *QPlatformIntegration::createPlatformPixmap(QPlatformPixmap::PixelType type) const diff --git a/src/gui/kernel/qplatformintegration.h b/src/gui/kernel/qplatformintegration.h index fcac211f72..9350553efd 100644 --- a/src/gui/kernel/qplatformintegration.h +++ b/src/gui/kernel/qplatformintegration.h @@ -91,7 +91,8 @@ public: MultipleWindows, ApplicationState, ForeignWindows, - NonFullScreenWindows + NonFullScreenWindows, + NativeWidgets }; virtual ~QPlatformIntegration() { } diff --git a/src/plugins/platforms/android/src/qandroidplatformintegration.cpp b/src/plugins/platforms/android/src/qandroidplatformintegration.cpp index 8899d98795..5ef0998a49 100644 --- a/src/plugins/platforms/android/src/qandroidplatformintegration.cpp +++ b/src/plugins/platforms/android/src/qandroidplatformintegration.cpp @@ -118,6 +118,7 @@ bool QAndroidPlatformIntegration::hasCapability(Capability cap) const switch (cap) { case ThreadedPixmaps: return true; case NonFullScreenWindows: return false; + case NativeWidgets: return false; default: #ifndef ANDROID_PLUGIN_OPENGL return QPlatformIntegration::hasCapability(cap); diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index ac649b4bdf..fcef038e1e 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -10039,6 +10039,13 @@ void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on) } #endif + // Don't set WA_NativeWindow on platforms that don't support it + if (attribute == Qt::WA_NativeWindow) { + QPlatformIntegration *platformIntegration = QGuiApplicationPrivate::platformIntegration(); + if (!platformIntegration->hasCapability(QPlatformIntegration::NativeWidgets)) + return; + } + setAttribute_internal(attribute, on, data, d); switch (attribute) { |