diff options
Diffstat (limited to 'source/l/qt5')
41 files changed, 2495 insertions, 0 deletions
diff --git a/source/l/qt5/.deps b/source/l/qt5/.deps new file mode 100644 index 000000000..d1eaacd08 --- /dev/null +++ b/source/l/qt5/.deps @@ -0,0 +1,2 @@ +OpenAL +libxkbcommon diff --git a/source/l/qt5/.url b/source/l/qt5/.url new file mode 100644 index 000000000..cc9f30beb --- /dev/null +++ b/source/l/qt5/.url @@ -0,0 +1 @@ +https://download.qt.io/official_releases/qt/5.13/5.13.2/single/qt-everywhere-src-5.13.2.tar.xz diff --git a/source/l/qt5/doinst.sh b/source/l/qt5/doinst.sh new file mode 100644 index 000000000..3e5691a05 --- /dev/null +++ b/source/l/qt5/doinst.sh @@ -0,0 +1,9 @@ +if [ -x /usr/bin/update-desktop-database ]; then + /usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1 +fi + +if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then + if [ -x /usr/bin/gtk-update-icon-cache ]; then + /usr/bin/gtk-update-icon-cache usr/share/icons/hicolor >/dev/null 2>&1 + fi +fi diff --git a/source/l/qt5/patches/platformplugin-install-path-fix.patch b/source/l/qt5/patches/platformplugin-install-path-fix.patch new file mode 100644 index 000000000..db9b33b9b --- /dev/null +++ b/source/l/qt5/patches/platformplugin-install-path-fix.patch @@ -0,0 +1,15 @@ +See https://bugs.webkit.org/show_bug.cgi?id=117077 + +diff -Naur qt-everywhere-opensource-src-5.0.2.orig/qtwebkit/Source/WebKit/qt/examples/platformplugin/platformplugin.pro qt-everywhere-opensource-src-5.0.2/qtwebkit/Source/WebKit/qt/examples/platformplugin/platformplugin.pro +--- qt-everywhere-opensource-src-5.0.2.orig/qtwebkit/Source/WebKit/qt/examples/platformplugin/platformplugin.pro 2013-04-09 00:11:38.000000000 +0000 ++++ qt-everywhere-opensource-src-5.0.2/qtwebkit/Source/WebKit/qt/examples/platformplugin/platformplugin.pro 2013-05-31 01:18:29.157175082 +0000 +@@ -20,7 +20,8 @@ + } + } + +-DESTDIR = $$[QT_INSTALL_PLUGINS]/webkit ++target.path = $$[QT_INSTALL_PLUGINS]/webkit ++INSTALLS += target + + SOURCES += \ + WebPlugin.cpp \ diff --git a/source/l/qt5/patches/qt5.alsa.patch b/source/l/qt5/patches/qt5.alsa.patch new file mode 100644 index 000000000..892431b32 --- /dev/null +++ b/source/l/qt5/patches/qt5.alsa.patch @@ -0,0 +1,11 @@ +--- qt-everywhere-opensource-src-5.6.0/qtbase/config.tests/unix/alsa/alsatest.cpp.orig 2016-02-29 08:15:48.203031809 +0000 ++++ qt-everywhere-opensource-src-5.6.0/qtbase/config.tests/unix/alsa/alsatest.cpp 2016-02-29 08:16:39.712811962 +0000 +@@ -32,7 +32,7 @@ + ****************************************************************************/ + + #include <alsa/asoundlib.h> +-#if(!(SND_LIB_MAJOR == 1 && SND_LIB_MINOR == 0 && SND_LIB_SUBMINOR >= 10)) ++#if(!(SND_LIB_MAJOR == 1 && (SND_LIB_MINOR > 0 || SND_LIB_SUBMINOR >= 10))) + #error "Alsa version found too old, require >= 1.0.10" + #endif + diff --git a/source/l/qt5/patches/qt5.cr206850.patch b/source/l/qt5/patches/qt5.cr206850.patch new file mode 100644 index 000000000..1fb71df1d --- /dev/null +++ b/source/l/qt5/patches/qt5.cr206850.patch @@ -0,0 +1,43 @@ +The latest MariaDB versions aren't caught properly by the checks in Qt, which +may cause a regression to appear (regression, because it was already fixed in +Qt by Dan Vratil): this manifests itself in Akonadi losing its connection to +the database if running for long periods of time. + +Until this is fixed in Qt, you may want to apply this patch in your packages: + +https://codereview.qt-project.org/#/c/206850/ + +From 64588c9bae92ef79f9ca5e87653ffb0962691d0d Mon Sep 17 00:00:00 2001 +From: Andy Shaw <andy.shaw@qt.io> +Date: Wed, 27 Sep 2017 09:23:10 +0200 +Subject: [PATCH] Extend the MariaDB define check to cover the later versions too + +Change-Id: Ide89b4e07feb116bf152cbf3f5630d313e8ba0f1 +--- + src/plugins/sqldrivers/mysql/qsql_mysql.cpp | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/plugins/sqldrivers/mysql/qsql_mysql.cpp b/src/plugins/sqldrivers/mysql/qsql_mysql.cpp +index 6e428fb..b2d3e85 100644 +--- a/src/plugins/sqldrivers/mysql/qsql_mysql.cpp ++++ b/src/plugins/sqldrivers/mysql/qsql_mysql.cpp +@@ -1159,14 +1159,14 @@ static void qLibraryInit() + # endif // MYSQL_VERSION_ID + #endif // Q_NO_MYSQL_EMBEDDED + +-#ifdef MARIADB_BASE_VERSION ++#if defined(MARIADB_BASE_VERSION) || defined(MARIADB_VERSION_ID) + qAddPostRoutine(mysql_server_end); + #endif + } + + static void qLibraryEnd() + { +-#if !defined(MARIADB_BASE_VERSION) ++#if !defined(MARIADB_BASE_VERSION) && !defined(MARIADB_VERSION_ID) + # if !defined(Q_NO_MYSQL_EMBEDDED) + # if MYSQL_VERSION_ID > 40000 + # if (MYSQL_VERSION_ID >= 40110 && MYSQL_VERSION_ID < 50000) || MYSQL_VERSION_ID >= 50003 +-- +2.7.4 + diff --git a/source/l/qt5/patches/qt5.cve-2020-0569.patch b/source/l/qt5/patches/qt5.cve-2020-0569.patch new file mode 100644 index 000000000..fa0efdce3 --- /dev/null +++ b/source/l/qt5/patches/qt5.cve-2020-0569.patch @@ -0,0 +1,29 @@ +From bf131e8d2181b3404f5293546ed390999f760404 Mon Sep 17 00:00:00 2001 +From: Olivier Goffart <ogoffart@woboq.com> +Date: Fri, 8 Nov 2019 11:30:40 +0100 +Subject: Do not load plugin from the $PWD + +I see no reason why this would make sense to look for plugins in the current +directory. And when there are plugins there, it may actually be wrong + +Change-Id: I5f5aa168021fedddafce90effde0d5762cd0c4c5 +Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> +--- + src/corelib/plugin/qpluginloader.cpp | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/src/corelib/plugin/qpluginloader.cpp b/src/corelib/plugin/qpluginloader.cpp +index cadff4f32b..c2443dbdda 100644 +--- a/src/corelib/plugin/qpluginloader.cpp ++++ b/src/corelib/plugin/qpluginloader.cpp +@@ -305,7 +305,6 @@ static QString locatePlugin(const QString& fileName) + paths.append(fileName.left(slash)); // don't include the '/' + } else { + paths = QCoreApplication::libraryPaths(); +- paths.prepend(QStringLiteral(".")); // search in current dir first + } + + for (const QString &path : qAsConst(paths)) { +-- +cgit v1.2.1 + diff --git a/source/l/qt5/patches/qt5.cve-2020-0570.patch b/source/l/qt5/patches/qt5.cve-2020-0570.patch new file mode 100644 index 000000000..fa3eb3314 --- /dev/null +++ b/source/l/qt5/patches/qt5.cve-2020-0570.patch @@ -0,0 +1,48 @@ +QLibrary/Unix: do not attempt to load a library relative to $PWD + +I added the code in commit 5219c37f7c98f37f078fee00fe8ca35d83ff4f5d to +find libraries in a haswell/ subdir of the main path, but we only need +to do that transformation if the library is contains at least one +directory seprator. That is, if the user asks to load "lib/foo", then we +should try "lib/haswell/foo" (often, the path prefix will be absolute). + +When the library name the user requested has no directory separators, we +let dlopen() do the transformation for us. Testing on Linux confirms +glibc does so: + +$ LD_DEBUG=libs /lib64/ld-linux-x86-64.so.2 --inhibit-cache ./qml -help |& grep Xcursor + 1972475: find library=libXcursor.so.1 [0]; searching + 1972475: trying file=/usr/lib64/haswell/avx512_1/libXcursor.so.1 + 1972475: trying file=/usr/lib64/haswell/libXcursor.so.1 + 1972475: trying file=/usr/lib64/libXcursor.so.1 + 1972475: calling init: /usr/lib64/libXcursor.so.1 + 1972475: calling fini: /usr/lib64/libXcursor.so.1 [0] + +Fixes: QTBUG-81272 +Change-Id: I596aec77785a4e4e84d5fffd15e89689bb91ffbb + +X-Git-Url: https://codereview.qt-project.org/gitweb?p=qt%2Fqtbase.git;a=blobdiff_plain;f=src%2Fcorelib%2Fplugin%2Fqlibrary_unix.cpp;h=135b82cd378b00abe231c2320866d88f8a71b25a;hp=f0de1010d7b7126d83c4365a31924fa080ec334d;hb=27d92ead3a5f3c145f16b96f95a43c5af136a36b;hpb=3b54009b13e9629b75827a59f8537451d25613a4 + +diff --git a/src/corelib/plugin/qlibrary_unix.cpp b/src/corelib/plugin/qlibrary_unix.cpp +index f0de1010d7b..135b82cd378 100644 +--- a/src/corelib/plugin/qlibrary_unix.cpp ++++ b/src/corelib/plugin/qlibrary_unix.cpp +@@ -1,7 +1,7 @@ + /**************************************************************************** + ** + ** Copyright (C) 2016 The Qt Company Ltd. +-** Copyright (C) 2018 Intel Corporation ++** Copyright (C) 2020 Intel Corporation + ** Contact: https://www.qt.io/licensing/ + ** + ** This file is part of the QtCore module of the Qt Toolkit. +@@ -218,6 +218,8 @@ bool QLibraryPrivate::load_sys() + for(int suffix = 0; retry && !pHnd && suffix < suffixes.size(); suffix++) { + if (!prefixes.at(prefix).isEmpty() && name.startsWith(prefixes.at(prefix))) + continue; ++ if (path.isEmpty() && prefixes.at(prefix).contains(QLatin1Char('/'))) ++ continue; + if (!suffixes.at(suffix).isEmpty() && name.endsWith(suffixes.at(suffix))) + continue; + if (loadHints & QLibrary::LoadArchiveMemberHint) { + diff --git a/source/l/qt5/patches/qt5.delayed_highlight.patch b/source/l/qt5/patches/qt5.delayed_highlight.patch new file mode 100644 index 000000000..201179bbd --- /dev/null +++ b/source/l/qt5/patches/qt5.delayed_highlight.patch @@ -0,0 +1,72 @@ +From f8f0f3eef1151c9377a5c76ccfa6432e930e1307 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?M=C3=A5rten=20Nordheim?= <marten.nordheim@qt.io> +Date: Mon, 14 Jan 2019 10:37:42 +0100 +Subject: QSyntaxHighlighter: cancel delayed highlight if done manually +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +It was an implicit effect before which stopped working after +dec7961709c90f6977d2447f7fa6c6625af41cb2. Reintroduce it as some +projects used this side-effect as a way to abort the initial +highlighting. + +Change-Id: I5340ee9882a242bc8b5f7f843f1cfe793a65d357 +Reviewed-by: J?drzej Nowacki <jedrzej.nowacki@qt.io> +--- + src/gui/text/qsyntaxhighlighter.cpp | 1 + + .../qsyntaxhighlighter/tst_qsyntaxhighlighter.cpp | 19 +++++++++++++++++++ + 2 files changed, 20 insertions(+) + +diff --git a/src/gui/text/qsyntaxhighlighter.cpp b/src/gui/text/qsyntaxhighlighter.cpp +index b09f8b565a..0e07b69868 100644 +--- a/src/gui/text/qsyntaxhighlighter.cpp ++++ b/src/gui/text/qsyntaxhighlighter.cpp +@@ -376,6 +376,7 @@ void QSyntaxHighlighter::rehighlight() + + QTextCursor cursor(d->doc); + d->rehighlight(cursor, QTextCursor::End); ++ d->rehighlightPending = false; // user manually did a full rehighlight + } + + /*! +diff --git a/tests/auto/gui/text/qsyntaxhighlighter/tst_qsyntaxhighlighter.cpp b/tests/auto/gui/text/qsyntaxhighlighter/tst_qsyntaxhighlighter.cpp +index 9d6ce78b24..c683ecd424 100644 +--- a/tests/auto/gui/text/qsyntaxhighlighter/tst_qsyntaxhighlighter.cpp ++++ b/tests/auto/gui/text/qsyntaxhighlighter/tst_qsyntaxhighlighter.cpp +@@ -82,6 +82,7 @@ private slots: + void preservePreeditArea(); + void task108530(); + void avoidUnnecessaryRehighlight(); ++ void avoidUnnecessaryDelayedRehighlight(); + void noContentsChangedDuringHighlight(); + void rehighlight(); + void rehighlightBlock(); +@@ -478,6 +479,24 @@ void tst_QSyntaxHighlighter::avoidUnnecessaryRehighlight() + QTRY_VERIFY(!hl->highlighted); + } + ++void tst_QSyntaxHighlighter::avoidUnnecessaryDelayedRehighlight() ++{ ++ // Having text in the document before creating the highlighter starts the delayed rehighlight ++ cursor.insertText("Hello World"); ++ ++ TestHighlighter *hl = new TestHighlighter(doc); ++ QVERIFY(!hl->highlighted); ++ ++ hl->rehighlight(); ++ QVERIFY(hl->highlighted); ++ ++ hl->highlighted = false; ++ // Process events, including delayed rehighlight emission ++ QCoreApplication::processEvents(); ++ // Should be cancelled and no extra rehighlight should be done ++ QVERIFY(!hl->highlighted); ++} ++ + void tst_QSyntaxHighlighter::noContentsChangedDuringHighlight() + { + QVector<QTextLayout::FormatRange> formats; +-- +cgit v1.2.1 + diff --git a/source/l/qt5/patches/qt5.glibc224.patch b/source/l/qt5/patches/qt5.glibc224.patch new file mode 100644 index 000000000..773781acf --- /dev/null +++ b/source/l/qt5/patches/qt5.glibc224.patch @@ -0,0 +1,33 @@ +From b12ffcd411d4776f7120ccecb3be34344d930d2b Mon Sep 17 00:00:00 2001 +From: Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> +Date: Tue, 9 Aug 2016 16:21:29 +0200 +Subject: Do not depend on Linux 4.5 + +Avoid using MADV_FREE that was only recently added to Linux. It will fail when +run on older Linux kernels. + +Change-Id: I9b0369fb31402f088b2327c12f70dd39f5e4c8c0 +Reviewed-by: Peter Varga <pvarga@inf.u-szeged.hu> +--- + chromium/third_party/WebKit/Source/wtf/PageAllocator.cpp | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/src/3rdparty/chromium/third_party/WebKit/Source/wtf/PageAllocator.cpp b/src/3rdparty/chromium/third_party/WebKit/Source/wtf/PageAllocator.cpp +index 121b687..be7c3b9 100644 +--- a/src/3rdparty/chromium/third_party/WebKit/Source/wtf/PageAllocator.cpp ++++ b/src/3rdparty/chromium/third_party/WebKit/Source/wtf/PageAllocator.cpp +@@ -39,6 +39,11 @@ + + #include <sys/mman.h> + ++#if OS(LINUX) && defined(MADV_FREE) ++// Added in Linux 4.5, but we don't want to depend on 4.5 at runtime ++#undef MADV_FREE ++#endif ++ + #ifndef MADV_FREE + #define MADV_FREE MADV_DONTNEED + #endif +-- +cgit v1.0-4-g1e03 + diff --git a/source/l/qt5/patches/qt5.mysql.h.diff b/source/l/qt5/patches/qt5.mysql.h.diff new file mode 100644 index 000000000..f1cf11b91 --- /dev/null +++ b/source/l/qt5/patches/qt5.mysql.h.diff @@ -0,0 +1,11 @@ +--- qt-everywhere-opensource-src-5.9.0/qtbase/src/plugins/sqldrivers/mysql/qsql_mysql_p.h.orig 2017-05-26 14:43:31.000000000 +0200 ++++ qt-everywhere-opensource-src-5.9.0/qtbase/src/plugins/sqldrivers/mysql/qsql_mysql_p.h 2017-06-17 22:11:34.211899826 +0200 +@@ -57,7 +57,7 @@ + #include <QtCore/qt_windows.h> + #endif + +-#include <mysql.h> ++#include <mysql/mysql.h> + + #ifdef QT_PLUGIN + #define Q_EXPORT_SQLDRIVER_MYSQL diff --git a/source/l/qt5/patches/qt5.private-includes.patch b/source/l/qt5/patches/qt5.private-includes.patch new file mode 100644 index 000000000..3ef8ebe42 --- /dev/null +++ b/source/l/qt5/patches/qt5.private-includes.patch @@ -0,0 +1,53 @@ +# Taken from http://code.qt.io/cgit/qt/qtbase.git/patch/?id=67aa365d +# ------------------------------------------------------------------ + +From 67aa365d41ebfe082b4efcfd725e4d5f08be678c Mon Sep 17 00:00:00 2001 +From: Ulf Hermann <ulf.hermann@qt.io> +Date: Wed, 25 Apr 2018 12:48:21 +0200 +Subject: Do emit CMake declarations for existing private headers + +We need to make sure we don't emit CMake declarations for private +headers if those headers are absent. However, most of the time we have +private headers and should add them. + +Task-number: QTBUG-37417 +Change-Id: I639eb93d008de27928dedac540894af70c1883b9 +Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io> +--- + mkspecs/features/create_cmake.prf | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/mkspecs/features/create_cmake.prf b/mkspecs/features/create_cmake.prf +index 66acedef55..2ed708e085 100644 +--- a/mkspecs/features/create_cmake.prf ++++ b/mkspecs/features/create_cmake.prf +@@ -28,9 +28,13 @@ CMAKE_OUT_DIR = $$MODULE_BASE_OUTDIR/lib/cmake + + CMAKE_MODULE_NAME = $$cmakeModuleName($${MODULE}) + ++!generated_privates { ++ isEmpty(SYNCQT.INJECTED_PRIVATE_HEADER_FILES):isEmpty(SYNCQT.PRIVATE_HEADER_FILES): \ ++ CMAKE_NO_PRIVATE_INCLUDES = true ++} ++ + split_incpath { + CMAKE_ADD_SOURCE_INCLUDE_DIRS = true +- CMAKE_NO_PRIVATE_INCLUDES = true # Don't add private includes in the build dir which don't exist + CMAKE_SOURCE_INCLUDES = \ + $$cmakeTargetPaths($$QT_MODULE_INCLUDE_BASE $$QT_MODULE_INCLUDE_BASE/Qt$${CMAKE_MODULE_NAME}) + CMAKE_SOURCE_PRIVATE_INCLUDES = \ +@@ -53,10 +57,6 @@ contains(CMAKE_INCLUDE_DIR, "^\\.\\./.*") { + CMAKE_INCLUDE_DIR_IS_ABSOLUTE = True + } + +-isEmpty(QT.$${MODULE}_private.includes)| \ +- !exists($$first(QT.$${MODULE}_private.includes)): \ +- CMAKE_NO_PRIVATE_INCLUDES = true +- + CMAKE_LIB_DIR = $$cmakeRelativePath($$[QT_INSTALL_LIBS], $$[QT_INSTALL_PREFIX]) + contains(CMAKE_LIB_DIR,"^\\.\\./.*") { + CMAKE_LIB_DIR = $$[QT_INSTALL_LIBS]/ +-- +cgit v1.1-6-g87c4 + + diff --git a/source/l/qt5/patches/qt5.pulseaudio.diff b/source/l/qt5/patches/qt5.pulseaudio.diff new file mode 100644 index 000000000..8d8f616d5 --- /dev/null +++ b/source/l/qt5/patches/qt5.pulseaudio.diff @@ -0,0 +1,12 @@ +--- qt-everywhere-opensource-src-5.4.0/qtwebengine/src/3rdparty/chromium/media/media.gyp.orig 2014-12-05 17:26:44.000000000 +0100 ++++ qt-everywhere-opensource-src-5.4.0/qtwebengine/src/3rdparty/chromium/media/media.gyp 2014-12-12 10:27:20.393735405 +0100 +@@ -29,7 +29,7 @@ + ['use_cras==1', { + 'use_pulseaudio%': 0, + }, { +- 'use_pulseaudio%': 1, ++ 'use_pulseaudio%': 0, + }], + ], + }, { + diff --git a/source/l/qt5/patches/qt5.qlockfile-deadlock.patch b/source/l/qt5/patches/qt5.qlockfile-deadlock.patch new file mode 100644 index 000000000..e51d5ad05 --- /dev/null +++ b/source/l/qt5/patches/qt5.qlockfile-deadlock.patch @@ -0,0 +1,116 @@ +# Taken from: +# https://projects.archlinux.org/svntogit/packages.git/plain/trunk/qlockfile-deadlock.patch?h=packages/qt5 +# QTBUG-44771 +# ---------------------------------------------------------------------------- +From f58e882b7594c59b6050d3c87562fcf836d10f60 Mon Sep 17 00:00:00 2001 +From: Olivier Goffart <ogoffart@woboq.com> +Date: Tue, 14 Apr 2015 10:58:26 +0200 +Subject: QLockFile: fix deadlock when the lock file is corrupted + +[ChangeLog][QtCore][QLockFile] Fixed a deadlock when the lock file +is corrupted. + +Task-number: QTBUG-44771 +Change-Id: Ic490b09d70ff1cc1733b64949889a73720b2d0f3 +Reviewed-by: David Faure <david.faure@kdab.com> +--- + src/corelib/io/qlockfile_unix.cpp | 10 +++++----- + src/corelib/io/qlockfile_win.cpp | 22 +++++++++++----------- + tests/auto/corelib/io/qlockfile/tst_qlockfile.cpp | 17 +++++++++++++++++ + 3 files changed, 33 insertions(+), 16 deletions(-) + +diff --git a/qtbase/src/corelib/io/qlockfile_unix.cpp b/qtbase/src/corelib/io/qlockfile_unix.cpp +index bf1015a..dc9f8f7 100644 +--- a/qtbase/src/corelib/io/qlockfile_unix.cpp ++++ b/qtbase/src/corelib/io/qlockfile_unix.cpp +@@ -181,11 +181,11 @@ bool QLockFilePrivate::isApparentlyStale() const + { + qint64 pid; + QString hostname, appname; +- if (!getLockInfo(&pid, &hostname, &appname)) +- return false; +- if (hostname.isEmpty() || hostname == QString::fromLocal8Bit(localHostName())) { +- if (::kill(pid, 0) == -1 && errno == ESRCH) +- return true; // PID doesn't exist anymore ++ if (getLockInfo(&pid, &hostname, &appname)) { ++ if (hostname.isEmpty() || hostname == QString::fromLocal8Bit(localHostName())) { ++ if (::kill(pid, 0) == -1 && errno == ESRCH) ++ return true; // PID doesn't exist anymore ++ } + } + const qint64 age = QFileInfo(fileName).lastModified().msecsTo(QDateTime::currentDateTime()); + return staleLockTime > 0 && age > staleLockTime; +diff --git a/qtbase/src/corelib/io/qlockfile_win.cpp b/qtbase/src/corelib/io/qlockfile_win.cpp +index f9f2909..3587c7b 100644 +--- a/qtbase/src/corelib/io/qlockfile_win.cpp ++++ b/qtbase/src/corelib/io/qlockfile_win.cpp +@@ -115,21 +115,21 @@ bool QLockFilePrivate::isApparentlyStale() const + { + qint64 pid; + QString hostname, appname; +- if (!getLockInfo(&pid, &hostname, &appname)) +- return false; + + // On WinRT there seems to be no way of obtaining information about other + // processes due to sandboxing + #ifndef Q_OS_WINRT +- if (hostname == QString::fromLocal8Bit(localHostName())) { +- HANDLE procHandle = ::OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid); +- if (!procHandle) +- return true; +- // We got a handle but check if process is still alive +- DWORD dwR = ::WaitForSingleObject(procHandle, 0); +- ::CloseHandle(procHandle); +- if (dwR == WAIT_TIMEOUT) +- return true; ++ if (getLockInfo(&pid, &hostname, &appname)) { ++ if (hostname == QString::fromLocal8Bit(localHostName())) { ++ HANDLE procHandle = ::OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid); ++ if (!procHandle) ++ return true; ++ // We got a handle but check if process is still alive ++ DWORD dwR = ::WaitForSingleObject(procHandle, 0); ++ ::CloseHandle(procHandle); ++ if (dwR == WAIT_TIMEOUT) ++ return true; ++ } + } + #endif // !Q_OS_WINRT + const qint64 age = QFileInfo(fileName).lastModified().msecsTo(QDateTime::currentDateTime()); +diff --git a/qtbase/tests/auto/corelib/io/qlockfile/tst_qlockfile.cpp b/qtbase/tests/auto/corelib/io/qlockfile/tst_qlockfile.cpp +index 77bef94..12bea67 100644 +--- a/qtbase/tests/auto/corelib/io/qlockfile/tst_qlockfile.cpp ++++ b/qtbase/tests/auto/corelib/io/qlockfile/tst_qlockfile.cpp +@@ -58,6 +58,7 @@ private slots: + void staleLongLockFromBusyProcess(); + void staleLockRace(); + void noPermissions(); ++ void corruptedLockFile(); + + public: + QString m_helperApp; +@@ -415,5 +416,21 @@ void tst_QLockFile::noPermissions() + QCOMPARE(int(lockFile.error()), int(QLockFile::PermissionError)); + } + ++void tst_QLockFile::corruptedLockFile() ++{ ++ const QString fileName = dir.path() + "/corruptedLockFile"; ++ ++ { ++ // Create a empty file. Typically the result of a computer crash or hard disk full. ++ QFile file(fileName); ++ QVERIFY(file.open(QFile::WriteOnly)); ++ } ++ ++ QLockFile secondLock(fileName); ++ secondLock.setStaleLockTime(100); ++ QVERIFY(secondLock.tryLock(10000)); ++ QCOMPARE(int(secondLock.error()), int(QLockFile::NoError)); ++} ++ + QTEST_MAIN(tst_QLockFile) + #include "tst_qlockfile.moc" +-- +cgit v0.11.0 + diff --git a/source/l/qt5/patches/qt5.qt5uitoolsconfig.patch b/source/l/qt5/patches/qt5.qt5uitoolsconfig.patch new file mode 100644 index 000000000..1a0da5b9f --- /dev/null +++ b/source/l/qt5/patches/qt5.qt5uitoolsconfig.patch @@ -0,0 +1,17 @@ +The fix for https://bugreports.qt.io/browse/QTBUG-76244 was not complete. +Further quoting is needed to deal with empty variables. +-- Eric Hameleers <alien@slackware.com> + +--- qt-everywhere-src-5.13.0/qtbase/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in.orig 2019-06-13 06:18:18.000000000 +0200 ++++ qt-everywhere-src-5.13.0/qtbase/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in 2019-07-09 19:37:15.253291684 +0200 +@@ -57,8 +57,8 @@ + + if(EXISTS \"${prl_file_location}\") + file(STRINGS \"${prl_file_location}\" _prl_strings REGEX \"QMAKE_PRL_LIBS[ \\t]*=\") +- string(REGEX REPLACE \"QMAKE_PRL_LIBS[ \\t]*=[ \\t]*([^\\n]*)\" \"\\\\1\" _static_depends ${_prl_strings}) +- string(REGEX REPLACE \"[ \\t]+\" \";\" _static_depends ${_static_depends}) ++ string(REGEX REPLACE \"QMAKE_PRL_LIBS[ \\t]*=[ \\t]*([^\\n]*)\" \"\\\\1\" _static_depends \"${_prl_strings}\") ++ string(REGEX REPLACE \"[ \\t]+\" \";\" _static_depends \"${_static_depends}\") + string(REGEX REPLACE \"[ \\t]+\" \";\" _standard_libraries \"${CMAKE_CXX_STANDARD_LIBRARIES}\") + set(_search_paths) + string(REPLACE \"\\$\\$[QT_INSTALL_LIBS]\" \"${_qt5_install_libs}\" _static_depends \"${_static_depends}\") diff --git a/source/l/qt5/patches/qt5.qtbase_cmake_isystem_includes.patch b/source/l/qt5/patches/qt5.qtbase_cmake_isystem_includes.patch new file mode 100644 index 000000000..ff00e63be --- /dev/null +++ b/source/l/qt5/patches/qt5.qtbase_cmake_isystem_includes.patch @@ -0,0 +1,14 @@ +diff -up qtbase-everywhere-src-5.12.1/src/gui/Qt5GuiConfigExtras.cmake.in.foo qtbase-everywhere-src-5.12.1/src/gui/Qt5GuiConfigExtras.cmake.in +--- qtbase-everywhere-src-5.12.1/src/gui/Qt5GuiConfigExtras.cmake.in.foo 2019-04-30 15:18:24.886346423 -0500 ++++ qtbase-everywhere-src-5.12.1/src/gui/Qt5GuiConfigExtras.cmake.in 2019-04-30 15:19:48.303873296 -0500 +@@ -66,8 +66,10 @@ unset(_GL_INCDIRS) + # Don\'t check for existence of the "_qt5gui_OPENGL_INCLUDE_DIR" because it is + # optional. + ++if (NOT ${_qt5gui_OPENGL_INCLUDE_DIR} STREQUAL "/usr/include") + list(APPEND Qt5Gui_INCLUDE_DIRS ${_qt5gui_OPENGL_INCLUDE_DIR}) + set_property(TARGET Qt5::Gui APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${_qt5gui_OPENGL_INCLUDE_DIR}) ++endif() + + unset(_qt5gui_OPENGL_INCLUDE_DIR CACHE) + diff --git a/source/l/qt5/patches/qt5.qtbug-49061.patch b/source/l/qt5/patches/qt5.qtbug-49061.patch new file mode 100644 index 000000000..d006edbeb --- /dev/null +++ b/source/l/qt5/patches/qt5.qtbug-49061.patch @@ -0,0 +1,80 @@ +# +# https://github.com/qt/qtbase/commit/494376f9.patch +# +From 494376f980e96339b6f1eff7c41336ca4d853065 Mon Sep 17 00:00:00 2001 +From: Thiago Macieira <thiago.macieira@intel.com> +Date: Thu, 12 Nov 2015 10:14:51 -0800 +Subject: [PATCH] Stop unloading plugins in QPluginLoader and QFactoryLoader + +QPluginLoader hasn't unloaded in its destructor since Qt 5.0, but we +missed the equivalent code in QFactoryLoader (which bypasses +QPluginLoader). Besides, QPluginLoader::unload() was still doing +unloading, which it won't anymore. + +Not unloading plugins is Qt's policy, as decided during the 5.0 +development process and reaffirmed now in 5.6. This is due to static +data in plugins leaking out and remaining in use past the unloading of +the plugin, causing crashes. + +This does not affect QLibrary and QLibrary::unload(). Those are meant +for non-Qt loadable modules, so unloading them may be safe. + +Task-number: QTBUG-49061 +Discussed-on: http://lists.qt-project.org/pipermail/development/2015-November/023681.html +Change-Id: I461e9fc7199748faa187ffff1416070f138df8db +Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com> +Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com> +--- + src/corelib/plugin/qfactoryloader.cpp | 6 ++++-- + src/corelib/plugin/qpluginloader.cpp | 5 +++-- + 2 files changed, 7 insertions(+), 4 deletions(-) + +diff --git a/src/corelib/plugin/qfactoryloader.cpp b/src/corelib/plugin/qfactoryloader.cpp +index 53b38c3..c820d53 100644 +--- a/src/corelib/plugin/qfactoryloader.cpp ++++ b/src/corelib/plugin/qfactoryloader.cpp +@@ -203,10 +203,12 @@ void QFactoryLoader::update() + ++keyUsageCount; + } + } +- if (keyUsageCount || keys.isEmpty()) ++ if (keyUsageCount || keys.isEmpty()) { ++ library->setLoadHints(QLibrary::PreventUnloadHint); // once loaded, don't unload + d->libraryList += library; +- else ++ } else { + library->release(); ++ } + } + } + #else +diff --git a/src/corelib/plugin/qpluginloader.cpp b/src/corelib/plugin/qpluginloader.cpp +index 62067c7..4752f69 100644 +--- a/src/corelib/plugin/qpluginloader.cpp ++++ b/src/corelib/plugin/qpluginloader.cpp +@@ -154,6 +154,7 @@ QPluginLoader::QPluginLoader(const QString &fileName, QObject *parent) + : QObject(parent), d(0), did_load(false) + { + setFileName(fileName); ++ setLoadHints(QLibrary::PreventUnloadHint); + } + + /*! +@@ -348,7 +349,7 @@ static QString locatePlugin(const QString& fileName) + void QPluginLoader::setFileName(const QString &fileName) + { + #if defined(QT_SHARED) +- QLibrary::LoadHints lh; ++ QLibrary::LoadHints lh = QLibrary::PreventUnloadHint; + if (d) { + lh = d->loadHints(); + d->release(); +@@ -394,7 +395,7 @@ QString QPluginLoader::errorString() const + \brief Give the load() function some hints on how it should behave. + + You can give hints on how the symbols in the plugin are +- resolved. By default, none of the hints are set. ++ resolved. By default since Qt 5.7, QLibrary::PreventUnloadHint is set. + + See the documentation of QLibrary::loadHints for a complete + description of how this property works. diff --git a/source/l/qt5/patches/qt5.qtbug-49452.patch b/source/l/qt5/patches/qt5.qtbug-49452.patch new file mode 100644 index 000000000..4549ff16e --- /dev/null +++ b/source/l/qt5/patches/qt5.qtbug-49452.patch @@ -0,0 +1,58 @@ +From 6f423555eba55ccdf7287071e10576bc1b687fd2 Mon Sep 17 00:00:00 2001 +From: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io> +Date: Mon, 1 Aug 2016 13:39:53 +0200 +Subject: [PATCH] REG: Fix unwanted cache flush in Freetype engine + +The Freetype cache was almost completely disabled by +134c6db8587a8ce156d4fa31ffa62605821851b2 because after that +change, the lockedAlphaMapForGlyph() function would no longer +cut off early for empty glyphs like spaces, but rather go +through all alpha map functions before it realized that there +was nothing to render. This would in turn invalidate the cache +for every empty glyph, causing all glyphs to be rerendered for +every isolated word. + +This change adds back a cut off. This is only needed in the +lockedAlphaMapForGlyph() function, since the superclass implementation +of the other alpha map functions already contains a cut off for +width/height == 0. + +[ChangeLog][Qt Gui][Text] Fixed a performance regression in Freetype +engine that was introduced in Qt 5.5. + +Change-Id: I381285939909e99cc5fb5f3497fecf9fa871f29a +Task-number: QTBUG-49452 +Reviewed-by: Simon Hausmann <simon.hausmann@qt.io> +--- + src/gui/text/qfontengine_ft.cpp | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/src/gui/text/qfontengine_ft.cpp b/src/gui/text/qfontengine_ft.cpp +index 4de41df..7c878da 100644 +--- a/src/gui/text/qfontengine_ft.cpp ++++ b/src/gui/text/qfontengine_ft.cpp +@@ -1716,7 +1716,7 @@ glyph_metrics_t QFontEngineFT::alphaMapBoundingBox(glyph_t glyph, QFixed subPixe + + static inline QImage alphaMapFromGlyphData(QFontEngineFT::Glyph *glyph, QFontEngine::GlyphFormat glyphFormat) + { +- if (glyph == Q_NULLPTR) ++ if (glyph == Q_NULLPTR || glyph->height == 0 || glyph->width == 0) + return QImage(); + + QImage::Format format = QImage::Format_Invalid; +@@ -1764,11 +1764,15 @@ QImage *QFontEngineFT::lockedAlphaMapForGlyph(glyph_t glyphIndex, QFixed subPixe + + currentlyLockedAlphaMap = alphaMapFromGlyphData(glyph, neededFormat); + ++ const bool glyphHasGeometry = glyph != Q_NULLPTR && glyph->height != 0 && glyph->width != 0; + if (!cacheEnabled && glyph != &emptyGlyph) { + currentlyLockedAlphaMap = currentlyLockedAlphaMap.copy(); + delete glyph; + } + ++ if (!glyphHasGeometry) ++ return Q_NULLPTR; ++ + if (currentlyLockedAlphaMap.isNull()) + return QFontEngine::lockedAlphaMapForGlyph(glyphIndex, subPixelPosition, neededFormat, t, offset); + diff --git a/source/l/qt5/patches/qt5.qtbug-51621.patch b/source/l/qt5/patches/qt5.qtbug-51621.patch new file mode 100644 index 000000000..187a3d785 --- /dev/null +++ b/source/l/qt5/patches/qt5.qtbug-51621.patch @@ -0,0 +1,39 @@ +build with explicitlib after all + +unlike speculated in 2fe363514, this is not a workaround at all: it +causes that libraries' public link interfaces (LIBS) are exported in the +first place. unlike with staticlib, this does not export LIBS_PRIVATE, +so it wouldn't even be a particularly effective workaround for rpath +brokenness anyway. + +the problem was pretty well hidden by the qt module system, which at the +level of libraries is pretty redundant with the .prl file handling, +which shows just how stupid the whole "design" is. + +unlike before, we now enable explicitlib for all libraries, not just qt +modules - we enable create_prl for all of them as well, after all. + +an immediate effect of this change is that it fixes linking on RaspPI: +the qtcore headers make the user code require linking libatomic, so we +must add it to our public link interface. + +Task-number: QTBUG-51621 +Change-Id: I5742c88694db8e8a9b79d17222dc6df2b38e5ab2 + +X-Git-Url: https://codereview.qt-project.org/gitweb?p=qt%2Fqtbase.git;a=blobdiff_plain;f=mkspecs%2Ffeatures%2Fqt_build_config.prf;h=b3081b960ec192c3421d7a1c2bd5a628f0ca8455;hp=518fd93f0457c6060721c38ad8b6a0286407e562;hb=268e7ee9778de79d2485bdd028721ec7adbc1324;hpb=495e8c205424253186bef47421de63534d23dd59 + +diff --git a/mkspecs/features/qt_build_config.prf b/mkspecs/features/qt_build_config.prf +index 518fd93..b3081b9 100644 +--- a/mkspecs/features/qt_build_config.prf ++++ b/mkspecs/features/qt_build_config.prf +@@ -72,6 +72,10 @@ CONFIG += \ + # However, testcases should be still built with exceptions. + exceptions_off testcase_exceptions + ++# Under Windows, this is neither necessary (transitive deps are automatically ++# resolved), nor functional (.res files end up in .prl files and break things). ++unix: CONFIG += explicitlib ++ + + defineTest(qtBuildPart) { + bp = $$eval($$upper($$section(_QMAKE_CONF_, /, -2, -2))_BUILD_PARTS) diff --git a/source/l/qt5/patches/qt5.qtbug-51648.patch b/source/l/qt5/patches/qt5.qtbug-51648.patch new file mode 100644 index 000000000..279839b04 --- /dev/null +++ b/source/l/qt5/patches/qt5.qtbug-51648.patch @@ -0,0 +1,88 @@ +From b024fbe83863fc57364a52c717d5b43d654bdb5d Mon Sep 17 00:00:00 2001 +From: Weng Xuetian <wengxt@gmail.com> +Date: Sat, 5 Mar 2016 12:23:21 -0800 +Subject: [PATCH] QtDBus: clean up signal hooks and object tree in + closeConnection + +If a QObject is added or passed as receiver to QDBusConnection::connect() +and it is managed by Q_GLOBAL_STATIC or similar mechanism, it is +possible that when that its destructor is called after the dbus daemon +thread ends. In that case, QObject::destroyed connected via +Qt::BlockingQueuedConnection to QDBusConnectionPrivate will cause dead +lock since the thread is no longer processing events. + +Task-number: QTBUG-51648 +Change-Id: I1a1810a6d6d0234af0269d5f3fc1f54101bf1547 +--- + src/dbus/qdbusconnection_p.h | 1 + + src/dbus/qdbusintegrator.cpp | 28 +++++++++++++++++++++++++++- + 2 files changed, 28 insertions(+), 1 deletion(-) + +diff --git a/src/dbus/qdbusconnection_p.h b/src/dbus/qdbusconnection_p.h +index c77daf7..565eb83 100644 +--- a/src/dbus/qdbusconnection_p.h ++++ b/src/dbus/qdbusconnection_p.h +@@ -254,6 +254,7 @@ private: + const QVector<int> &metaTypes, int slotIdx); + + SignalHookHash::Iterator removeSignalHookNoLock(SignalHookHash::Iterator it); ++ void disconnectObjectTree(ObjectTreeNode &node); + + bool isServiceRegisteredByThread(const QString &serviceName); + +diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp +index cd44861..a3cd47b 100644 +--- a/src/dbus/qdbusintegrator.cpp ++++ b/src/dbus/qdbusintegrator.cpp +@@ -1030,7 +1030,6 @@ QDBusConnectionPrivate::~QDBusConnectionPrivate() + qPrintable(name)); + + closeConnection(); +- rootNode.children.clear(); // free resources + qDeleteAll(cachedMetaObjects); + + if (mode == ClientMode || mode == PeerMode) { +@@ -1052,6 +1051,20 @@ QDBusConnectionPrivate::~QDBusConnectionPrivate() + } + } + ++void QDBusConnectionPrivate::disconnectObjectTree(QDBusConnectionPrivate::ObjectTreeNode &haystack) ++{ ++ QDBusConnectionPrivate::ObjectTreeNode::DataList::Iterator it = haystack.children.begin(); ++ ++ while (it != haystack.children.end()) { ++ disconnectObjectTree(*it); ++ it++; ++ } ++ ++ if (haystack.obj) { ++ haystack.obj->disconnect(this); ++ } ++} ++ + void QDBusConnectionPrivate::closeConnection() + { + QDBusWriteLocker locker(CloseConnectionAction, this); +@@ -1075,6 +1088,19 @@ void QDBusConnectionPrivate::closeConnection() + } + + qDeleteAll(pendingCalls); ++ ++ // clean up all signal hook and object tree, to avoid QObject::destroyed ++ // being activated to dbus daemon thread which already quits. ++ // dbus connection is already closed, so there is nothing we could do be clean ++ // up everything here. ++ SignalHookHash::iterator sit = signalHooks.begin(); ++ while (sit != signalHooks.end()) { ++ sit.value().obj->disconnect(this); ++ sit++; ++ } ++ ++ disconnectObjectTree(rootNode); ++ rootNode.children.clear(); // free resources + } + + void QDBusConnectionPrivate::checkThread() +-- +2.7.1 + diff --git a/source/l/qt5/patches/qt5.qtbug-51649.patch b/source/l/qt5/patches/qt5.qtbug-51649.patch new file mode 100644 index 000000000..3b7cf9ec6 --- /dev/null +++ b/source/l/qt5/patches/qt5.qtbug-51649.patch @@ -0,0 +1,159 @@ +From acde2e69df5dedc624674107596f276125e22864 Mon Sep 17 00:00:00 2001 +From: Weng Xuetian <wengxt@gmail.com> +Date: Thu, 3 Mar 2016 21:56:53 -0800 +Subject: [PATCH] QtDBus: finish all pending call with error if disconnected + +libdbus will send a local signal if connection gets disconnected. When +this happens, end all pending calls with QDBusError::Disconnected. + +Task-number: QTBUG-51649 +Change-Id: I5c7d2a468bb5da746d0c0e53e458c1e376f186a9 +--- + src/dbus/dbus_minimal_p.h | 2 ++ + src/dbus/qdbusintegrator.cpp | 26 +++++++++++++++++----- + src/dbus/qdbusutil_p.h | 6 +++++ + .../dbus/qdbusconnection/tst_qdbusconnection.cpp | 22 ++++++++++++++++++ + .../dbus/qdbusconnection/tst_qdbusconnection.h | 1 + + 5 files changed, 51 insertions(+), 6 deletions(-) + +diff --git a/src/dbus/dbus_minimal_p.h b/src/dbus/dbus_minimal_p.h +index f0a2954..8f25b24 100644 +--- a/src/dbus/dbus_minimal_p.h ++++ b/src/dbus/dbus_minimal_p.h +@@ -99,9 +99,11 @@ typedef dbus_uint32_t dbus_bool_t; + /* dbus-shared.h */ + #define DBUS_SERVICE_DBUS "org.freedesktop.DBus" + #define DBUS_PATH_DBUS "/org/freedesktop/DBus" ++#define DBUS_PATH_LOCAL "/org/freedesktop/DBus/Local" + #define DBUS_INTERFACE_DBUS "org.freedesktop.DBus" + #define DBUS_INTERFACE_INTROSPECTABLE "org.freedesktop.DBus.Introspectable" + #define DBUS_INTERFACE_PROPERTIES "org.freedesktop.DBus.Properties" ++#define DBUS_INTERFACE_LOCAL "org.freedesktop.DBus.Local" + + #define DBUS_NAME_FLAG_ALLOW_REPLACEMENT 0x1 /**< Allow another service to become the primary owner if requested */ + #define DBUS_NAME_FLAG_REPLACE_EXISTING 0x2 /**< Request to replace the current primary owner */ +diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp +index cd44861..320419f 100644 +--- a/src/dbus/qdbusintegrator.cpp ++++ b/src/dbus/qdbusintegrator.cpp +@@ -519,6 +519,14 @@ bool QDBusConnectionPrivate::handleMessage(const QDBusMessage &amsg) + switch (amsg.type()) { + case QDBusMessage::SignalMessage: + handleSignal(amsg); ++ // Check local disconnected signal from libdbus ++ if (amsg.interface() == QDBusUtil::dbusInterfaceLocal() ++ && amsg.path() == QDBusUtil::dbusPathLocal() ++ && amsg.member() == QDBusUtil::disconnected() ++ && !QDBusMessagePrivate::isLocal(amsg)) { ++ while (!pendingCalls.isEmpty()) ++ processFinishedCall(pendingCalls.first()); ++ } + // if there are any other filters in this DBusConnection, + // let them see the signal too + return false; +@@ -1767,10 +1775,16 @@ void QDBusConnectionPrivate::processFinishedCall(QDBusPendingCallPrivate *call) + + QDBusMessage &msg = call->replyMessage; + if (call->pending) { +- // decode the message +- DBusMessage *reply = q_dbus_pending_call_steal_reply(call->pending); +- msg = QDBusMessagePrivate::fromDBusMessage(reply, connection->capabilities); +- q_dbus_message_unref(reply); ++ // when processFinishedCall is called and pending call is not completed, ++ // it means we received disconnected signal from libdbus ++ if (q_dbus_pending_call_get_completed(call->pending)) { ++ // decode the message ++ DBusMessage *reply = q_dbus_pending_call_steal_reply(call->pending); ++ msg = QDBusMessagePrivate::fromDBusMessage(reply, connection->capabilities); ++ q_dbus_message_unref(reply); ++ } else { ++ msg = QDBusMessage::createError(QDBusError::Disconnected, QDBusUtil::disconnectedErrorMessage()); ++ } + } + qDBusDebug() << connection << "got message reply:" << msg; + +@@ -2070,8 +2084,8 @@ void QDBusConnectionPrivate::sendInternal(QDBusPendingCallPrivate *pcall, void * + pcall->pending = pending; + q_dbus_pending_call_set_notify(pending, qDBusResultReceived, pcall, 0); + +- // DBus won't notify us when a peer disconnects so we need to track these ourselves +- if (mode == QDBusConnectionPrivate::PeerMode) ++ // DBus won't notify us when a peer disconnects or server terminates so we need to track these ourselves ++ if (mode == QDBusConnectionPrivate::PeerMode || mode == QDBusConnectionPrivate::ClientMode) + pendingCalls.append(pcall); + + return; +diff --git a/src/dbus/qdbusutil_p.h b/src/dbus/qdbusutil_p.h +index 8f5ae92..ca70ff9 100644 +--- a/src/dbus/qdbusutil_p.h ++++ b/src/dbus/qdbusutil_p.h +@@ -155,6 +155,8 @@ namespace QDBusUtil + { return QStringLiteral(DBUS_SERVICE_DBUS); } + inline QString dbusPath() + { return QStringLiteral(DBUS_PATH_DBUS); } ++ inline QString dbusPathLocal() ++ { return QStringLiteral(DBUS_PATH_LOCAL); } + inline QString dbusInterface() + { + // it's the same string, but just be sure +@@ -165,8 +167,12 @@ namespace QDBusUtil + { return QStringLiteral(DBUS_INTERFACE_PROPERTIES); } + inline QString dbusInterfaceIntrospectable() + { return QStringLiteral(DBUS_INTERFACE_INTROSPECTABLE); } ++ inline QString dbusInterfaceLocal() ++ { return QStringLiteral(DBUS_INTERFACE_LOCAL); } + inline QString nameOwnerChanged() + { return QStringLiteral("NameOwnerChanged"); } ++ inline QString disconnected() ++ { return QStringLiteral("Disconnected"); } + inline QString disconnectedErrorMessage() + { return QStringLiteral("Not connected to D-Bus server"); } + } +diff --git a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp +index e91f87d..6c7e6b1 100644 +--- a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp ++++ b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp +@@ -1218,6 +1218,28 @@ void tst_QDBusConnection::callVirtualObjectLocal() + QCOMPARE(obj.replyArguments, subPathReply.arguments()); + } + ++void tst_QDBusConnection::pendingCallWhenDisconnected() ++{ ++ QDBusServer *server = new QDBusServer; ++ QDBusConnection con = QDBusConnection::connectToPeer(server->address(), "disconnect"); ++ QTestEventLoop::instance().enterLoop(2); ++ QVERIFY(!QTestEventLoop::instance().timeout()); ++ QVERIFY(con.isConnected()); ++ ++ delete server; ++ ++ // Make sure we call the method before we know it is disconnected. ++ QVERIFY(con.isConnected()); ++ QDBusMessage message = QDBusMessage::createMethodCall("", "/", QString(), "method"); ++ QDBusPendingCall reply = con.asyncCall(message); ++ ++ QTestEventLoop::instance().enterLoop(2); ++ QVERIFY(!con.isConnected()); ++ QVERIFY(reply.isFinished()); ++ QVERIFY(reply.isError()); ++ QVERIFY(reply.error().type() == QDBusError::Disconnected); ++} ++ + QString MyObject::path; + QString MyObjectWithoutInterface::path; + QString MyObjectWithoutInterface::interface; +diff --git a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.h b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.h +index a53ba32..720e484 100644 +--- a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.h ++++ b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.h +@@ -121,6 +121,7 @@ private slots: + void registerVirtualObject(); + void callVirtualObject(); + void callVirtualObjectLocal(); ++ void pendingCallWhenDisconnected(); + + public: + QString serviceName() const { return "org.qtproject.Qt.Autotests.QDBusConnection"; } +-- +2.7.1 + diff --git a/source/l/qt5/patches/qt5.qtbug-51676.patch b/source/l/qt5/patches/qt5.qtbug-51676.patch new file mode 100644 index 000000000..8672a2136 --- /dev/null +++ b/source/l/qt5/patches/qt5.qtbug-51676.patch @@ -0,0 +1,126 @@ +From 11c5e716b08b6b3c5a7c9fce96b0cde8624ec869 Mon Sep 17 00:00:00 2001 +From: Thiago Macieira <thiago.macieira@intel.com> +Date: Tue, 15 Mar 2016 11:00:20 -0700 +Subject: [PATCH] Fix QtDBus deadlock inside kded/kiod + +Whenever a message spy was installed, we failed to actually process +looped-back messages by queueing them for processing by the spy. That +had as a consequence that the caller got an error reply. Worse, since +the message had been queued, QtDBus would attempt to deliver it later. +Since that message had isLocal==true, bad things happened inside the +manager thread. + +The correct solution is not to queue the message for the filter. If the +message is local, then simply deliver directly, as we're still in the +user's thread. This used to be the behavior in Qt 5.5. + +Task-number: QTBUG-51676 +Change-Id: I1dc112894cde7121e8ce302ae51b438ade1ff612 +--- + src/dbus/qdbusintegrator.cpp | 42 ++++++++++++++++++++++++++++++++---------- + src/dbus/qdbusintegrator_p.h | 1 + + 2 files changed, 33 insertions(+), 10 deletions(-) + +diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp +index cd44861..478a2c4 100644 +--- a/src/dbus/qdbusintegrator.cpp ++++ b/src/dbus/qdbusintegrator.cpp +@@ -481,6 +481,11 @@ QDBusSpyCallEvent::~QDBusSpyCallEvent() + + void QDBusSpyCallEvent::placeMetaCall(QObject *) + { ++ invokeSpyHooks(msg, hooks, hookCount); ++} ++ ++inline void QDBusSpyCallEvent::invokeSpyHooks(const QDBusMessage &msg, const Hook *hooks, int hookCount) ++{ + // call the spy hook list + for (int i = 0; i < hookCount; ++i) + hooks[i](msg); +@@ -509,7 +514,12 @@ bool QDBusConnectionPrivate::handleMessage(const QDBusMessage &amsg) + { + if (!ref.load()) + return false; +- if (!dispatchEnabled && !QDBusMessagePrivate::isLocal(amsg)) { ++ ++ // local message are always delivered, regardless of filtering ++ // or whether the dispatcher is enabled ++ bool isLocal = QDBusMessagePrivate::isLocal(amsg); ++ ++ if (!dispatchEnabled && !isLocal) { + // queue messages only, we'll handle them later + qDBusDebug() << this << "delivery is suspended"; + pendingMessages << amsg; +@@ -523,13 +533,23 @@ bool QDBusConnectionPrivate::handleMessage(const QDBusMessage &amsg) + // let them see the signal too + return false; + case QDBusMessage::MethodCallMessage: +- // run it through the spy filters (if any) before the regular processing ++ // run it through the spy filters (if any) before the regular processing: ++ // a) if it's a local message, we're in the caller's thread, so invoke the filter directly ++ // b) if it's an external message, post to the main thread + if (Q_UNLIKELY(qDBusSpyHookList.exists()) && qApp) { + const QDBusSpyHookList &list = *qDBusSpyHookList; +- qDBusDebug() << this << "invoking message spies"; +- QCoreApplication::postEvent(qApp, new QDBusSpyCallEvent(this, QDBusConnection(this), +- amsg, list.constData(), list.size())); +- return true; ++ if (isLocal) { ++ Q_ASSERT(QThread::currentThread() != thread()); ++ qDBusDebug() << this << "invoking message spies directly"; ++ QDBusSpyCallEvent::invokeSpyHooks(amsg, list.constData(), list.size()); ++ } else { ++ qDBusDebug() << this << "invoking message spies via event"; ++ QCoreApplication::postEvent(qApp, new QDBusSpyCallEvent(this, QDBusConnection(this), ++ amsg, list.constData(), list.size())); ++ ++ // we'll be called back, so return ++ return true; ++ } + } + + handleObjectCall(amsg); +@@ -1451,9 +1471,9 @@ void QDBusConnectionPrivate::handleObjectCall(const QDBusMessage &msg) + // that means the dispatchLock mutex is locked + // must not call out to user code in that case + // +- // however, if the message is internal, handleMessage was called +- // directly and no lock is in place. We can therefore call out to +- // user code, if necessary ++ // however, if the message is internal, handleMessage was called directly ++ // (user's thread) and no lock is in place. We can therefore call out to ++ // user code, if necessary. + ObjectTreeNode result; + int usedLength; + QThread *objThread = 0; +@@ -1492,12 +1512,14 @@ void QDBusConnectionPrivate::handleObjectCall(const QDBusMessage &msg) + usedLength, msg)); + return; + } else if (objThread != QThread::currentThread()) { +- // synchronize with other thread ++ // looped-back message, targeting another thread: ++ // synchronize with it + postEventToThread(HandleObjectCallPostEventAction, result.obj, + new QDBusActivateObjectEvent(QDBusConnection(this), this, result, + usedLength, msg, &sem)); + semWait = true; + } else { ++ // looped-back message, targeting current thread + semWait = false; + } + } // release the lock +diff --git a/src/dbus/qdbusintegrator_p.h b/src/dbus/qdbusintegrator_p.h +index 2bbebdf..c0d9c22 100644 +--- a/src/dbus/qdbusintegrator_p.h ++++ b/src/dbus/qdbusintegrator_p.h +@@ -145,6 +145,7 @@ public: + {} + ~QDBusSpyCallEvent(); + void placeMetaCall(QObject *) Q_DECL_OVERRIDE; ++ static inline void invokeSpyHooks(const QDBusMessage &msg, const Hook *hooks, int hookCount); + + QDBusConnection conn; // keeps the refcount in QDBusConnectionPrivate up + QDBusMessage msg; +-- +2.7.1 + diff --git a/source/l/qt5/patches/qt5.qtbug-51890.patch b/source/l/qt5/patches/qt5.qtbug-51890.patch new file mode 100644 index 000000000..51168b90f --- /dev/null +++ b/source/l/qt5/patches/qt5.qtbug-51890.patch @@ -0,0 +1,82 @@ +QTBUG-51890: qtwebengine fails to build with system nss 3.23 +Patch obtained from: +https://github.com/qtproject/qtwebengine/commit/82900c7b96b2a6fb42fe3841df7685b820edd588.patch + +And modified to exclude the "Subproject commit" lines. + +# ---------------------------------------------------------------------------- + +From 82900c7b96b2a6fb42fe3841df7685b820edd588 Mon Sep 17 00:00:00 2001 +From: Kai Koehne <kai.koehne@theqtcompany.com> +Date: Thu, 24 Mar 2016 13:55:28 +0100 +Subject: [PATCH] Use system NSS only for certificate handling + +Compiling against NSS 3.23 fails with current Chromium. Also, with NSS +3.21 there are failures connecting to e.g. google.com. + +Fix this by adapting the setup endorsed by upstream Chromium: BoringSSL +is always used for cryptography, and NSS only for certificate handlng. + +Patches included in 3rdparty update: + +0a385bb [backport] Call EnsureNSSHttpIOInit in the chimera build. +0472123 Fix build against newer NSS +90c62c4 <third_party/libpng> [Backport] update to libpng 1.2.56 +34857b8 <third_party/libpng> [Backport] Stop large iCCP chunks causing delays and "Aw Snap!" + +Task-number: QTBUG-52193 +Task-number: QTBUG-51890 +Task-number: QTBUG-52068 +Change-Id: If8aaed9b9a09475c5ed0dfec64d31f45ce9670f5 +Reviewed-by: Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> +--- + src/3rdparty | 2 +- + src/core/config/linux.pri | 9 ++++++--- + tools/qmake/mkspecs/features/configure.prf | 4 ++-- + 3 files changed, 9 insertions(+), 6 deletions(-) + +#diff --git a/src/3rdparty b/src/3rdparty +#index 3b2b78c..0a385bb 160000 +#--- a/src/3rdparty +#+++ b/src/3rdparty +#@@ -1 +1 @@ +#-Subproject commit 3b2b78caa761db2b7b25dc51c3dae8316f595db1 +#+Subproject commit 0a385bb01d9cf060fae4c9d350ee98561654df96 +diff --git a/src/core/config/linux.pri b/src/core/config/linux.pri +index 88c1a41..39eeb2a 100644 +--- a/src/core/config/linux.pri ++++ b/src/core/config/linux.pri +@@ -18,11 +18,14 @@ GYP_CONFIG += \ + use_gio=0 \ + use_gnome_keyring=0 \ + use_kerberos=0 \ +- use_pango=0 ++ use_pango=0 \ ++ use_openssl=1 + +-!use?(nss) { ++use?(nss) { ++ GYP_CONFIG += use_nss_certs=1 \ ++ use_openssl_certs=0 ++} else { + GYP_CONFIG += use_nss_certs=0 \ +- use_openssl=1 \ + use_openssl_certs=1 + } + +diff --git a/tools/qmake/mkspecs/features/configure.prf b/tools/qmake/mkspecs/features/configure.prf +index 4cb4600..953572d 100644 +--- a/tools/qmake/mkspecs/features/configure.prf ++++ b/tools/qmake/mkspecs/features/configure.prf +@@ -72,9 +72,9 @@ defineTest(runConfigure) { + defineTest(finalizeConfigure) { + linux { + use?(nss) { +- log("SSL............................... Using system NSS$${EOL}") ++ log("Certificate handling.............. Using system NSS$${EOL}") + } else { +- log("SSL............................... Using bundled BoringSSL$${EOL}") ++ log("Certificate handling.............. Using bundled BoringSSL$${EOL}") + } + use?(system_icu) { + packagesExist("icu-uc icu-i18n") { diff --git a/source/l/qt5/patches/qt5.qtbug-51927.patch b/source/l/qt5/patches/qt5.qtbug-51927.patch new file mode 100644 index 000000000..d253dc15e --- /dev/null +++ b/source/l/qt5/patches/qt5.qtbug-51927.patch @@ -0,0 +1,185 @@ +From 5149aa68eca6ede8836ec4f07a14d22d9da9b161 Mon Sep 17 00:00:00 2001 +From: Mitch Curtis <mitch.curtis@qt.io> +Date: Tue, 13 Sep 2016 12:42:12 +0200 +Subject: Fix crash on exit when using default property aliases with layouts + +The layout was being destroyed before the text, which meant that the +removeItemChangeListener() call never got hit. To ensure that the +listener is always removed, loop through each child in QQuickLayout's +destructor. + +This is a manual cherry-pick of +59c6c0e0b1b5b46747595a58e11311b7393d7e70. + +Task-number: QTBUG-51927 +Change-Id: I669f42beb8c3dd6b4b741cae0b16e017bb3409df +Reviewed-by: J-P Nurmi <jpnurmi@qt.io> +--- + src/imports/layouts/qquicklayout.cpp | 4 ++ + .../qquicklayouts/data/rowlayout/Container.qml | 55 ++++++++++++++++++++++ + .../qquicklayouts/data/rowlayout/ContainerUser.qml | 53 +++++++++++++++++++++ + .../quick/qquicklayouts/data/tst_rowlayout.qml | 12 +++++ + 4 files changed, 124 insertions(+) + create mode 100644 tests/auto/quick/qquicklayouts/data/rowlayout/Container.qml + create mode 100644 tests/auto/quick/qquicklayouts/data/rowlayout/ContainerUser.qml + +diff --git a/src/imports/layouts/qquicklayout.cpp b/src/imports/layouts/qquicklayout.cpp +index abc8f97..9914826 100644 +--- a/src/imports/layouts/qquicklayout.cpp ++++ b/src/imports/layouts/qquicklayout.cpp +@@ -698,6 +698,10 @@ QQuickLayout::QQuickLayout(QQuickLayoutPrivate &dd, QQuickItem *parent) + QQuickLayout::~QQuickLayout() + { + d_func()->m_isReady = false; ++ ++ const auto childItems = d_func()->childItems; ++ for (QQuickItem *child : childItems) ++ QQuickItemPrivate::get(child)->removeItemChangeListener(this, QQuickItemPrivate::SiblingOrder); + } + + QQuickLayoutAttached *QQuickLayout::qmlAttachedProperties(QObject *object) +diff --git a/tests/auto/quick/qquicklayouts/data/rowlayout/Container.qml b/tests/auto/quick/qquicklayouts/data/rowlayout/Container.qml +new file mode 100644 +index 0000000..22205c1 +--- /dev/null ++++ b/tests/auto/quick/qquicklayouts/data/rowlayout/Container.qml +@@ -0,0 +1,55 @@ ++/**************************************************************************** ++** ++** Copyright (C) 2016 The Qt Company Ltd. ++** Contact: http://www.qt.io/licensing/ ++** ++** This file is part of the test suite of the Qt Toolkit. ++** ++** $QT_BEGIN_LICENSE:BSD$ ++** You may use this file under the terms of the BSD license as follows: ++** ++** "Redistribution and use in source and binary forms, with or without ++** modification, are permitted provided that the following conditions are ++** met: ++** * Redistributions of source code must retain the above copyright ++** notice, this list of conditions and the following disclaimer. ++** * Redistributions in binary form must reproduce the above copyright ++** notice, this list of conditions and the following disclaimer in ++** the documentation and/or other materials provided with the ++** distribution. ++** * Neither the name of The Qt Company Ltd nor the names of its ++** contributors may be used to endorse or promote products derived ++** from this software without specific prior written permission. ++** ++** ++** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ++** ++** $QT_END_LICENSE$ ++** ++****************************************************************************/ ++ ++import QtQuick 2.7 ++import QtQuick.Layouts 1.3 ++ ++Item { ++ objectName: "qtbug51927-window" ++ visible: true ++ ++ default property alias _contents: customContent.data ++ ++ RowLayout { ++ id: customContent ++ objectName: "qtbug51927-columnLayout" ++ anchors.fill: parent ++ } ++} +diff --git a/tests/auto/quick/qquicklayouts/data/rowlayout/ContainerUser.qml b/tests/auto/quick/qquicklayouts/data/rowlayout/ContainerUser.qml +new file mode 100644 +index 0000000..ff7ce62 +--- /dev/null ++++ b/tests/auto/quick/qquicklayouts/data/rowlayout/ContainerUser.qml +@@ -0,0 +1,53 @@ ++/**************************************************************************** ++** ++** Copyright (C) 2016 The Qt Company Ltd. ++** Contact: http://www.qt.io/licensing/ ++** ++** This file is part of the test suite of the Qt Toolkit. ++** ++** $QT_BEGIN_LICENSE:BSD$ ++** You may use this file under the terms of the BSD license as follows: ++** ++** "Redistribution and use in source and binary forms, with or without ++** modification, are permitted provided that the following conditions are ++** met: ++** * Redistributions of source code must retain the above copyright ++** notice, this list of conditions and the following disclaimer. ++** * Redistributions in binary form must reproduce the above copyright ++** notice, this list of conditions and the following disclaimer in ++** the documentation and/or other materials provided with the ++** distribution. ++** * Neither the name of The Qt Company Ltd nor the names of its ++** contributors may be used to endorse or promote products derived ++** from this software without specific prior written permission. ++** ++** ++** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ++** ++** $QT_END_LICENSE$ ++** ++****************************************************************************/ ++ ++import QtQuick 2.6 ++import QtQuick.Window 2.2 ++ ++Container { ++ visible: true ++ ++ Text { ++ objectName: "qtbug51927-text" ++ text: qsTr("Hello World") ++ anchors.centerIn: parent ++ renderType: Text.QtRendering ++ } ++} +diff --git a/tests/auto/quick/qquicklayouts/data/tst_rowlayout.qml b/tests/auto/quick/qquicklayouts/data/tst_rowlayout.qml +index 33b8fd0..2d4e227 100644 +--- a/tests/auto/quick/qquicklayouts/data/tst_rowlayout.qml ++++ b/tests/auto/quick/qquicklayouts/data/tst_rowlayout.qml +@@ -926,5 +926,17 @@ Item { + waitForRendering(layout) + layout.destroy() + } ++ ++ ++ function test_defaultPropertyAliasCrash() { ++ var containerUserComponent = Qt.createComponent("rowlayout/ContainerUser.qml"); ++ compare(containerUserComponent.status, Component.Ready); ++ ++ var containerUser = containerUserComponent.createObject(testCase); ++ verify(containerUser); ++ ++ // Shouldn't crash. ++ containerUser.destroy(); ++ } + } + } +-- +cgit v1.0-4-g1e03 + diff --git a/source/l/qt5/patches/qt5.qtbug-53237.patch b/source/l/qt5/patches/qt5.qtbug-53237.patch new file mode 100644 index 000000000..c6d5739d5 --- /dev/null +++ b/source/l/qt5/patches/qt5.qtbug-53237.patch @@ -0,0 +1,90 @@ +From 8e889378115c69508b050a511621ac8e30ec4158 Mon Sep 17 00:00:00 2001 +From: Jesus Fernandez <jesus.fernandez@theqtcompany.com> +Date: Mon, 13 Jun 2016 19:09:15 +0200 +Subject: [PATCH] Fix UNSIGNED values in QMYSQL + +The unsigned flag in columns was ignored when creating the list of +bound values in a mysql table. So the result iteration with +QSqlQuery::next stops after the first wrong truncated value. + +[ChangeLog][QtSql] Fixed QSqlQuery::prepare value truncation error when +using UNSIGNED values in a MySQL database. + +Task-number: QTBUG-53969 +Task-number: QTBUG-53237 +Change-Id: I10d977993445f2794f1dd8c88b2e83517ef524f3 +Reviewed-by: Milian Wolff <milian.wolff@kdab.com> +--- + src/sql/drivers/mysql/qsql_mysql.cpp | 1 + + tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp | 39 +++++++++++++++++++++++ + 2 files changed, 40 insertions(+) + +diff --git a/src/sql/drivers/mysql/qsql_mysql.cpp b/src/sql/drivers/mysql/qsql_mysql.cpp +index 96bdcc4..55bf499 100644 +--- a/src/sql/drivers/mysql/qsql_mysql.cpp ++++ b/src/sql/drivers/mysql/qsql_mysql.cpp +@@ -387,6 +387,7 @@ bool QMYSQLResultPrivate::bindInValues() + bind->buffer_length = f.bufLength = fieldInfo->length + 1; + bind->is_null = &f.nullIndicator; + bind->length = &f.bufLength; ++ bind->is_unsigned = fieldInfo->flags & UNSIGNED_FLAG ? 1 : 0; + f.outField=field; + + ++i; +diff --git a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp +index bd553d5..f1c4333 100644 +--- a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp ++++ b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp +@@ -233,6 +233,9 @@ private slots: + void QTBUG_36211_data() { generic_data("QPSQL"); } + void QTBUG_36211(); + ++ void QTBUG_53969_data() { generic_data("QMYSQL"); } ++ void QTBUG_53969(); ++ + void sqlite_constraint_data() { generic_data("QSQLITE"); } + void sqlite_constraint(); + +@@ -3652,6 +3655,42 @@ void tst_QSqlQuery::QTBUG_36211() + } + } + ++void tst_QSqlQuery::QTBUG_53969() ++{ ++ QFETCH( QString, dbName ); ++ QVector<int> values = QVector<int>() << 10 << 20 << 127 << 128 << 1, tableValues; ++ QSqlDatabase db = QSqlDatabase::database( dbName ); ++ CHECK_DATABASE( db ); ++ tableValues.reserve(values.size()); ++ if (tst_Databases::getDatabaseType(db) == QSqlDriver::MySqlServer) { ++ const QString tableName(qTableName("bug53969", __FILE__, db)); ++ tst_Databases::safeDropTable( db, tableName ); ++ ++ QSqlQuery q(db); ++ QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (id INT AUTO_INCREMENT PRIMARY KEY, " ++ "test_number TINYINT(3) UNSIGNED)") ++ .arg(tableName))); ++ ++ QVERIFY_SQL(q, prepare("INSERT INTO " + tableName + " (test_number) VALUES (:value)")); ++ ++ QVector<int>::iterator begin = values.begin(), end = values.end(), it; ++ for (it = begin; it != end; ++it) { ++ q.bindValue(":value", *it); ++ QVERIFY_SQL(q, exec()); ++ } ++ ++ QVERIFY_SQL(q, prepare("SELECT test_number FROM " + tableName)); ++ QVERIFY_SQL(q, exec()); ++ ++ while (q.next()) { ++ bool ok; ++ tableValues.push_back(q.value(0).toUInt(&ok)); ++ QVERIFY(ok); ++ } ++ QCOMPARE(values, tableValues); ++ } ++} ++ + void tst_QSqlQuery::oraOCINumber() + { + QFETCH( QString, dbName ); diff --git a/source/l/qt5/patches/qt5.qtbug-55583.patch b/source/l/qt5/patches/qt5.qtbug-55583.patch new file mode 100644 index 000000000..804f53832 --- /dev/null +++ b/source/l/qt5/patches/qt5.qtbug-55583.patch @@ -0,0 +1,41 @@ +# +# https://github.com/qt/qtbase/commit/84ea00d4.patch +# +From 84ea00d47049d882f2fabf1446ec6c6eb5fe3038 Mon Sep 17 00:00:00 2001 +From: J-P Nurmi <jpnurmi@qt.io> +Date: Tue, 6 Dec 2016 16:30:31 +0100 +Subject: [PATCH] QGtk3Dialog: don't crash on Wayland + +Check if it's an X11 window before calling XSetTransientForHint(). +No transient parent will be set for GTK+ dialogs on Wayland. That +has to be implemented separately. + +Task-number: QTBUG-55583 +Change-Id: Iabc2a72681c8157bb2f2fe500892853aa397106b +Reviewed-by: Dmitry Shachnev <mitya57@gmail.com> +Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io> +--- + src/plugins/platformthemes/gtk3/qgtk3dialoghelpers.cpp | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +diff --git a/src/plugins/platformthemes/gtk3/qgtk3dialoghelpers.cpp b/src/plugins/platformthemes/gtk3/qgtk3dialoghelpers.cpp +index ba5089a..699b058 100644 +--- a/src/plugins/platformthemes/gtk3/qgtk3dialoghelpers.cpp ++++ b/src/plugins/platformthemes/gtk3/qgtk3dialoghelpers.cpp +@@ -135,10 +135,12 @@ bool QGtk3Dialog::show(Qt::WindowFlags flags, Qt::WindowModality modality, QWind + + GdkWindow *gdkWindow = gtk_widget_get_window(gtkWidget); + if (parent) { +- GdkDisplay *gdkDisplay = gdk_window_get_display(gdkWindow); +- XSetTransientForHint(gdk_x11_display_get_xdisplay(gdkDisplay), +- gdk_x11_window_get_xid(gdkWindow), +- parent->winId()); ++ if (GDK_IS_X11_WINDOW(gdkWindow)) { ++ GdkDisplay *gdkDisplay = gdk_window_get_display(gdkWindow); ++ XSetTransientForHint(gdk_x11_display_get_xdisplay(gdkDisplay), ++ gdk_x11_window_get_xid(gdkWindow), ++ parent->winId()); ++ } + } + + if (modality != Qt::NonModal) { diff --git a/source/l/qt5/patches/qt5.qtbug-60558.patch b/source/l/qt5/patches/qt5.qtbug-60558.patch new file mode 100644 index 000000000..2d039203f --- /dev/null +++ b/source/l/qt5/patches/qt5.qtbug-60558.patch @@ -0,0 +1,32 @@ +https://github.com/qt/qtbase/commit/f45c6c18.patch + +From f45c6c180463ccb6620e1d273a264f14a1204a93 Mon Sep 17 00:00:00 2001 +From: Thiago Macieira <thiago.macieira@intel.com> +Date: Wed, 3 May 2017 14:08:50 -0700 +Subject: [PATCH] QInternal::unregisterCallback: don't crash on unregistering + during exit + +Task-number: QTBUG-60558 +Change-Id: Ica9894dc9b5e48278fd4fffd14bb34c6d98d2555 +Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com> +--- + src/corelib/global/qglobal.cpp | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp +index c37503f3db..22fc20d47e 100644 +--- a/src/corelib/global/qglobal.cpp ++++ b/src/corelib/global/qglobal.cpp +@@ -3988,8 +3988,10 @@ bool QInternal::registerCallback(Callback cb, qInternalCallback callback) + bool QInternal::unregisterCallback(Callback cb, qInternalCallback callback) + { + if (cb >= 0 && cb < QInternal::LastCallback) { +- QInternal_CallBackTable *cbt = global_callback_table(); +- return (bool) cbt->callbacks[cb].removeAll(callback); ++ if (global_callback_table.exists()) { ++ QInternal_CallBackTable *cbt = global_callback_table(); ++ return (bool) cbt->callbacks[cb].removeAll(callback); ++ } + } + return false; + } diff --git a/source/l/qt5/patches/qt5.qtbug-61140.patch b/source/l/qt5/patches/qt5.qtbug-61140.patch new file mode 100644 index 000000000..17468a957 --- /dev/null +++ b/source/l/qt5/patches/qt5.qtbug-61140.patch @@ -0,0 +1,101 @@ +https://github.com/qt/qtbase/commit/744fd39e.patch + +From 744fd39e66b0b44e65a2505d674fa1cda8b205a4 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= <tor.arne.vestbo@qt.io> +Date: Fri, 2 Jun 2017 11:09:55 +0200 +Subject: [PATCH] xcb: Don't destroy foreign windows + +We can't rely on virtual dispatch in the destructor. + +Task-number: QTBUG-61140 +Change-Id: Ib1026caf126095778c24254775cb5a0bfecf3a38 +Reviewed-by: Fabian Vogt +Reviewed-by: Gatis Paeglis <gatis.paeglis@qt.io> +--- + src/plugins/platforms/xcb/qxcbintegration.cpp | 18 +----------------- + src/plugins/platforms/xcb/qxcbwindow.cpp | 16 ++++++++++------ + src/plugins/platforms/xcb/qxcbwindow.h | 12 ++++++++++++ + 3 files changed, 23 insertions(+), 23 deletions(-) + +diff --git a/src/plugins/platforms/xcb/qxcbintegration.cpp b/src/plugins/platforms/xcb/qxcbintegration.cpp +index b414bee204..8e3ee20329 100644 +--- a/src/plugins/platforms/xcb/qxcbintegration.cpp ++++ b/src/plugins/platforms/xcb/qxcbintegration.cpp +@@ -214,25 +214,9 @@ QPlatformWindow *QXcbIntegration::createPlatformWindow(QWindow *window) const + return xcbWindow; + } + +-class QXcbForeignWindow : public QXcbWindow +-{ +-public: +- QXcbForeignWindow(QWindow *window, WId nativeHandle) +- : QXcbWindow(window) { m_window = nativeHandle; } +- ~QXcbForeignWindow() {} +- bool isForeignWindow() const override { return true; } +- +-protected: +- // No-ops +- void create() override {} +- void destroy() override {} +-}; +- + QPlatformWindow *QXcbIntegration::createForeignWindow(QWindow *window, WId nativeHandle) const + { +- QXcbWindow *xcbWindow = new QXcbForeignWindow(window, nativeHandle); +- xcbWindow->create(); +- return xcbWindow; ++ return new QXcbForeignWindow(window, nativeHandle); + } + + #ifndef QT_NO_OPENGL +diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp +index 289d0720e7..d6c69d52ef 100644 +--- a/src/plugins/platforms/xcb/qxcbwindow.cpp ++++ b/src/plugins/platforms/xcb/qxcbwindow.cpp +@@ -597,13 +597,17 @@ QXcbWindow::~QXcbWindow() + } + + destroy(); ++} + +- if (isForeignWindow()) { +- if (connection()->mouseGrabber() == this) +- connection()->setMouseGrabber(Q_NULLPTR); +- if (connection()->mousePressWindow() == this) +- connection()->setMousePressWindow(Q_NULLPTR); +- } ++QXcbForeignWindow::~QXcbForeignWindow() ++{ ++ // Clear window so that destroy() does not affect it ++ m_window = 0; ++ ++ if (connection()->mouseGrabber() == this) ++ connection()->setMouseGrabber(nullptr); ++ if (connection()->mousePressWindow() == this) ++ connection()->setMousePressWindow(nullptr); + } + + void QXcbWindow::destroy() +diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h +index 56628094ee..f38343b6c2 100644 +--- a/src/plugins/platforms/xcb/qxcbwindow.h ++++ b/src/plugins/platforms/xcb/qxcbwindow.h +@@ -278,6 +278,18 @@ public Q_SLOTS: + xcb_cursor_t m_currentBitmapCursor = XCB_CURSOR_NONE; + }; + ++class QXcbForeignWindow : public QXcbWindow ++{ ++public: ++ QXcbForeignWindow(QWindow *window, WId nativeHandle) ++ : QXcbWindow(window) { m_window = nativeHandle; } ++ ~QXcbForeignWindow(); ++ bool isForeignWindow() const override { return true; } ++ ++protected: ++ void create() override {} // No-op ++}; ++ + QT_END_NAMESPACE + + Q_DECLARE_METATYPE(QXcbWindow*) diff --git a/source/l/qt5/patches/qt5.qtbug-66103.patch b/source/l/qt5/patches/qt5.qtbug-66103.patch new file mode 100644 index 000000000..62d1b3019 --- /dev/null +++ b/source/l/qt5/patches/qt5.qtbug-66103.patch @@ -0,0 +1,172 @@ +https://code.qt.io/cgit/qt/qtbase.git/patch/?id=4a7771f206d4b29be549d3827c36a46679d90de6 + +From 4a7771f206d4b29be549d3827c36a46679d90de6 Mon Sep 17 00:00:00 2001 +From: Eike Hein <hein@kde.org> +Date: Sun, 7 Jan 2018 13:02:01 +0900 +Subject: QSimpleDrag: Fix mouse release coords for delayed event transmission + +On platforms such as XCB, the drag cursor pixmap is shown via a window +(a QShapedPixmapWindow) under the cursor. + +The mouse button release event at the end of the drag is received in +this QXcbWindow, but intercepted by an event filter that QSimpleDrag +installs on the QApplication. It then resends it unmodified(!) after +the drag has ended and the drag pixmap window destroyed, causing it to +be delivered to the new top-level window. + +The local coordinates in the unmodified QMouseEvent are local to the +drag pixmap window and don't match the window it is delayed-transmitted +to. + +This ends up having fatal, user-visible effects particularly in Qt +Quick: QQuickWindow synthesizes a hover event once per frame using +the last received mouse coordinates, here: the release posted by +QSimpleDrag. This is done to update the hover event state for items +under the cursor when the mouse hasn't moved (e.g. QQuickMouseArea:: +containsMouse). The bogus event coordinates in the release event then +usually end up causing an item near the top-left of the QQuickWindow +to assume it is hovered (because drag pixmap windows tend to be small), +even when the mouse cursor is actually far away from it at the end of +the drag. + +This shows up e.g. in the Plasma 5 desktop, where dragging an icon +on the desktop will cause the icon at the top-left of the screen (if +any) to switch to hovered state, as the release coordinates on the +drag pixmap window (showing a dragged icon) fall into the geometry +of the top-left icon. + +QSimpleDrag contains a topLevelAt() function to find the top-level +window under the global cursor coordinates that is not the drag +pixmap window. This is used by the drop event delivery code. + +This patch uses this function to find the relevant top-level window, +then asks it to map the global cusor coordinates to its local +coordinate system, then synthesizes a new QMouseEvent with local +coordinates computed in this fashion. As a result the window now +gets a release event with coordinates that make sense and are +correct. + +Task-number: QTBUG-66103 +Change-Id: I04ebe6ccd4a991fdd4b540ff0227973ea8896a9d +Reviewed-by: Eike Hein <hein@kde.org> +Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io> +--- + src/gui/kernel/qsimpledrag.cpp | 32 +++++++++++++++++++++++++++----- + src/gui/kernel/qsimpledrag_p.h | 6 +++--- + 2 files changed, 30 insertions(+), 8 deletions(-) + +diff --git a/src/gui/kernel/qsimpledrag.cpp b/src/gui/kernel/qsimpledrag.cpp +index a1e25dc53c..87d3ba5915 100644 +--- a/src/gui/kernel/qsimpledrag.cpp ++++ b/src/gui/kernel/qsimpledrag.cpp +@@ -58,6 +58,7 @@ + + #include <QtCore/QEventLoop> + #include <QtCore/QDebug> ++#include <QtCore/QLoggingCategory> + + #include <private/qguiapplication_p.h> + #include <private/qdnd_p.h> +@@ -69,6 +70,8 @@ QT_BEGIN_NAMESPACE + + #ifndef QT_NO_DRAGANDDROP + ++Q_LOGGING_CATEGORY(lcDnd, "qt.gui.dnd") ++ + static QWindow* topLevelAt(const QPoint &pos) + { + QWindowList list = QGuiApplication::topLevelWindows(); +@@ -94,10 +97,10 @@ static QWindow* topLevelAt(const QPoint &pos) + */ + + QBasicDrag::QBasicDrag() : +- m_restoreCursor(false), m_eventLoop(0), ++ m_current_window(nullptr), m_restoreCursor(false), m_eventLoop(nullptr), + m_executed_drop_action(Qt::IgnoreAction), m_can_drop(false), +- m_drag(0), m_drag_icon_window(0), m_useCompositing(true), +- m_screen(Q_NULLPTR) ++ m_drag(nullptr), m_drag_icon_window(nullptr), m_useCompositing(true), ++ m_screen(nullptr) + { + } + +@@ -161,6 +164,7 @@ bool QBasicDrag::eventFilter(QObject *o, QEvent *e) + return true; // Eat all mouse move events + } + case QEvent::MouseButtonRelease: ++ { + disableEventFilter(); + if (canDrop()) { + QPoint nativePosition = getNativeMousePos(e, m_drag_icon_window); +@@ -169,8 +173,25 @@ bool QBasicDrag::eventFilter(QObject *o, QEvent *e) + cancel(); + } + exitDndEventLoop(); +- QCoreApplication::postEvent(o, new QMouseEvent(*static_cast<QMouseEvent *>(e))); ++ ++ // If a QShapedPixmapWindow (drag feedback) is being dragged along, the ++ // mouse event's localPos() will be relative to that, which is useless. ++ // We want a position relative to the window where the drag ends, if possible (?). ++ // If there is no such window (belonging to this Qt application), ++ // make the event relative to the window where the drag started. (QTBUG-66103) ++ const QMouseEvent *release = static_cast<QMouseEvent *>(e); ++ const QWindow *releaseWindow = topLevelAt(release->globalPos()); ++ qCDebug(lcDnd) << "mouse released over" << releaseWindow << "after drag from" << m_current_window << "globalPos" << release->globalPos(); ++ if (!releaseWindow) ++ releaseWindow = m_current_window; ++ QPoint releaseWindowPos = (releaseWindow ? releaseWindow->mapFromGlobal(release->globalPos()) : release->globalPos()); ++ QMouseEvent *newRelease = new QMouseEvent(release->type(), ++ releaseWindowPos, releaseWindowPos, release->screenPos(), ++ release->button(), release->buttons(), ++ release->modifiers(), release->source()); ++ QCoreApplication::postEvent(o, newRelease); + return true; // defer mouse release events until drag event loop has returned ++ } + case QEvent::MouseButtonDblClick: + case QEvent::Wheel: + return true; +@@ -349,7 +370,7 @@ static inline QPoint fromNativeGlobalPixels(const QPoint &point) + into account. + */ + +-QSimpleDrag::QSimpleDrag() : m_current_window(0) ++QSimpleDrag::QSimpleDrag() + { + } + +@@ -373,6 +394,7 @@ void QSimpleDrag::startDrag() + updateCursor(Qt::IgnoreAction); + } + setExecutedDropAction(Qt::IgnoreAction); ++ qCDebug(lcDnd) << "drag began from" << m_current_window<< "cursor pos" << QCursor::pos() << "can drop?" << canDrop(); + } + + void QSimpleDrag::cancel() +diff --git a/src/gui/kernel/qsimpledrag_p.h b/src/gui/kernel/qsimpledrag_p.h +index 0b8a0bc703..bbd7f7f4bb 100644 +--- a/src/gui/kernel/qsimpledrag_p.h ++++ b/src/gui/kernel/qsimpledrag_p.h +@@ -105,6 +105,9 @@ protected: + + QDrag *drag() const { return m_drag; } + ++protected: ++ QWindow *m_current_window; ++ + private: + void enableEventFilter(); + void disableEventFilter(); +@@ -132,9 +135,6 @@ protected: + virtual void cancel() Q_DECL_OVERRIDE; + virtual void move(const QPoint &globalPos) Q_DECL_OVERRIDE; + virtual void drop(const QPoint &globalPos) Q_DECL_OVERRIDE; +- +-private: +- QWindow *m_current_window; + }; + + #endif // QT_NO_DRAGANDDROP +-- +cgit v1.1-6-g87c4 + + diff --git a/source/l/qt5/patches/qt5.qtbug-69310.patch b/source/l/qt5/patches/qt5.qtbug-69310.patch new file mode 100644 index 000000000..b92462733 --- /dev/null +++ b/source/l/qt5/patches/qt5.qtbug-69310.patch @@ -0,0 +1,37 @@ +From fcba9fa861574f33e1d2e54d8c8d6da8062927cd Mon Sep 17 00:00:00 2001 +From: Allan Sandfeld Jensen <allan.jensen@qt.io> +Date: Wed, 23 Jan 2019 10:42:12 +0100 +Subject: Fix regression in QPlainTextEdit updating + +It was incorrectly counting a block having more than one line as having +changed visibility. + +Fixes: QTBUG-69310 +Change-Id: I502cda1d3e8a4efb1c14122353cc0a4731d8581c +Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io> +--- + src/widgets/widgets/qplaintextedit.cpp | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/src/widgets/widgets/qplaintextedit.cpp b/src/widgets/widgets/qplaintextedit.cpp +index d6f6a364a8..57f2dec8f7 100644 +--- a/src/widgets/widgets/qplaintextedit.cpp ++++ b/src/widgets/widgets/qplaintextedit.cpp +@@ -312,10 +312,11 @@ void QPlainTextDocumentLayout::documentChanged(int from, int charsRemoved, int c + QTextBlock block = changeStartBlock; + do { + block.clearLayout(); +- const int lineCount = block.isVisible() ? 1 : 0; +- if (block.lineCount() != lineCount) { ++ if (block.isVisible() ++ ? (block.lineCount() == 0) ++ : (block.lineCount() > 0)) { + blockVisibilityChanged = true; +- block.setLineCount(lineCount); ++ block.setLineCount(block.isVisible() ? 1 : 0); + } + if (block == changeEndBlock) + break; +-- +cgit v1.2.1 + diff --git a/source/l/qt5/patches/qt5.qtbug-76255.patch b/source/l/qt5/patches/qt5.qtbug-76255.patch new file mode 100644 index 000000000..678913ce5 --- /dev/null +++ b/source/l/qt5/patches/qt5.qtbug-76255.patch @@ -0,0 +1,35 @@ +From cc32a691936f37eaaec618a71edd62f896009c9d Mon Sep 17 00:00:00 2001 +From: Joerg Bornemann <joerg.bornemann@qt.io> +Date: Fri, 06 Sep 2019 10:54:44 +0200 +Subject: [PATCH] Fix CMake config files for -libdir different from "lib" + +When Qt was configured with -libdir different from "lib", one could not +build with CMake whenever a static lib was pulled in (e.g. uitools). + +Do not hard-code "/lib" but use the correct variable also for static +libraries. + +Fixes: QTBUG-76255 +Change-Id: I28c6861752e29e461247628d2b1f8a9ec32f0790 +Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io> +Reviewed-by: Fabian Vogt <fabian@ritter-vogt.de> +--- + +diff --git a/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in b/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in +index d4fd057..f4a34d6 100644 +--- a/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in ++++ b/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in +@@ -53,7 +53,11 @@ + set(_lib_deps) + set(_link_flags) + +- get_filename_component(_qt5_install_libs \"${_qt5$${CMAKE_MODULE_NAME}_install_prefix}/lib\" ABSOLUTE) ++!!IF isEmpty(CMAKE_LIB_DIR_IS_ABSOLUTE) ++ set(_qt5_install_libs \"${_qt5$${CMAKE_MODULE_NAME}_install_prefix}/$${CMAKE_LIB_DIR}\") ++!!ELSE ++ set(_qt5_install_libs \"$${CMAKE_LIB_DIR}\") ++!!ENDIF + + if(EXISTS \"${prl_file_location}\") + file(STRINGS \"${prl_file_location}\" _prl_strings REGEX \"QMAKE_PRL_LIBS_FOR_CMAKE[ \\t]*=\") + diff --git a/source/l/qt5/patches/qt5.qtbug-77037.patch b/source/l/qt5/patches/qt5.qtbug-77037.patch new file mode 100644 index 000000000..4dac59a9a --- /dev/null +++ b/source/l/qt5/patches/qt5.qtbug-77037.patch @@ -0,0 +1,89 @@ +From 0b57f15958f07ef12c8944d6db7a33a6fe9d9c59 Mon Sep 17 00:00:00 2001 +From: Allan Sandfeld Jensen <allan.jensen@qt.io> +Date: Mon, 23 Sep 2019 13:49:53 +0200 +Subject: Fix building with pulseaudio 13 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The function signature changed though the ABI stayed the same. + +Change-Id: I86ca361b5e4f0c523e1031910df438c23beee876 +Fixes: QTBUG-77037 +Reviewed-by: Jüri Valdmann <juri.valdmann@qt.io> +--- + chromium/media/audio/pulse/pulse.sigs | 16 ++++++++-------- + chromium/media/audio/pulse/pulse_stub_header.fragment | 11 +++++++++++ + 2 files changed, 19 insertions(+), 8 deletions(-) + +diff --git a/chromium/media/audio/pulse/pulse.sigs b/chromium/media/audio/pulse/pulse.sigs +index 8b5888786a9..daaeb149c13 100644 +--- a/chromium/media/audio/pulse/pulse.sigs ++++ b/chromium/media/audio/pulse/pulse.sigs +@@ -24,11 +24,11 @@ pa_operation* pa_context_get_source_info_by_index(pa_context* c, uint32_t idx, p + pa_operation* pa_context_get_source_info_by_name(pa_context* c, const char* name, pa_source_info_cb_t cb, void *userdata); + pa_operation* pa_context_get_source_info_list(pa_context* c, pa_source_info_cb_t cb, void* userdata); + pa_operation* pa_context_get_sink_info_list(pa_context* c, pa_sink_info_cb_t cb, void* userdata); +-pa_context_state_t pa_context_get_state(pa_context* c); ++pa_context_state_t pa_context_get_state(const_pa_context_ptr c); + pa_context* pa_context_new(pa_mainloop_api* mainloop, const char* name); + pa_operation* pa_context_set_source_volume_by_index(pa_context* c, uint32_t idx, const pa_cvolume* volume, pa_context_success_cb_t cb, void* userdata); + void pa_context_set_state_callback(pa_context* c, pa_context_notify_cb_t cb, void* userdata); +-pa_operation_state_t pa_operation_get_state(pa_operation* o); ++pa_operation_state_t pa_operation_get_state(const_pa_operation_ptr o); + void pa_context_unref(pa_context* c); + void pa_operation_unref(pa_operation* o); + int pa_stream_begin_write(pa_stream* p, void** data, size_t* nbytes); +@@ -38,23 +38,23 @@ pa_operation* pa_stream_cork(pa_stream* s, int b, pa_stream_success_cb_t cb, voi + int pa_stream_disconnect(pa_stream* s); + int pa_stream_drop(pa_stream *p); + pa_operation* pa_stream_flush(pa_stream* s, pa_stream_success_cb_t cb, void* userdata); +-uint32_t pa_stream_get_device_index(pa_stream* s); ++uint32_t pa_stream_get_device_index(const_pa_stream_ptr s); + int pa_stream_get_latency(pa_stream* s, pa_usec_t* r_usec, int* negative); +-pa_stream_state_t pa_stream_get_state(pa_stream* p); ++pa_stream_state_t pa_stream_get_state(const_pa_stream_ptr p); + pa_stream* pa_stream_new(pa_context* c, const char* name, const pa_sample_spec* ss, const pa_channel_map * map); + pa_stream* pa_stream_new_with_proplist(pa_context* c, const char* name, const pa_sample_spec* ss, const pa_channel_map* map, pa_proplist* p); + pa_proplist* pa_proplist_new(void); +-int pa_proplist_contains(pa_proplist* p, const char* key); ++int pa_proplist_contains(const_pa_proplist_ptr p, const char* key); + void pa_proplist_free(pa_proplist* p); +-const char* pa_proplist_gets(pa_proplist* p, const char* key); ++const char* pa_proplist_gets(const_pa_proplist_ptr p, const char* key); + int pa_proplist_sets(pa_proplist* p, const char* key, const char* value); +-size_t pa_stream_readable_size(pa_stream *p); ++size_t pa_stream_readable_size(const_pa_stream_ptr p); + int pa_stream_peek(pa_stream* p, const void** data, size_t* nbytes); + void pa_stream_set_read_callback(pa_stream* p, pa_stream_request_cb_t cb, void* userdata); + void pa_stream_set_state_callback(pa_stream* s, pa_stream_notify_cb_t cb, void* userdata); + int pa_stream_write(pa_stream* p, const void* data, size_t nbytes, pa_free_cb_t free_cb, int64_t offset, pa_seek_mode_t seek); + void pa_stream_set_write_callback(pa_stream *p, pa_stream_request_cb_t cb, void *userdata); + void pa_stream_unref(pa_stream* s); +-int pa_context_errno(pa_context *c); ++int pa_context_errno(const_pa_context_ptr c); + const char* pa_strerror(int error); + pa_cvolume* pa_cvolume_set(pa_cvolume* a, unsigned channels, pa_volume_t v); +diff --git a/chromium/media/audio/pulse/pulse_stub_header.fragment b/chromium/media/audio/pulse/pulse_stub_header.fragment +index 2a2d3e7552b..cdaa841b29f 100644 +--- a/chromium/media/audio/pulse/pulse_stub_header.fragment ++++ b/chromium/media/audio/pulse/pulse_stub_header.fragment +@@ -5,4 +5,15 @@ extern "C" { + + #include <pulse/pulseaudio.h> + ++#if PA_MAJOR > 12 ++typedef const pa_context* const_pa_context_ptr; ++typedef const pa_operation* const_pa_operation_ptr; ++typedef const pa_proplist* const_pa_proplist_ptr; ++typedef const pa_stream* const_pa_stream_ptr; ++#else ++typedef pa_context* const_pa_context_ptr; ++typedef pa_operation* const_pa_operation_ptr; ++typedef pa_proplist* const_pa_proplist_ptr; ++typedef pa_stream* const_pa_stream_ptr; ++#endif + } +-- +cgit v1.2.1 + diff --git a/source/l/qt5/patches/qt5.qtbug-77364.patch b/source/l/qt5/patches/qt5.qtbug-77364.patch new file mode 100644 index 000000000..088856c76 --- /dev/null +++ b/source/l/qt5/patches/qt5.qtbug-77364.patch @@ -0,0 +1,13 @@ +diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp +index 04290a4ce1..27773d5762 100644 +--- a/src/widgets/kernel/qwidget.cpp ++++ b/src/widgets/kernel/qwidget.cpp +@@ -6446,7 +6446,7 @@ void QWidget::setFocusProxy(QWidget * w) + + if (changingAppFocusWidget) { + QWidget *newDeepestFocusProxy = d_func()->deepestFocusProxy(); +- QApplicationPrivate::focus_widget = newDeepestFocusProxy ? newDeepestFocusProxy : this; ++ QApplicationPrivate::setFocusWidget(newDeepestFocusProxy ? newDeepestFocusProxy : this, Qt::NoFocusReason); + } + } + diff --git a/source/l/qt5/patches/qt5.webengine_gcc8.patch b/source/l/qt5/patches/qt5.webengine_gcc8.patch new file mode 100644 index 000000000..cf276bc73 --- /dev/null +++ b/source/l/qt5/patches/qt5.webengine_gcc8.patch @@ -0,0 +1,26 @@ +# Prevent these errors caused by using GCC8 +# (original patch taken from Fedora's chromium SRPM): +# +# make: *** [Makefile:1028: module-qtwebengine-make_first] Error 2 +# FAILED: obj/mojo/public/c/system/system/thunks.o +# ../../3rdparty/chromium/mojo/public/c/system/buffer.h:38:42: error: static assertion failed: int64_t has weird alignment +# ../../3rdparty/chromium/mojo/public/c/system/data_pipe.h:49:42: error: static assertion failed: int64_t has weird alignment +# ../../3rdparty/chromium/mojo/public/c/system/message_pipe.h:47:42: error: static assertion failed: int64_t has weird alignment +# +--- a/src/3rdparty/chromium/mojo/public/c/system/macros.h 2018-05-15 14:58:46.448912634 -0400 ++++ b/src/3rdparty/chromium/mojo/public/c/system/macros.h 2018-05-15 14:58:52.041784613 -0400 +@@ -18,7 +18,13 @@ + #endif + + // Like the C++11 |alignof| operator. +-#if __cplusplus >= 201103L ++#if defined(__GNUC__) && __GNUC__ >= 8 ++// GCC 8 has changed the alignof operator to return the minimal alignment ++// required by the target ABI, instead of the preferred alignment. ++// This means that on 32-bit x86, it will return 4 instead of 8. ++// Use __alignof__ instead to avoid this. ++#define MOJO_ALIGNOF(type) __alignof__(type) ++#elif __cplusplus >= 201103L + #define MOJO_ALIGNOF(type) alignof(type) + #elif defined(__GNUC__) + #define MOJO_ALIGNOF(type) __alignof__(type) diff --git a/source/l/qt5/patches/qt5.whandle.patch b/source/l/qt5/patches/qt5.whandle.patch new file mode 100644 index 000000000..4428974d0 --- /dev/null +++ b/source/l/qt5/patches/qt5.whandle.patch @@ -0,0 +1,24 @@ +From: Ulf Hermann <ulf.hermann@theqtcompany.com> +Date: Tue, 27 Oct 2015 14:25:42 +0000 (+0100) +Subject: WIP: Also do hide/show via WA_OutsideWSRange for native widgets +X-Git-Url: https://codereview.qt-project.org/gitweb?p=qt%2Fqtbase.git;a=commitdiff_plain;h=5ea44d1d516f0c68a6793279df5c1569ef9fadd2 + +WIP: Also do hide/show via WA_OutsideWSRange for native widgets + +Task-number: QTBUG-48321 +Change-Id: I78ef29975181ee22429c9bd4b11d96d9e68b7a9c +--- + +diff --git a/qtbase/src/widgets/kernel/qwidget.cpp b/qtbase/src/widgets/kernel/qwidget.cpp +index a006246..024005d 100644 +--- a/qtbase/src/widgets/kernel/qwidget.cpp ++++ b/qtbase/src/widgets/kernel/qwidget.cpp +@@ -7169,7 +7169,7 @@ void QWidgetPrivate::setGeometry_sys(int x, int y, int w, int h, bool isMove) + + bool needsShow = false; + +- if (q->isWindow()) { ++ if (q->isWindow() || q->windowHandle()) { + if (!(data.window_state & Qt::WindowFullScreen) && (w == 0 || h == 0)) { + q->setAttribute(Qt::WA_OutsideWSRange, true); + if (q->isVisible() && q->testAttribute(Qt::WA_Mapped)) diff --git a/source/l/qt5/patches/qtbase-qxcbwindow.patch b/source/l/qt5/patches/qtbase-qxcbwindow.patch new file mode 100644 index 000000000..62a0bb44d --- /dev/null +++ b/source/l/qt5/patches/qtbase-qxcbwindow.patch @@ -0,0 +1,97 @@ +Taken from: https://code.qt.io/cgit/qt/qtbase.git/patch/?id=0c183117 + +From 0c1831178540462da31fd7a4b6d2e446bc84498b Mon Sep 17 00:00:00 2001 +From: Erik Kurzinger <ekurzinger@nvidia.com> +Date: Thu, 13 Jun 2019 08:15:50 -0700 +Subject: Track swap interval in QXcbWindow + +As per GLX_EXT_swap_control, the GLX swap interval is specified on a +per-drawable basis. However, QGLXContext only tracks it per-context +using the m_swapInterval member. If a new drawable is made current to a +context, it is still necessary to call glXSwapIntervalEXT to change the +swap interval, even if it has been previously called for the same +context with a different drawable. However, currently, +QGLXContext::makeCurrent doesn't do this if its m_swapInterval field +matches the new swap interval. This change removes m_swapInterval from +QGLXContext, instead tracking it in QXcbWindow. This still avoids +unnecessary calls to glXSwapIntervalEXT, while ensuring the swap +interval is always set for new window drawables. + +Change-Id: Idc34101476c6af618059f6f3d8925dee743994a3 +Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> +Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io> +--- + .../platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp | 6 +++--- + src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.h | 1 - + src/plugins/platforms/xcb/qxcbwindow.h | 4 ++++ + 3 files changed, 7 insertions(+), 4 deletions(-) + +diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp +index 4adf662152..f26f698e76 100644 +--- a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp ++++ b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp +@@ -204,7 +204,6 @@ QGLXContext::QGLXContext(QXcbScreen *screen, const QSurfaceFormat &format, QPlat + , m_shareContext(0) + , m_format(format) + , m_isPBufferCurrent(false) +- , m_swapInterval(-1) + , m_ownsContext(nativeHandle.isNull()) + , m_getGraphicsResetStatus(0) + , m_lost(false) +@@ -567,9 +566,9 @@ bool QGLXContext::makeCurrent(QPlatformSurface *surface) + + if (success && surfaceClass == QSurface::Window) { + int interval = surface->format().swapInterval(); ++ QXcbWindow *window = static_cast<QXcbWindow *>(surface); + QXcbScreen *screen = screenForPlatformSurface(surface); +- if (interval >= 0 && m_swapInterval != interval && screen) { +- m_swapInterval = interval; ++ if (interval >= 0 && interval != window->swapInterval() && screen) { + typedef void (*qt_glXSwapIntervalEXT)(Display *, GLXDrawable, int); + typedef void (*qt_glXSwapIntervalMESA)(unsigned int); + static qt_glXSwapIntervalEXT glXSwapIntervalEXT = 0; +@@ -588,6 +587,7 @@ bool QGLXContext::makeCurrent(QPlatformSurface *surface) + glXSwapIntervalEXT(m_display, glxDrawable, interval); + else if (glXSwapIntervalMESA) + glXSwapIntervalMESA(interval); ++ window->setSwapInterval(interval); + } + } + +diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.h b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.h +index be9d3f5dcb..2a88fd6e59 100644 +--- a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.h ++++ b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.h +@@ -87,7 +87,6 @@ private: + GLXContext m_shareContext; + QSurfaceFormat m_format; + bool m_isPBufferCurrent; +- int m_swapInterval; + bool m_ownsContext; + GLenum (APIENTRY * m_getGraphicsResetStatus)(); + bool m_lost; +diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h +index f98cd8a74d..8258cc2dfa 100644 +--- a/src/plugins/platforms/xcb/qxcbwindow.h ++++ b/src/plugins/platforms/xcb/qxcbwindow.h +@@ -184,6 +184,9 @@ public: + static void setWindowTitle(const QXcbConnection *conn, xcb_window_t window, const QString &title); + static QString windowTitle(const QXcbConnection *conn, xcb_window_t window); + ++ int swapInterval() const { return m_swapInterval; } ++ void setSwapInterval(int swapInterval) { m_swapInterval = swapInterval; } ++ + public Q_SLOTS: + void updateSyncRequestCounter(); + +@@ -276,6 +279,7 @@ protected: + SyncState m_syncState = NoSyncNeeded; + + QXcbSyncWindowRequest *m_pendingSyncRequest = nullptr; ++ int m_swapInterval = -1; + }; + + class QXcbForeignWindow : public QXcbWindow +-- +cgit v1.2.1 + diff --git a/source/l/qt5/patches/qtbase-zlib-compression.patch b/source/l/qt5/patches/qtbase-zlib-compression.patch new file mode 100644 index 000000000..a6896a4d9 --- /dev/null +++ b/source/l/qt5/patches/qtbase-zlib-compression.patch @@ -0,0 +1,41 @@ +Taken from: https://code.qt.io/cgit/qt/qtbase.git/patch/?id=cbdc9a77 + +From cbdc9a7786278c31fdb6eb465f32d0374349c1ef Mon Sep 17 00:00:00 2001 +From: Thiago Macieira <thiago.macieira@intel.com> +Date: Thu, 20 Jun 2019 09:36:46 -0700 +Subject: RCC: Change the default compression to Zlib + +Codebases using QResource::isCompressed() and assuming it is Zlib break +if zstd is enabled. So change the default back to Zlib until Qt 6.0. + +[ChangeLog][Important Behavior Changes] RCC's default compression +algorithm was changed back to Zlib, as it was in all previous releases +until 5.13.0. The default will remain Zlib for all Qt 5.x releases but +will change in Qt 6.0. To activate Zstd compression for your resources, +either pass the --compress-algo=zstd option to the rcc tool or add the +XML attribute compression-algorithm="zstd" to the <file> tags in the +.qrc file. + +Task-number: QTBUG-76521 +Change-Id: Ief874765cd7b43798de3fffd15a9f56fd9ad1ad4 +Reviewed-by: Simon Hausmann <simon.hausmann@qt.io> +--- + src/tools/rcc/rcc.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/tools/rcc/rcc.cpp b/src/tools/rcc/rcc.cpp +index 862e574f2d..011a7db810 100644 +--- a/src/tools/rcc/rcc.cpp ++++ b/src/tools/rcc/rcc.cpp +@@ -58,7 +58,7 @@ enum { + CONSTANT_COMPRESSTHRESHOLD_DEFAULT = 70 + }; + +-#if QT_CONFIG(zstd) ++#if QT_CONFIG(zstd) && QT_VERSION >= QT_VERSION_CHECK(6,0,0) + # define CONSTANT_COMPRESSALGO_DEFAULT RCCResourceLibrary::CompressionAlgorithm::Zstd + #elif !defined(QT_NO_COMPRESS) + # define CONSTANT_COMPRESSALGO_DEFAULT RCCResourceLibrary::CompressionAlgorithm::Zlib +-- +cgit v1.2.1 + diff --git a/source/l/qt5/profile.d/qt5.csh b/source/l/qt5/profile.d/qt5.csh new file mode 100644 index 000000000..ec1ecd9be --- /dev/null +++ b/source/l/qt5/profile.d/qt5.csh @@ -0,0 +1,17 @@ +#!/bin/csh +# Environment path variables for the Qt package: +if ( ! $?QT5DIR ) then + # It's best to use the generic directory to avoid + # compiling in a version-containing path: + if ( -d /usr/lib@LIBDIRSUFFIX@/qt5 ) then + setenv QT5DIR /usr/lib@LIBDIRSUFFIX@/qt5 + else + # Find the newest Qt directory and set $QT5DIR to that: + foreach qtd ( /usr/lib@LIBDIRSUFFIX@/qt5-* ) + if ( -d $qtd ) then + setenv QT5DIR $qtd + endif + end + endif +endif +set path = ( $path $QT5DIR/bin ) diff --git a/source/l/qt5/profile.d/qt5.sh b/source/l/qt5/profile.d/qt5.sh new file mode 100644 index 000000000..8ee075e17 --- /dev/null +++ b/source/l/qt5/profile.d/qt5.sh @@ -0,0 +1,17 @@ +#!/bin/sh +# Environment variables for the Qt package. +# +# It's best to use the generic directory to avoid +# compiling in a version-containing path: +if [ -d /usr/lib@LIBDIRSUFFIX@/qt5 ]; then + QT5DIR=/usr/lib@LIBDIRSUFFIX@/qt5 +else + # Find the newest Qt directory and set $QT5DIR to that: + for qtd in /usr/lib@LIBDIRSUFFIX@/qt5-* ; do + if [ -d $qtd ]; then + QT5DIR=$qtd + fi + done +fi +PATH="$PATH:$QT5DIR/bin" +export QT5DIR diff --git a/source/l/qt5/qt5.SlackBuild b/source/l/qt5/qt5.SlackBuild new file mode 100755 index 000000000..9ffabd277 --- /dev/null +++ b/source/l/qt5/qt5.SlackBuild @@ -0,0 +1,341 @@ +#!/bin/sh + +# Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Patrick J. Volkerding, Sebeka, MN, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Merged some ideas from Alex Sarmardzic's script for qt4 at SlackBuilds.org +# ^^ Modified by Robby Workman <rworkman@slackware.com> for QT4 & KDE4 +# +# Modifications 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Eric Hameleers, Eindhoven, NL +# Modifications for qt 5.2.0 2013 by Michael James, AU +# Modifications for qt 5.x by Eric Hameleers, Eindhoven, NL + +cd $(dirname $0) ; CWD=$(pwd) + +PKGNAM=qt5 +VERSION=$(ls qt-*.tar.?z | rev | cut -f 3- -d . | cut -f 1 -d - | rev) +BUILD=${BUILD:-1} +PKGSRC=$(echo $VERSION | cut -d - -f 1) +PKGVER=$(echo $VERSION | tr - _) + +# Automatically determine the architecture we're building on: +if [ -z "$ARCH" ]; then + case "$(uname -m)" in + i?86) ARCH=i586 ;; + arm*) readelf /usr/bin/file -A | egrep -q "Tag_CPU.*[4,5]" && ARCH=arm || ARCH=armv7hl ;; + # Unless $ARCH is already set, use uname -m for all other archs: + *) ARCH=$(uname -m) ;; + esac + export ARCH +fi + +# If the variable PRINT_PACKAGE_NAME is set, then this script will report what +# the name of the created package would be, and then exit. This information +# could be useful to other scripts. +if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then + echo "$PKGNAM-${PKGVER}-${ARCH}-${BUILD}.txz" + exit 0 +fi + +if [ "$ARCH" = "i486" ]; then + SLKCFLAGS="-O2 -march=i486 -mtune=i686" + SLKLDFLAGS="" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "i586" ]; then + SLKCFLAGS="-O2 -march=i586 -mtune=i686" + SLKLDFLAGS="" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "s390" ]; then + SLKCFLAGS="-O2" + SLKLDFLAGS="" + LIBDIRSUFFIX="" +elif [ "$ARCH" = "x86_64" ]; then + SLKCFLAGS="-O2 -fPIC" + SLKLDFLAGS="" + SLKLDFLAGS="-L/usr/lib64" + LIBDIRSUFFIX="64" +elif [ "$ARCH" = "armv7hl" ]; then + # To prevent "qatomic_armv6.h error: output number 2 not directly addressable" + # More permanent solution is to patch gcc: + # http://bazaar.launchpad.net/~linaro-toolchain-dev/gcc-linaro/4.6/revision/106731 + SLKCFLAGS="-O2 -march=armv7-a -mfpu=vfpv3-d16 -fno-strict-volatile-bitfields" + SLKLDFLAGS="" + LIBDIRSUFFIX="" +else + SLKCFLAGS="-O2" + SLKLDFLAGS="" + LIBDIRSUFFIX="" +fi + +case "$ARCH" in + arm*) TARGET=$ARCH-slackware-linux-gnueabi ;; + *) TARGET=$ARCH-slackware-linux ;; +esac + +NUMJOBS=${NUMJOBS:-" -j$(expr $(nproc) + 1) "} + +TMP=${TMP:-/tmp} +PKG=$TMP/package-${PKGNAM} + +rm -rf $PKG +mkdir -p $TMP $PKG +cd $TMP +rm -rf qt-everywhere-src-$VERSION +echo "Extracting qt-everywhere-src-$VERSION.tar.xz" +tar xf $CWD/qt-everywhere-src-$VERSION.tar.xz || exit 1 +cd qt-everywhere-src-$PKGSRC || exit 1 + +chown -R root:root . +find . \ + \( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ + -exec chmod 755 {} \+ -o \ + \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ + -exec chmod 644 {} \+ + +# Use -reduce-relocations only on i?86 and x86_64 architextures. +# https://bugreports.qt-project.org/browse/QTBUG-36129 +if echo $ARCH | grep -q '\(i.86\|x86_64\)' 2>/dev/null; then + RELOCATIONS="-reduce-relocations" +else + RELOCATIONS="" +fi + +# Fix path to mysql header: +cat $CWD/patches/qt5.mysql.h.diff | patch -p1 --verbose || exit 1 + +# CMake generates wrong -isystem /usr/include compilations flags with Qt5::Gui +# and for it breaks KWin compilation with: +# /usr/include/c++/9.1.0/cstdlib:75:15: fatal error: stdlib.h: No such file or directory +# See also https://bugzilla.redhat.com/1704474 +cd qtbase + cat $CWD/patches/qt5.qtbase_cmake_isystem_includes.patch \ + | patch -p1 --verbose || exit 1 +cd - 1>/dev/null + +# CVE-2020-0569 (fixed in 5.14.0): +cd qtbase + cat $CWD/patches/qt5.cve-2020-0569.patch \ + | patch -p1 --verbose || exit 1 +cd - 1>/dev/null + +# CVE-2020-0570 (fixed in 5.14.1): +cd qtbase + cat $CWD/patches/qt5.cve-2020-0570.patch \ + | patch -p1 --verbose || exit 1 +cd - 1>/dev/null + +if ! pkg-config --exists libpulse 2>/dev/null ; then + # Forcibly disable pulseaudio in qtwebengine: + cat $CWD/patches/qt5.pulseaudio.diff | patch -p1 --verbose || exit 1 + # Disable pulseaudio in Qt5: + PACONF="-no-pulseaudio" +else + PACONF=" " +fi + +# Use our custom compiler and linker flags: +sed -e "s|^\(QMAKE_CFLAGS_RELEASE.*\)|\1 ${SLKCFLAGS}|" \ + -i qtbase/mkspecs/common/gcc-base.conf || exit 1 +sed -e "s|^\(QMAKE_LFLAGS_RELEASE.*\)|\1 ${SLKLDFLAGS}|" \ + -i qtbase/mkspecs/common/g++-unix.conf || exit 1 + +export CFLAGS="$SLKCFLAGS" +export CXXFLAGS="$SLKCFLAGS" +export OPENSOURCE_CXXFLAGS="$SLKCFLAGS" +export QTDIR="${TMP}/qt-everywhere-src-${PKGSRC}" +export LD_LIBRARY_PATH="${QTDIR}/qtbase/lib:${QTDIR}/qttools/lib:${LD_LIBRARY_PATH}" +export QT_PLUGIN_PATH="${QTDIR}/qtbase/plugins" +./configure -v \ + -confirm-license \ + -opensource \ + -prefix /usr \ + -libdir /usr/lib${LIBDIRSUFFIX} \ + -bindir /usr/lib${LIBDIRSUFFIX}/qt5/bin \ + -sysconfdir /etc/xdg \ + -headerdir /usr/include/qt5 \ + -datadir /usr/share/qt5 \ + -archdatadir /usr/lib${LIBDIRSUFFIX}/qt5 \ + -docdir /usr/doc/qt5-$PKGVER \ + -examplesdir /usr/doc/qt5-$PKGVER/examples \ + -proprietary-codecs \ + -system-libpng \ + -system-libjpeg \ + -system-sqlite \ + -system-zlib \ + -plugin-sql-mysql \ + -plugin-sql-sqlite \ + -accessibility \ + -alsa \ + -dbus \ + -glib \ + -icu \ + -opengl \ + -openssl-linked \ + -optimized-qmake \ + -qpa xcb \ + -qt-harfbuzz \ + -verbose \ + -xcb \ + -nomake examples \ + -nomake tests \ + -no-mimetype-database \ + -no-separate-debug-info \ + -no-strip \ + -no-use-gold-linker \ + -webengine-proprietary-codecs \ + ${PACONF} \ + ${RELOCATIONS} \ + -no-pch \ + # No-precompiled-headers is ccache-friendly. + +# Sometimes a failure happens when parallelizing make. Try again if make fails, +# but make a failure the second time around (single threaded) a fatal error: +make $NUMJOBS || make || exit 1 +make install INSTALL_ROOT=$PKG || exit 1 + +# Strip binaries the Slackware way: +find $PKG | xargs file | grep -e "executable" -e "shared object" | grep ELF \ + | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null + +# Remove rpaths: +for file in $(find . | xargs file | grep -e "executable" -e "shared object" | grep ELF | cut -f 1 -d : 2> /dev/null) ; do + if [ ! "$(patchelf --print-rpath $file 2> /dev/null)" = "" ]; then + patchelf --remove-rpath $file + fi +done + +# Don't ship .la files: +rm -f $PKG/usr/lib${LIBDIRSUFFIX}/*.la + +# Fix internal linking for Qt5WebEngineCore.pc , +# thanks to Larry Hajali's SBo script: +sed -i \ + -e 's|-Wl,--start-group.* -Wl,--end-group||' \ + -e "s|-L${PWD}/qtwebengine/src/core/api/Release||" \ + $PKG/usr/lib${LIBDIRSUFFIX}/pkgconfig/Qt5WebEngineCore.pc + +# Fix the path in prl files: +find "$PKG/usr/lib${LIBDIRSUFFIX}" -type f -name '*.prl' \ + -exec sed -i -e '/^QMAKE_PRL_BUILD_DIR/d;s/\(QMAKE_PRL_LIBS =\).*/\1/' {} \; + +# Fix the qmake path in pri file: +sed -i "s,${QTDIR}/qtbase,/usr/lib${LIBDIRSUFFIX}/qt5," \ + $PKG/usr/lib${LIBDIRSUFFIX}/qt5/mkspecs/modules/qt_lib_bootstrap_private.pri + +# Install symlinks to the Qt5 binaries in the $PATH: +mkdir -p $PKG/usr/bin +for FILE in $PKG/usr/lib${LIBDIRSUFFIX}/qt5/bin/* ; do + ln -s ../lib${LIBDIRSUFFIX}/qt5/bin/$(basename $FILE) $PKG/usr/bin/$(basename $FILE)-qt5 +done + +# Set the QT5DIR variable in the environment: +mkdir -p $PKG/etc/profile.d +sed -e "s,@LIBDIRSUFFIX@,${LIBDIRSUFFIX},g" $CWD/profile.d/$PKGNAM.sh \ + > $PKG/etc/profile.d/$PKGNAM.sh +sed -e "s,@LIBDIRSUFFIX@,${LIBDIRSUFFIX},g" $CWD/profile.d/$PKGNAM.csh \ + > $PKG/etc/profile.d/$PKGNAM.csh +chmod 0755 $PKG/etc/profile.d/* + +# Add menu entries for all those hidden but great Qt applications: +# Qt5 logo: +mkdir -p $PKG/usr/share/icons/hicolor/48x48/apps +convert qtdoc/doc/src/images/qt-logo.png -resize 48x48 $PKG/usr/share/icons/hicolor/48x48/apps/qt5-logo.png +# Assistant icons +install -p -m644 -D qttools/src/assistant/assistant/images/assistant.png $PKG/usr/share/icons/hicolor/32x32/apps/qt5-assistant.png +install -p -m644 -D qttools/src/assistant/assistant/images/assistant-128.png $PKG/usr/share/icons/hicolor/128x128/apps/qt5-assistant.png +# Designer icon +install -p -m644 -D qttools/src/designer/src/designer/images/designer.png $PKG/usr/share/icons/hicolor/128x128/apps/qt5-designer.png +# QDbusViewer icons +install -p -m644 qttools/src/qdbus/qdbusviewer/images/qdbusviewer.png $PKG/usr/share/icons/hicolor/32x32/apps/qt5-qdbusviewer.png +install -p -m644 qttools/src/qdbus/qdbusviewer/images/qdbusviewer-128.png $PKG/usr/share/icons/hicolor/128x128/apps/qt5-qdbusviewer.png +# Linguist icons +for icon in qttools/src/linguist/linguist/images/icons/linguist-*-32.png ; do + size=$(echo $(basename ${icon}) | cut -d- -f2) + install -p -m644 -D ${icon} $PKG/usr/share/icons/hicolor/${size}x${size}/apps/qt5-linguist.png +done + +# And the .desktop files too: +mkdir -p $PKG/usr/share/applications +cat <<EOF > $PKG/usr/share/applications/qt5-designer.desktop +[Desktop Entry] +Name=Qt5 Designer +GenericName=Interface Designer +Comment=Design GUIs for Qt5 applications +Exec=designer-qt5 +Icon=qt5-designer +MimeType=application/x-designer; +Terminal=false +Encoding=UTF-8 +Type=Application +Categories=Qt;Development; +EOF +cat <<EOF > $PKG/usr/share/applications/qt5-assistant.desktop +[Desktop Entry] +Name=Qt5 Assistant +Comment=Shows Qt5 documentation and examples +Exec=assistant-qt5 +Icon=qt5-assistant +Terminal=false +Encoding=UTF-8 +Type=Application +Categories=Qt;Development;Documentation; +EOF +cat <<EOF > $PKG/usr/share/applications/qt5-linguist.desktop +[Desktop Entry] +Name=Qt5 Linguist +Comment=Add translations to Qt5 applications +Exec=linguist-qt5 +Icon=qt5-linguist +MimeType=text/vnd.trolltech.linguist;application/x-linguist; +Terminal=false +Encoding=UTF-8 +Type=Application +Categories=Qt;Development; +EOF +cat <<EOF > $PKG/usr/share/applications/qt5-qdbusviewer.desktop +[Desktop Entry] +Name=Qt5 QDbusViewer +GenericName=Qt5 D-Bus Debugger +Comment=Debug D-Bus applications +Exec=qdbusviewer-qt5 +Icon=qt5-qdbusviewer +Terminal=false +Type=Application +Categories=Qt;Development;Debugger; +EOF + +# Add a documentation directory: +mkdir -p $PKG/usr/doc/$PKGNAM-$PKGVER +cp -a \ + README qtbase/{header*,LGPL_EXCEPTION.txt,LICENSE*} \ + $PKG/usr/doc/$PKGNAM-$PKGVER +if [ -d $PKG/usr/lib${LIBDIRSUFFIX}/qt5/doc/html ]; then + ( cd $PKG/usr/doc/$PKGNAM-$PKGVER + ln -sf /usr/lib${LIBDIRSUFFIX}/qt5/doc/html . + ) +fi + +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc +cat $CWD/doinst.sh > $PKG/install/doinst.sh + +cd $PKG +/sbin/makepkg -l y -c n $TMP/$PKGNAM-$PKGVER-$ARCH-$BUILD.txz + diff --git a/source/l/qt5/slack-desc b/source/l/qt5/slack-desc new file mode 100644 index 000000000..d9b246024 --- /dev/null +++ b/source/l/qt5/slack-desc @@ -0,0 +1,19 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' +# on the right side marks the last column you can put a character in. You must +# make exactly 11 lines for the formatting to be correct. It's also +# customary to leave one space after the ':'. + + |-----handy-ruler------------------------------------------------------| +qt5: qt5 (a multi-platform C++ graphical user interface toolkit) +qt5: +qt5: Qt is a complete and well-developed object-oriented framework for +qt5: developing graphical user interface (GUI) applications using C++. +qt5: +qt5: Homepage: http://www.qt.io/ +qt5: +qt5: +qt5: +qt5: +qt5: |