The application launching Dolphin passes a token via the XDG_ACTIVATION_TOKEN environment variable
We need to pass that to the running instance so that it can use it to raise itself
if (urls.isEmpty()) {
return;
}
- KWindowSystem::setCurrentXdgActivationToken(startUpId);
const auto serviceName = isDaemon() ? QString() : QStringLiteral("org.kde.dolphin-%1").arg(QCoreApplication::applicationPid());
- if(!Dolphin::attachToExistingInstance(urls, false, GeneralSettings::splitView(), serviceName)) {
+ if(!Dolphin::attachToExistingInstance(urls, false, GeneralSettings::splitView(), serviceName, startUpId)) {
Dolphin::openNewWindow(urls);
}
}
if (urls.isEmpty()) {
return;
}
- KWindowSystem::setCurrentXdgActivationToken(startUpId);
const auto serviceName = isDaemon() ? QString() : QStringLiteral("org.kde.dolphin-%1").arg(QCoreApplication::applicationPid());
- if(!Dolphin::attachToExistingInstance(urls, true, GeneralSettings::splitView(), serviceName)) {
+ if(!Dolphin::attachToExistingInstance(urls, true, GeneralSettings::splitView(), serviceName, startUpId)) {
Dolphin::openNewWindow(urls, nullptr, Dolphin::OpenNewWindowFlag::Select);
};
}
openFiles(QUrl::fromStringList(files), splitView);
}
-void DolphinMainWindow::activateWindow()
+void DolphinMainWindow::activateWindow(const QString &activationToken)
{
window()->setAttribute(Qt::WA_NativeWindow, true);
- KStartupInfo::setNewStartupId(window()->windowHandle(), KStartupInfo::startupId());
- KWindowSystem::activateWindow(window()->effectiveWinId());
+
+ if (KWindowSystem::isPlatformWayland()) {
+ KWindowSystem::setCurrentXdgActivationToken(activationToken);
+ } else {
+ KStartupInfo::setNewStartupId(window()->windowHandle(), KStartupInfo::startupId());
+ }
+
+ KWindowSystem::activateWindow(window()->windowHandle());
}
bool DolphinMainWindow::isActiveWindow()
/**
* Tries to raise/activate the Dolphin window.
*/
- void activateWindow();
+ void activateWindow(const QString &activationToken);
bool isActiveWindow();
#include <KDialogJobUiDelegate>
#include <KIO/ApplicationLauncherJob>
#include <KService>
+#include <KWindowSystem>
#include <QApplication>
job->start();
}
-bool Dolphin::attachToExistingInstance(const QList<QUrl>& inputUrls, bool openFiles, bool splitView, const QString& preferredService)
+bool Dolphin::attachToExistingInstance(const QList<QUrl>& inputUrls, bool openFiles, bool splitView, const QString& preferredService, const QString &activationToken)
{
bool attached = false;
interface.first->openDirectories(interface.second, splitView);
reply.waitForFinished();
if (!reply.isError()) {
- interface.first->activateWindow();
+ interface.first->activateWindow(activationToken);
attached = true;
}
}
* @p preferredService needs to support the org.kde.dolphin.MainWindow dbus interface with the /dolphin/Dolphin_1 path.
* Returns true if the URLs were successfully attached.
*/
- bool attachToExistingInstance(const QList<QUrl>& inputUrls, bool openFiles, bool splitView, const QString& preferredService = QString());
+ bool attachToExistingInstance(const QList<QUrl>& inputUrls, bool openFiles, bool splitView, const QString& preferredService, const QString &activationToken);
/**
* Returns a QVector with all GUI-capable Dolphin instances
#include <KLocalizedString>
#include <KConfigGui>
#include <KIO/PreviewJob>
+#include <KWindowSystem>
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
#include <Kdelibs4ConfigMigrator>
}
if (!parser.isSet(QStringLiteral("new-window"))) {
- if (Dolphin::attachToExistingInstance(urls, openFiles, splitView)) {
+
+ QString token;
+ if (KWindowSystem::isPlatformWayland()) {
+ token = qEnvironmentVariable("XDG_ACTIVATION_TOKEN");
+ qunsetenv("XDG_ACTIVATION_TOKEN");
+ }
+
+ if (Dolphin::attachToExistingInstance(urls, openFiles, splitView, QString(), token)) {
// Successfully attached to existing instance of Dolphin
return 0;
}