author | Antonio Rojas
<arojas@archlinux.org> 2020-06-04 14:01:56 UTC |
committer | Antonio Rojas
<arojas@archlinux.org> 2020-06-04 14:01:56 UTC |
parent | 51112e98f12243ee17ba50cd44ea87f6a1259d6a |
PKGBUILD | +6 | -3 |
qtbug-74252.patch | +106 | -0 |
diff --git a/PKGBUILD b/PKGBUILD index a6b4aac..4bac1f7 100644 --- a/PKGBUILD +++ b/PKGBUILD @@ -5,7 +5,7 @@ pkgbase=qt5-base pkgname=(qt5-base qt5-xcb-private-headers) _qtver=5.15.0 pkgver=${_qtver/-/} -pkgrel=1 +pkgrel=2 arch=('x86_64') url='https://www.qt.io' license=('GPL3' 'LGPL3' 'FDL' 'custom') @@ -30,15 +30,18 @@ groups=('qt' 'qt5') _pkgfqn="${pkgbase/5-/}-everywhere-src-${_qtver}" source=("https://download.qt.io/official_releases/qt/${pkgver%.*}/${_qtver}/submodules/${_pkgfqn}.tar.xz" "qt5-base-QTBUG-82910.patch::https://codereview.qt-project.org/gitweb?p=qt/qtbase.git;a=patch;h=54aa63be9b74e8de72db9efbe6809ab1a97b29a7" - qt5-base-cflags.patch) + qt5-base-cflags.patch + qtbug-74252.patch) sha256sums=('9e7af10aece15fa9500369efde69cb220eee8ec3a6818afe01ce1e7d484824c5' 'abb94453c9fe54fde4811bc5475b88796c8db1f5cd75ddc68918aff20139b1aa' - 'cf707cd970650f8b60f8897692b36708ded9ba116723ec8fcd885576783fe85c') + 'cf707cd970650f8b60f8897692b36708ded9ba116723ec8fcd885576783fe85c' + '0c489d2faedd35670232a2c028c5c78a606ab81bb6f40f58e3cfe2bc6b6ac3b2') prepare() { cd ${_pkgfqn} patch -p1 -i ../qt5-base-QTBUG-82910.patch # https://codereview.qt-project.org/c/qt/qtbase/+/299182 + patch -p1 -i ../qtbug-74252.patch # Fix displaying custom icons patch -p1 -i ../qt5-base-cflags.patch # Use system CFLAGS } diff --git a/qtbug-74252.patch b/qtbug-74252.patch new file mode 100644 index 0000000..818f859 --- /dev/null +++ b/qtbug-74252.patch @@ -0,0 +1,106 @@ +From add92a551cf601b5c9e074046326f95ccc38062e Mon Sep 17 00:00:00 2001 +From: Albert Astals Cid <aacid@kde.org> +Date: Sat, 23 May 2020 01:35:18 +0200 +Subject: [PATCH] Do not fully initialize QIconLoader when setting the fallback + theme + +We need this because without this patch you get bugs both +if you call QIcon::setFallbackThemeName before creating the QGuiApplication and +if you call QIcon::setFallbackThemeName after creating QGuiApplication + +Why do you get a bug if you call QIconLoader::setFallbackThemeName +before creating the QGuiApplication: + * QIcon::setFallbackThemeName calls QIconLoader::instance + * QIconLoader::instance calls QIconLoader::ensureInitialized + * QIconLoader::ensureInitialized calls systemThemeName + * systemThemeName asks the current QPlatformTheme for its + QPlatformTheme::SystemIconThemeName + * But since we're calling this before creating the QGuiApplication + there is no current QPlatformTheme yet, so systemThemeName + is set to empty, which is obviously not what we want + +Why do you get a bug if you call QIconLoader::setFallbackThemeName +after creating the QGuiApplication: + * QGuiApplicationPrivate::init calls + QGuiApplicationPrivate::createPlatformIntegration + * QGuiApplicationPrivate::createPlatformIntegration sets the + current QPlatformTheme and at the end of the very same function + uses QIcon::fromTheme + * Since we haven't called QIconLoader::setFallbackThemeName yet + there is at least one icon lookup that doesn't take + the fallback theme we would like to have into account + +This patch makes it so calling QIconLoader::setFallbackThemeName +before creating the QGuiApplication works. + +The only thing we want to do from QIcon::setFallbackThemeName is set +the internal m_userFallbackTheme, it doesn't care about doing +further initialization of QIconLoader, if it's done, great it's done, +if it is not initialized yet, great it will be initialized later +when someone actually tries to use the QIconloader. + +So it's OK for ensureInitialized() to return early if there is no +platform theme yet, because it will be called again later. + +Pick-to: 5.12 +Pick-to: 5.15 +Fixes: QTBUG-74252 +Change-Id: I65268fc3d3d0bd282d76c76cf75e495bcc9d1a30 +Done-with: Albert Astals Cid <albert.astals.cid@kdab.com> +Reviewed-by: Albert Astals Cid <albert.astals.cid@kdab.com> +Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io> +--- + src/gui/image/qicon.cpp | 3 +++ + src/gui/image/qiconloader.cpp | 15 ++++++++++++--- + 2 files changed, 15 insertions(+), 3 deletions(-) + +diff --git a/src/gui/image/qicon.cpp b/src/gui/image/qicon.cpp +index 36f499711e9..91da21c477d 100644 +--- a/src/gui/image/qicon.cpp ++++ b/src/gui/image/qicon.cpp +@@ -1238,6 +1238,9 @@ QString QIcon::fallbackThemeName() + themeSearchPath() containing an index.theme + file describing its contents. + ++ \note This should be done before creating \l QGuiApplication, to ensure ++ correct initialization. ++ + \sa fallbackThemeName(), themeSearchPaths(), themeName() + */ + void QIcon::setFallbackThemeName(const QString &name) +diff --git a/src/gui/image/qiconloader.cpp b/src/gui/image/qiconloader.cpp +index 15ab1b3cd90..3fa3bb9c598 100644 +--- a/src/gui/image/qiconloader.cpp ++++ b/src/gui/image/qiconloader.cpp +@@ -112,10 +112,9 @@ extern QFactoryLoader *qt_iconEngineFactoryLoader(); // qicon.cpp + void QIconLoader::ensureInitialized() + { + if (!m_initialized) { ++ if (!QGuiApplicationPrivate::platformTheme()) ++ return; // it's too early: try again later (QTBUG-74252) + m_initialized = true; +- +- Q_ASSERT(qApp); +- + m_systemTheme = systemThemeName(); + + if (m_systemTheme.isEmpty()) +@@ -125,6 +124,16 @@ void QIconLoader::ensureInitialized() + } + } + ++/*! ++ \internal ++ Gets an instance. ++ ++ \l QIcon::setFallbackThemeName() should be called before QGuiApplication is ++ created, to avoid a race condition (QTBUG-74252). When this function is ++ called from there, ensureInitialized() does not succeed because there ++ is no QPlatformTheme yet, so systemThemeName() is empty, and we don't want ++ m_systemTheme to get intialized to the fallback theme instead of the normal one. ++*/ + QIconLoader *QIconLoader::instance() + { + iconLoaderInstance()->ensureInitialized(); +-- +2.16.3