diff options
| -rw-r--r-- | data/icons/com.fluorine.manager.desktop | 1 | ||||
| -rwxr-xr-x | docker/build-inner.sh | 1 | ||||
| -rw-r--r-- | src/src/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | src/src/nxmhandler_linux.cpp | 26 |
4 files changed, 28 insertions, 3 deletions
diff --git a/data/icons/com.fluorine.manager.desktop b/data/icons/com.fluorine.manager.desktop index 5d85cf8..fbe4d30 100644 --- a/data/icons/com.fluorine.manager.desktop +++ b/data/icons/com.fluorine.manager.desktop @@ -8,7 +8,6 @@ Icon=com.fluorine.manager Terminal=false Categories=Game;Utility; Keywords=mod;organizer;modding;skyrim;fallout; -MimeType=x-scheme-handler/nxm;x-scheme-handler/modl; Actions=create-portable;list-instances; [Desktop Action create-portable] diff --git a/docker/build-inner.sh b/docker/build-inner.sh index 8a4f9cb..cd6c3e1 100755 --- a/docker/build-inner.sh +++ b/docker/build-inner.sh @@ -618,7 +618,6 @@ Icon=com.fluorine.manager Terminal=false Categories=Game;Utility; StartupWMClass=ModOrganizer -MimeType=x-scheme-handler/nxm;x-scheme-handler/nxm-hierarchical; DESKTOP_EOF chmod +x "${DESKTOP_DIR}/com.fluorine.manager.desktop" 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() |
