aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/src/CMakeLists.txt3
-rw-r--r--src/src/nxmhandler_linux.cpp26
2 files changed, 28 insertions, 1 deletions
diff --git a/src/src/CMakeLists.txt b/src/src/CMakeLists.txt
index ef9f696..ed43c8f 100644
--- a/src/src/CMakeLists.txt
+++ b/src/src/CMakeLists.txt
@@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.16)
find_package(Qt6 REQUIRED COMPONENTS
- Widgets WebSockets Network NetworkAuth Concurrent)
+ Widgets WebSockets Network NetworkAuth Concurrent DBus)
option(MO2_ENABLE_WEBENGINE "Build optional Qt WebEngine browser support" OFF)
if(MO2_ENABLE_WEBENGINE)
find_package(Qt6 QUIET COMPONENTS WebEngineWidgets)
@@ -190,6 +190,7 @@ target_link_libraries(organizer PRIVATE
Qt6::WebSockets
Qt6::Network
Qt6::NetworkAuth
+ Qt6::DBus
# Boost
Boost::program_options
# spdlog
diff --git a/src/src/nxmhandler_linux.cpp b/src/src/nxmhandler_linux.cpp
index 7b70ff4..aaf942e 100644
--- a/src/src/nxmhandler_linux.cpp
+++ b/src/src/nxmhandler_linux.cpp
@@ -4,6 +4,8 @@
#include <log.h>
#include <QCoreApplication>
+#include <QDBusConnection>
+#include <QDBusMessage>
#include <QDir>
#include <QFile>
#include <QFileInfo>
@@ -39,6 +41,27 @@ bool writeTextFile(const QString& path, const QString& content)
return stream.status() == QTextStream::Ok;
}
+// xdg-desktop-portal remembers chooser picks in its permission store. An
+// earlier build registered both com.fluorine.manager.desktop and
+// mo2-nxm-handler.desktop for nxm:// — anyone who picked Fluorine Manager
+// from the chooser had it persisted as their always-use app, which kept
+// routing nxm:// to the wrong handler (full MO2 launch with no URL) even
+// after the bad MimeType was removed. Strip the stale com.fluorine.manager
+// entry so existing users self-heal on next launch.
+void clearStalePortalChoice(const QString& mimeType)
+{
+ QDBusMessage msg = QDBusMessage::createMethodCall(
+ "org.freedesktop.impl.portal.PermissionStore",
+ "/org/freedesktop/impl/portal/PermissionStore",
+ "org.freedesktop.impl.portal.PermissionStore", "DeletePermission");
+ msg << QStringLiteral("desktop-used-apps") << mimeType
+ << QStringLiteral("com.fluorine.manager");
+
+ // Fire-and-forget on the session bus. The reply is uninteresting: a missing
+ // entry returns an error and we don't want to log on every clean startup.
+ QDBusConnection::sessionBus().call(msg, QDBus::NoBlock);
+}
+
void updateMimeAppsList(const QString& path, const QString& mimeType,
const QString& desktopFile)
{
@@ -245,6 +268,9 @@ void NxmHandlerLinux::registerHandler()
if (result != 0) {
log::warn("update-desktop-database exited with code {}", result);
}
+
+ clearStalePortalChoice("x-scheme-handler/nxm");
+ clearStalePortalChoice("x-scheme-handler/modl");
}
bool NxmHandlerLinux::startListener()