From 35b4c6d4df1281afd621374e686f19e654ad7bae Mon Sep 17 00:00:00 2001 From: "Martin T. H. Sandsmark" Date: Tue, 7 Apr 2020 17:14:59 +0200 Subject: [PATCH 1/2] Fix crashing on starting and quitting QCollator (especially with Qt 5.14 and ICU 65.1) is very unhappy with threads. To avoid having to lock and unlock the mutex everywhere (and ensure it is unlocked before calling other things that might lock it, etc.), we do it as locally as possible. Even if for some reason Qt and ICU make QCollator threadsafe in the future locking here should have minimal impact. BUG: 419585 Differential Revision: https://phabricator.kde.org/D28659 --- src/kitemviews/kfileitemmodel.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index 4b35a0248a..e4dca27348 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -33,6 +33,9 @@ #include #include #include +#include + +Q_GLOBAL_STATIC_WITH_ARGS(QMutex, s_collatorMutex, (QMutex::Recursive)) // #define KFILEITEMMODEL_DEBUG @@ -1878,6 +1881,8 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b, const int KFileItemModel::stringCompare(const QString& a, const QString& b, const QCollator& collator) const { + QMutexLocker collatorLock(s_collatorMutex()); + if (m_naturalSorting) { return collator.compare(a, b); } From 514d9c8fc9705f76fda8f22c70730fb9c383c95a Mon Sep 17 00:00:00 2001 From: Alexander Lohnau Date: Mon, 13 Apr 2020 15:29:50 +0200 Subject: [PATCH 2/2] Dolphin Services: Launch Deb/Rpm archives with QDesktopServices Summary: When you are inside the services store and you choose to install a deb/rpm package they open in the default application (mostlikely a package installer utility like discover). PS: I have written some ideas/questions, maybe you can comment on them :-) ? Test Plan: Tests still pass, try out what was described in the summary. A product which has a deb/rpm package is for example: `Jetbrains Dolphin Plugin` Reviewers: #dolphin, elvisangelaccio, ngraham, aspotashev Subscribers: kfm-devel Tags: #dolphin Differential Revision: https://phabricator.kde.org/D28795 --- .../services/servicemenuinstaller/CMakeLists.txt | 1 + .../servicemenuinstaller/servicemenuinstaller.cpp | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/settings/services/servicemenuinstaller/CMakeLists.txt b/src/settings/services/servicemenuinstaller/CMakeLists.txt index b5591cad70..9888999368 100644 --- a/src/settings/services/servicemenuinstaller/CMakeLists.txt +++ b/src/settings/services/servicemenuinstaller/CMakeLists.txt @@ -4,6 +4,7 @@ add_definitions(-DTRANSLATION_DOMAIN=\"dolphin_servicemenuinstaller\") add_executable(servicemenuinstaller servicemenuinstaller.cpp) target_link_libraries(servicemenuinstaller PRIVATE Qt5::Core + Qt5::Gui KF5::I18n ) install(TARGETS servicemenuinstaller ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}) diff --git a/src/settings/services/servicemenuinstaller/servicemenuinstaller.cpp b/src/settings/services/servicemenuinstaller/servicemenuinstaller.cpp index e3866a6ae0..73882e8c2f 100644 --- a/src/settings/services/servicemenuinstaller/servicemenuinstaller.cpp +++ b/src/settings/services/servicemenuinstaller/servicemenuinstaller.cpp @@ -25,6 +25,9 @@ #include #include #include +#include +#include +#include #include @@ -201,6 +204,10 @@ bool cmdInstall(const QString &archive, QString &errorText) return false; } } else { + const QStringList binaryPackages = {"application/vnd.debian.binary-package", "application/x-rpm"}; + if (binaryPackages.contains(QMimeDatabase().mimeTypeForFile(archive).name())) { + return QDesktopServices::openUrl(QUrl(archive)); + } const QString dir = generateDirPath(archive); if (QFile::exists(dir)) { if (!QDir(dir).removeRecursively()) { @@ -318,7 +325,7 @@ bool cmdUninstall(const QString &archive, QString &errorText) int main(int argc, char *argv[]) { - QCoreApplication app(argc, argv); + QGuiApplication app(argc, argv); QCommandLineParser parser; parser.addPositionalArgument(QStringLiteral("command"), i18nc("@info:shell", "Command to execute: install or uninstall."));