diff --git a/desktop/toolkit/qt5/qt5-base/actions.py b/desktop/toolkit/qt5/qt5-base/actions.py index 60abf44a4b..17cfe1b2e2 100755 --- a/desktop/toolkit/qt5/qt5-base/actions.py +++ b/desktop/toolkit/qt5/qt5-base/actions.py @@ -73,6 +73,7 @@ def setup(): -nomake tests \ -nomake examples \ -optimized-qmake \ + -no-strip \ -reduce-relocations \ -dbus-linked" % (qt5.prefix, bindirQt5, qt5.headerdir, qt5.archdatadir, qt5.docdir, qt5.plugindir, qt5.importdir, qt5.qmldir, qt5.datadir, qt5.testdir, qt5.translationdir, qt5.sysconfdir, qt5.examplesdir, qt5.libdir) else: diff --git a/desktop/toolkit/qt5/qt5-base/files/qt5-base-QTBUG-82910.patch b/desktop/toolkit/qt5/qt5-base/files/qt5-base-QTBUG-82910.patch new file mode 100644 index 0000000000..260b7c248c --- /dev/null +++ b/desktop/toolkit/qt5/qt5-base/files/qt5-base-QTBUG-82910.patch @@ -0,0 +1,75 @@ +From 54aa63be9b74e8de72db9efbe6809ab1a97b29a7 Mon Sep 17 00:00:00 2001 +From: Takao Fujiwara +Date: Mon, 11 May 2020 21:14:01 +0900 +Subject: [PATCH] IBus: Use WAYLAND_DISPLAY on Wayland sessions to make up + socket names + +A recent change in IBus made it prefer the WAYLAND_DISPLAY envvar in +order to compose its socket path for Wayland sessions. This is because +DISPLAY is unreliable in those environment: It might not be there, there +might be several displays pointing to the same Xwayland server (as it's +the case in GNOME 3.36), or there might even be multiple Xwayland servers +(eg. to enforce inter-app isolation with X11 apps). + +Fixes: QTBUG-82910 +Pick-To: 5.15 +Change-Id: I4883b5d06863ba284883dd95281bed2ce7203e29 +Reviewed-by: Lars Knoll +--- + .../ibus/qibusplatforminputcontext.cpp | 38 +++++++++++++++------- + 1 file changed, 27 insertions(+), 11 deletions(-) + +diff --git a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp +index 47ac54927bc..16c0ebfe213 100644 +--- a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp ++++ b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp +@@ -712,19 +712,35 @@ void QIBusPlatformInputContextPrivate::createBusProxy() + + QString QIBusPlatformInputContextPrivate::getSocketPath() + { +- QByteArray display(qgetenv("DISPLAY")); +- QByteArray host = "unix"; ++ QByteArray display; + QByteArray displayNumber = "0"; ++ bool isWayland = false; ++ ++ if (qEnvironmentVariableIsSet("IBUS_ADDRESS_FILE")) { ++ QByteArray path = qgetenv("IBUS_ADDRESS_FILE"); ++ return QString::fromLocal8Bit(path); ++ } else if (qEnvironmentVariableIsSet("WAYLAND_DISPLAY")) { ++ display = qgetenv("WAYLAND_DISPLAY"); ++ isWayland = true; ++ } else { ++ display = qgetenv("DISPLAY"); ++ } ++ QByteArray host = "unix"; ++ ++ if (isWayland) { ++ displayNumber = display; ++ } else { ++ int pos = display.indexOf(':'); ++ if (pos > 0) ++ host = display.left(pos); ++ ++pos; ++ int pos2 = display.indexOf('.', pos); ++ if (pos2 > 0) ++ displayNumber = display.mid(pos, pos2 - pos); ++ else ++ displayNumber = display.mid(pos); ++ } + +- int pos = display.indexOf(':'); +- if (pos > 0) +- host = display.left(pos); +- ++pos; +- int pos2 = display.indexOf('.', pos); +- if (pos2 > 0) +- displayNumber = display.mid(pos, pos2 - pos); +- else +- displayNumber = display.mid(pos); + if (debug) + qDebug() << "host=" << host << "displayNumber" << displayNumber; + +-- +2.16.3 + diff --git a/desktop/toolkit/qt5/qt5-base/files/qtbug-74252.patch b/desktop/toolkit/qt5/qt5-base/files/qtbug-74252.patch new file mode 100644 index 0000000000..818f859d25 --- /dev/null +++ b/desktop/toolkit/qt5/qt5-base/files/qtbug-74252.patch @@ -0,0 +1,106 @@ +From add92a551cf601b5c9e074046326f95ccc38062e Mon Sep 17 00:00:00 2001 +From: Albert Astals Cid +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 +Reviewed-by: Albert Astals Cid +Reviewed-by: Shawn Rutledge +--- + 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 diff --git a/desktop/toolkit/qt5/qt5-base/files/qtbug-78966.patch b/desktop/toolkit/qt5/qt5-base/files/qtbug-78966.patch new file mode 100644 index 0000000000..e268c5746b --- /dev/null +++ b/desktop/toolkit/qt5/qt5-base/files/qtbug-78966.patch @@ -0,0 +1,39 @@ +From 777f2a1c1e7e1cd669cc152aaa5b99d68b8a1ccd Mon Sep 17 00:00:00 2001 +From: Friedemann Kleint +Date: Wed, 10 Jun 2020 11:26:00 +0200 +Subject: Fix QToolButton menus showing on primary screens in multiscreen + setups + +Calculate an initial position based on the current size hint +and pass it to QMenuPrivate::exec(), which does screen checks +based on it. + +Amends a78d66743171557d79b16c08be775e3ac15bb4ef. + +Fixes: QTBUG-84462 +Task-number: QTBUG-78966 +Change-Id: Icae8d2bc0fb50c4c853cfebaa2b2250fc06542e3 +Reviewed-by: Volker Hilsheimer +(cherry picked from commit ad532ce118b7052be3b69999cef2eb610e66fa88) +Reviewed-by: Qt Cherry-pick Bot +--- + src/widgets/widgets/qtoolbutton.cpp | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/widgets/widgets/qtoolbutton.cpp b/src/widgets/widgets/qtoolbutton.cpp +index 314c6ab40c..e380cb647b 100644 +--- a/src/widgets/widgets/qtoolbutton.cpp ++++ b/src/widgets/widgets/qtoolbutton.cpp +@@ -805,7 +805,8 @@ void QToolButtonPrivate::popupTimerDone() + // QTBUG-78966, Delay positioning until after aboutToShow(). + auto positionFunction = [q, horizontal](const QSize &sizeHint) { + return positionMenu(q, horizontal, sizeHint); }; +- actualMenu->d_func()->exec({}, nullptr, positionFunction); ++ const auto initialPos = positionFunction(actualMenu->sizeHint()); ++ actualMenu->d_func()->exec(initialPos, nullptr, positionFunction); + + if (!that) + return; +-- +cgit v1.2.1 + diff --git a/desktop/toolkit/qt5/qt5-base/files/qtbug-84619.patch b/desktop/toolkit/qt5/qt5-base/files/qtbug-84619.patch new file mode 100644 index 0000000000..1dc61d2a9e --- /dev/null +++ b/desktop/toolkit/qt5/qt5-base/files/qtbug-84619.patch @@ -0,0 +1,225 @@ +From 9d2b474b5f6aa07ee731d28f9774d10dfaa49b32 Mon Sep 17 00:00:00 2001 +From: Allan Sandfeld Jensen +Date: Tue, 2 Jun 2020 10:59:21 +0200 +Subject: Do not multithread if already in a global threadpool thread + +This can lead to a deadlock if we block all the worker threads, waiting +for the worker threads to finish. + +Fixes: QTBUG-84619 +Change-Id: I92b7f96007897d86ece0c34223bab0df4ccbed9a +Reviewed-by: Sona Kurazyan +(cherry picked from commit 87d32424de2f471a520c1f3ba0c3035fbff7ee06) +Reviewed-by: Qt Cherry-pick Bot +--- + src/corelib/thread/qthreadpool.cpp | 24 ++++++++++++++++++++++++ + src/corelib/thread/qthreadpool.h | 2 ++ + src/gui/image/qimage.cpp | 7 ++++--- + src/gui/image/qimage_conversions.cpp | 15 +++++++++------ + src/gui/painting/qimagescale.cpp | 5 +++-- + src/gui/painting/qimagescale_neon.cpp | 5 +++-- + src/gui/painting/qimagescale_sse4.cpp | 5 +++-- + 7 files changed, 48 insertions(+), 15 deletions(-) + +diff --git a/src/corelib/thread/qthreadpool.cpp b/src/corelib/thread/qthreadpool.cpp +index 1f99bad247..d2dcc32280 100644 +--- a/src/corelib/thread/qthreadpool.cpp ++++ b/src/corelib/thread/qthreadpool.cpp +@@ -52,6 +52,7 @@ Q_GLOBAL_STATIC(QThreadPool, theInstance) + */ + class QThreadPoolThread : public QThread + { ++ Q_OBJECT + public: + QThreadPoolThread(QThreadPoolPrivate *manager); + void run() override; +@@ -763,6 +764,28 @@ void QThreadPool::clear() + d->clear(); + } + ++#if QT_VERSION < QT_VERSION_CHECK(6,0,0) ++/*! ++ \internal ++ ++ Returns \c true if \a thread is a thread managed by this thread pool. ++*/ ++#else ++/*! ++ \since 6.0 ++ ++ Returns \c true if \a thread is a thread managed by this thread pool. ++*/ ++#endif ++bool QThreadPool::contains(const QThread *thread) const ++{ ++ Q_D(const QThreadPool); ++ const QThreadPoolThread *poolThread = qobject_cast(thread); ++ if (!poolThread) ++ return false; ++ return d->allThreads.contains(const_cast(poolThread)); ++} ++ + #if QT_DEPRECATED_SINCE(5, 9) + /*! + \since 5.5 +@@ -784,3 +807,4 @@ void QThreadPool::cancel(QRunnable *runnable) + QT_END_NAMESPACE + + #include "moc_qthreadpool.cpp" ++#include "qthreadpool.moc" +diff --git a/src/corelib/thread/qthreadpool.h b/src/corelib/thread/qthreadpool.h +index e3691ab010..004f76a240 100644 +--- a/src/corelib/thread/qthreadpool.h ++++ b/src/corelib/thread/qthreadpool.h +@@ -93,6 +93,8 @@ public: + + void clear(); + ++ bool contains(const QThread *thread) const; ++ + #if QT_DEPRECATED_SINCE(5, 9) + QT_DEPRECATED_X("use tryTake(), but note the different deletion rules") + void cancel(QRunnable *runnable); +diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp +index 499c527cfc..c443836c0a 100644 +--- a/src/gui/image/qimage.cpp ++++ b/src/gui/image/qimage.cpp +@@ -5042,15 +5042,16 @@ void QImage::applyColorTransform(const QColorTransform &transform) + }; + } + +-#if QT_CONFIG(thread) ++#if QT_CONFIG(thread) && !defined(Q_OS_WASM) + int segments = sizeInBytes() / (1<<16); + segments = std::min(segments, height()); +- if (segments > 1) { ++ QThreadPool *threadPool = QThreadPool::globalInstance(); ++ if (segments > 1 && !threadPool->contains(QThread::currentThread())) { + QSemaphore semaphore; + int y = 0; + for (int i = 0; i < segments; ++i) { + int yn = (height() - y) / (segments - i); +- QThreadPool::globalInstance()->start([&, y, yn]() { ++ threadPool->start([&, y, yn]() { + transformSegment(y, y + yn); + semaphore.release(1); + }); +diff --git a/src/gui/image/qimage_conversions.cpp b/src/gui/image/qimage_conversions.cpp +index a3868a64c7..e804b3b788 100644 +--- a/src/gui/image/qimage_conversions.cpp ++++ b/src/gui/image/qimage_conversions.cpp +@@ -236,14 +236,15 @@ void convert_generic(QImageData *dest, const QImageData *src, Qt::ImageConversio + int segments = src->nbytes / (1<<16); + segments = std::min(segments, src->height); + +- if (segments <= 1) ++ QThreadPool *threadPool = QThreadPool::globalInstance(); ++ if (segments <= 1 || threadPool->contains(QThread::currentThread())) + return convertSegment(0, src->height); + + QSemaphore semaphore; + int y = 0; + for (int i = 0; i < segments; ++i) { + int yn = (src->height - y) / (segments - i); +- QThreadPool::globalInstance()->start([&, y, yn]() { ++ threadPool->start([&, y, yn]() { + convertSegment(y, y + yn); + semaphore.release(1); + }); +@@ -290,14 +291,15 @@ void convert_generic_to_rgb64(QImageData *dest, const QImageData *src, Qt::Image + int segments = src->nbytes / (1<<16); + segments = std::min(segments, src->height); + +- if (segments <= 1) ++ QThreadPool *threadPool = QThreadPool::globalInstance(); ++ if (segments <= 1 || threadPool->contains(QThread::currentThread())) + return convertSegment(0, src->height); + + QSemaphore semaphore; + int y = 0; + for (int i = 0; i < segments; ++i) { + int yn = (src->height - y) / (segments - i); +- QThreadPool::globalInstance()->start([&, y, yn]() { ++ threadPool->start([&, y, yn]() { + convertSegment(y, y + yn); + semaphore.release(1); + }); +@@ -396,12 +398,13 @@ bool convert_generic_inplace(QImageData *data, QImage::Format dst_format, Qt::Im + #ifdef QT_USE_THREAD_PARALLEL_IMAGE_CONVERSIONS + int segments = data->nbytes / (1<<16); + segments = std::min(segments, data->height); +- if (segments > 1) { ++ QThreadPool *threadPool = QThreadPool::globalInstance(); ++ if (segments > 1 && !threadPool->contains(QThread::currentThread())) { + QSemaphore semaphore; + int y = 0; + for (int i = 0; i < segments; ++i) { + int yn = (data->height - y) / (segments - i); +- QThreadPool::globalInstance()->start([&, y, yn]() { ++ threadPool->start([&, y, yn]() { + convertSegment(y, y + yn); + semaphore.release(1); + }); +diff --git a/src/gui/painting/qimagescale.cpp b/src/gui/painting/qimagescale.cpp +index 2395c891ce..aac1e20f7b 100644 +--- a/src/gui/painting/qimagescale.cpp ++++ b/src/gui/painting/qimagescale.cpp +@@ -307,12 +307,13 @@ static inline void multithread_pixels_function(QImageScaleInfo *isi, int dh, con + #if QT_CONFIG(thread) && !defined(Q_OS_WASM) + int segments = (qsizetype(isi->sh) * isi->sw) / (1<<16); + segments = std::min(segments, dh); +- if (segments > 1) { ++ QThreadPool *threadPool = QThreadPool::globalInstance(); ++ if (segments > 1 && !threadPool->contains(QThread::currentThread())) { + QSemaphore semaphore; + int y = 0; + for (int i = 0; i < segments; ++i) { + int yn = (dh - y) / (segments - i); +- QThreadPool::globalInstance()->start([&, y, yn]() { ++ threadPool->start([&, y, yn]() { + scaleSection(y, y + yn); + semaphore.release(1); + }); +diff --git a/src/gui/painting/qimagescale_neon.cpp b/src/gui/painting/qimagescale_neon.cpp +index 65fe3fac3c..046e56b419 100644 +--- a/src/gui/painting/qimagescale_neon.cpp ++++ b/src/gui/painting/qimagescale_neon.cpp +@@ -58,12 +58,13 @@ static inline void multithread_pixels_function(QImageScaleInfo *isi, int dh, con + #if QT_CONFIG(thread) && !defined(Q_OS_WASM) + int segments = (qsizetype(isi->sh) * isi->sw) / (1<<16); + segments = std::min(segments, dh); +- if (segments > 1) { ++ QThreadPool *threadPool = QThreadPool::globalInstance(); ++ if (segments > 1 && !threadPool->contains(QThread::currentThread())) { + QSemaphore semaphore; + int y = 0; + for (int i = 0; i < segments; ++i) { + int yn = (dh - y) / (segments - i); +- QThreadPool::globalInstance()->start([&, y, yn]() { ++ threadPool->start([&, y, yn]() { + scaleSection(y, y + yn); + semaphore.release(1); + }); +diff --git a/src/gui/painting/qimagescale_sse4.cpp b/src/gui/painting/qimagescale_sse4.cpp +index 1760e72f65..70cfa08d95 100644 +--- a/src/gui/painting/qimagescale_sse4.cpp ++++ b/src/gui/painting/qimagescale_sse4.cpp +@@ -59,12 +59,13 @@ static inline void multithread_pixels_function(QImageScaleInfo *isi, int dh, con + #if QT_CONFIG(thread) && !defined(Q_OS_WASM) + int segments = (qsizetype(isi->sh) * isi->sw) / (1<<16); + segments = std::min(segments, dh); +- if (segments > 1) { ++ QThreadPool *threadPool = QThreadPool::globalInstance(); ++ if (segments > 1 && !threadPool->contains(QThread::currentThread())) { + QSemaphore semaphore; + int y = 0; + for (int i = 0; i < segments; ++i) { + int yn = (dh - y) / (segments - i); +- QThreadPool::globalInstance()->start([&, y, yn]() { ++ threadPool->start([&, y, yn]() { + scaleSection(y, y + yn); + semaphore.release(1); + }); +-- +cgit v1.2.1 + diff --git a/desktop/toolkit/qt5/qt5-base/pspec.xml b/desktop/toolkit/qt5/qt5-base/pspec.xml index 3e24ed08e1..2838691a12 100755 --- a/desktop/toolkit/qt5/qt5-base/pspec.xml +++ b/desktop/toolkit/qt5/qt5-base/pspec.xml @@ -11,7 +11,7 @@ Cross platform application and UI framework Cross platform application and UI development framework 'GPL3' 'LGPL3' 'FDL' 'custom' - http://download.qt.io/official_releases/qt/5.14/5.14.2/submodules/qtbase-everywhere-src-5.14.2.tar.xz + http://download.qt.io/official_releases/qt/5.15/5.15.1/submodules/qtbase-everywhere-src-5.15.1.tar.xz @@ -81,9 +81,10 @@ mkspecs2.patch - - - + + + + @@ -271,6 +272,13 @@ --> + + 2020-09-09 + 5.15.1 + Version bump. + Mustafa Cinasal + muscnsl@gmail.com + 2020-04-04 5.14.2