Kde/patches: add more patches

This commit is contained in:
Toast 2025-09-30 21:07:54 +02:00
parent a4f27b49af
commit fc803fd67e
8 changed files with 988 additions and 0 deletions

View file

@ -3,3 +3,4 @@ Pr 3612 https://invent.kde.org/plasma/kwin/-/merge_requests/3612
Pr 7823 https://invent.kde.org/plasma/kwin/-/merge_requests/7823 Pr 7823 https://invent.kde.org/plasma/kwin/-/merge_requests/7823
Pr 8005 https://invent.kde.org/plasma/kwin/-/merge_requests/8005 Pr 8005 https://invent.kde.org/plasma/kwin/-/merge_requests/8005
Depends on Pr 7927 https://invent.kde.org/plasma/kwin/-/merge_requests/7927 Depends on Pr 7927 https://invent.kde.org/plasma/kwin/-/merge_requests/7927
Pr 8155 https://invent.kde.org/plasma/kwin/-/merge_requests/8155

View file

@ -0,0 +1,60 @@
From bab7c4a4c5e2fb7be83ba94fdd0da7fd196654fa Mon Sep 17 00:00:00 2001
From: David Redondo <kde@david-redondo.de>
Date: Thu, 25 Sep 2025 12:00:51 +0200
Subject: [PATCH] Make sure XdgToplevelWindow always has an icon
If the client never called set_app_id and did not set a custom
icon the window would end up without an icon at all. This ensures
that all windows always have at least the default icon.
---
autotests/integration/xdgshellwindow_test.cpp | 13 +++++++++++--
src/xdgshellwindow.cpp | 1 +
2 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/autotests/integration/xdgshellwindow_test.cpp b/autotests/integration/xdgshellwindow_test.cpp
index 0903043808d..a3658ee62e7 100644
--- a/autotests/integration/xdgshellwindow_test.cpp
+++ b/autotests/integration/xdgshellwindow_test.cpp
@@ -683,16 +683,25 @@ void TestXdgShellWindow::testDesktopFileName()
std::unique_ptr<KWayland::Client::Surface> surface(Test::createSurface());
// only xdg-shell as ShellSurface misses the setter
std::unique_ptr<Test::XdgToplevel> shellSurface(Test::createXdgToplevelSurface(surface.get()));
- shellSurface->set_app_id(QStringLiteral("org.kde.foo"));
auto window = Test::renderAndWaitForShown(surface.get(), QSize(100, 50), Qt::blue);
QVERIFY(window);
+
+ // A client that never call set_app_id still gets the default icon
+ QCOMPARE(window->desktopFileName(), QString());
+ QVERIFY(window->resourceClass().startsWith("testXdgShellWindow"));
+ QVERIFY(window->resourceName().startsWith("testXdgShellWindow"));
+ QCOMPARE(window->icon().name(), QStringLiteral("wayland"));
+
+ QSignalSpy desktopFileNameChangedSpy(window, &Window::desktopFileNameChanged);
+
+ shellSurface->set_app_id(QStringLiteral("org.kde.foo"));
+ QVERIFY(desktopFileNameChangedSpy.wait());
QCOMPARE(window->desktopFileName(), QStringLiteral("org.kde.foo"));
QCOMPARE(window->resourceClass(), QStringLiteral("org.kde.foo"));
QVERIFY(window->resourceName().startsWith("testXdgShellWindow"));
// the desktop file does not exist, so icon should be generic Wayland
QCOMPARE(window->icon().name(), QStringLiteral("wayland"));
- QSignalSpy desktopFileNameChangedSpy(window, &Window::desktopFileNameChanged);
QSignalSpy iconChangedSpy(window, &Window::iconChanged);
shellSurface->set_app_id(QStringLiteral("org.kde.bar"));
QVERIFY(desktopFileNameChangedSpy.wait());
diff --git a/src/xdgshellwindow.cpp b/src/xdgshellwindow.cpp
index f585d3aef95..092c284b8c2 100644
--- a/src/xdgshellwindow.cpp
+++ b/src/xdgshellwindow.cpp
@@ -1426,6 +1426,7 @@ void XdgToplevelWindow::initialize()
scheduleConfigure();
updateColorScheme();
updateCapabilities();
+ updateIcon();
setupWindowManagementInterface();
m_isInitialized = true;
--
GitLab

View file

@ -0,0 +1,78 @@
From b05d0431d741510c12294c85dc5ce001a8aceca2 Mon Sep 17 00:00:00 2001
From: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
Date: Wed, 17 Sep 2025 11:41:15 +0300
Subject: [PATCH 1/2] wayland: Fix leaking xdg activation objects
Nobody destroys WaylandXdgActivationV1 objects, we also must call destroy()
manually.
---
src/platforms/wayland/waylandxdgactivationv1_p.h | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/src/platforms/wayland/waylandxdgactivationv1_p.h b/src/platforms/wayland/waylandxdgactivationv1_p.h
index e74c550b..e3b14c27 100644
--- a/src/platforms/wayland/waylandxdgactivationv1_p.h
+++ b/src/platforms/wayland/waylandxdgactivationv1_p.h
@@ -16,10 +16,18 @@ class QWaylandSurface;
class WaylandXdgActivationTokenV1 : public QObject, public QtWayland::xdg_activation_token_v1
{
Q_OBJECT
+
public:
+ ~WaylandXdgActivationTokenV1() override
+ {
+ destroy();
+ }
+
+protected:
void xdg_activation_token_v1_done(const QString &token) override
{
Q_EMIT done(token);
+ deleteLater();
}
Q_SIGNALS:
--
GitLab
From ac28bf993ba7295faf39607d4b4402f6dce1c36b Mon Sep 17 00:00:00 2001
From: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
Date: Wed, 17 Sep 2025 11:43:16 +0300
Subject: [PATCH 2/2] wayland: Drop WaylandXdgActivationTokenV1::failed signal
It's not emitted by anyone.
---
src/platforms/wayland/waylandxdgactivationv1_p.h | 1 -
src/platforms/wayland/windowsystem.cpp | 3 ---
2 files changed, 4 deletions(-)
diff --git a/src/platforms/wayland/waylandxdgactivationv1_p.h b/src/platforms/wayland/waylandxdgactivationv1_p.h
index e3b14c27..077ccd93 100644
--- a/src/platforms/wayland/waylandxdgactivationv1_p.h
+++ b/src/platforms/wayland/waylandxdgactivationv1_p.h
@@ -31,7 +31,6 @@ protected:
}
Q_SIGNALS:
- void failed();
void done(const QString &token);
};
diff --git a/src/platforms/wayland/windowsystem.cpp b/src/platforms/wayland/windowsystem.cpp
index 034ffd37..f2d8b4f2 100644
--- a/src/platforms/wayland/windowsystem.cpp
+++ b/src/platforms/wayland/windowsystem.cpp
@@ -95,9 +95,6 @@ void WindowSystem::requestToken(QWindow *window, uint32_t serial, const QString
auto waylandApp = qGuiApp->nativeInterface<QNativeInterface::QWaylandApplication>();
auto seat = waylandApp ? waylandApp->lastInputSeat() : nullptr;
auto tokenReq = activation->requestXdgActivationToken(seat, wlSurface, serial, app_id);
- connect(tokenReq, &WaylandXdgActivationTokenV1::failed, KWindowSystem::self(), [serial, app_id]() {
- Q_EMIT KWaylandExtras::self()->xdgActivationTokenArrived(serial, {});
- });
connect(tokenReq, &WaylandXdgActivationTokenV1::done, KWindowSystem::self(), [serial](const QString &token) {
Q_EMIT KWaylandExtras::self()->xdgActivationTokenArrived(serial, token);
});
--
GitLab

View file

@ -0,0 +1,4 @@
Plasma 6.6.0:
Pr 186 https://invent.kde.org/frameworks/kwindowsystem/-/merge_requests/186
Pr 187 https://invent.kde.org/frameworks/kwindowsystem/-/merge_requests/187

View file

@ -0,0 +1,415 @@
From 9d0ffb13d290d76df03d199b50c3b3364d4b93bc Mon Sep 17 00:00:00 2001
From: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
Date: Wed, 17 Sep 2025 10:14:15 +0300
Subject: [PATCH 1/2] Add QFuture-based xdg-activation token helpers
QFuture can be used to make the code that needs activation tokens cleaner.
---
src/kwaylandextras.cpp | 14 +++++++++++
src/kwaylandextras.h | 21 ++++++++++++++++
src/kwindowsystem_p.h | 8 ++++++
.../wayland/waylandxdgactivationv1_p.h | 19 ++++++++++++++
src/platforms/wayland/windowsystem.cpp | 25 ++++++++++++++++---
src/platforms/wayland/windowsystem.h | 3 ++-
tests/activationtest.cpp | 13 +++++-----
tests/kwaylandextrastest.cpp | 12 +++------
8 files changed, 95 insertions(+), 20 deletions(-)
diff --git a/src/kwaylandextras.cpp b/src/kwaylandextras.cpp
index 036d57d3..a5f8af8f 100644
--- a/src/kwaylandextras.cpp
+++ b/src/kwaylandextras.cpp
@@ -63,4 +63,18 @@ void KWaylandExtras::unexportWindow(QWindow *window)
}
}
+QFuture<QString> KWaylandExtras::xdgActivationToken(QWindow *window, uint32_t serial, const QString &appId)
+{
+ if (auto dv3 = dynamic_cast<KWindowSystemPrivateV3 *>(KWindowSystem::d_func())) {
+ return dv3->xdgActivationToken(window, serial, appId);
+ } else {
+ return QFuture<QString>();
+ }
+}
+
+QFuture<QString> KWaylandExtras::xdgActivationToken(QWindow *window, const QString &appId)
+{
+ return xdgActivationToken(window, lastInputSerial(window), appId);
+}
+
#include "moc_kwaylandextras.cpp"
diff --git a/src/kwaylandextras.h b/src/kwaylandextras.h
index f43135d0..2f763dd5 100644
--- a/src/kwaylandextras.h
+++ b/src/kwaylandextras.h
@@ -9,6 +9,7 @@
#ifndef KWAYLANDEXTRAS_H
#define KWAYLANDEXTRAS_H
+#include <QFuture>
#include <QObject>
#include <QWindow>
@@ -61,6 +62,26 @@ public:
*/
Q_INVOKABLE static void unexportWindow(QWindow *window);
+ /*!
+ * Requests an xdg_activation_v1 token for a specific window \a window with the given \a appId.
+ * The \a serial indicates an event that triggered the request.
+ *
+ * \note No xdgActivationTokenArrived() signal will be emitted for this token.
+ *
+ * \since 6.19
+ */
+ static QFuture<QString> xdgActivationToken(QWindow *window, uint32_t serial, const QString &appId);
+
+ /*!
+ * Requests an xdg_activation_v1 token for a specific window \a window with the given \a appId.
+ * The last received input serial will be used to request the token.
+ *
+ * \note No xdgActivationTokenArrived() signal will be emitted for this token.
+ *
+ * \since 6.19
+ */
+ static QFuture<QString> xdgActivationToken(QWindow *window, const QString &appId);
+
Q_SIGNALS:
/*!
* Activation \a token to pass to the client.
diff --git a/src/kwindowsystem_p.h b/src/kwindowsystem_p.h
index eb9348ba..e4b51e3e 100644
--- a/src/kwindowsystem_p.h
+++ b/src/kwindowsystem_p.h
@@ -7,6 +7,8 @@
#define KWINDOWSYSTEM_P_H
#include "netwm_def.h"
+
+#include <QFuture>
#include <QStringList>
#include <QWidgetList> //For WId
#include <kwindowsystem_export.h>
@@ -33,4 +35,10 @@ public:
virtual void unexportWindow(QWindow *window) = 0;
};
+class KWINDOWSYSTEM_EXPORT KWindowSystemPrivateV3 : public KWindowSystemPrivateV2
+{
+public:
+ virtual QFuture<QString> xdgActivationToken(QWindow *window, uint32_t serial, const QString &appId) = 0;
+};
+
#endif
diff --git a/src/platforms/wayland/waylandxdgactivationv1_p.h b/src/platforms/wayland/waylandxdgactivationv1_p.h
index 077ccd93..629d45ef 100644
--- a/src/platforms/wayland/waylandxdgactivationv1_p.h
+++ b/src/platforms/wayland/waylandxdgactivationv1_p.h
@@ -8,7 +8,10 @@
#define WAYLANDXDGACTIVATIONV1_P_H
#include "qwayland-xdg-activation-v1.h"
+
+#include <QFuture>
#include <QObject>
+#include <QPromise>
#include <QtWaylandClient/QWaylandClientExtension>
class QWaylandSurface;
@@ -18,20 +21,36 @@ class WaylandXdgActivationTokenV1 : public QObject, public QtWayland::xdg_activa
Q_OBJECT
public:
+ WaylandXdgActivationTokenV1()
+ {
+ m_promise.start();
+ }
+
~WaylandXdgActivationTokenV1() override
{
destroy();
}
+ QFuture<QString> future() const
+ {
+ return m_promise.future();
+ }
+
protected:
void xdg_activation_token_v1_done(const QString &token) override
{
+ m_promise.addResult(token);
+ m_promise.finish();
+
Q_EMIT done(token);
deleteLater();
}
Q_SIGNALS:
void done(const QString &token);
+
+private:
+ QPromise<QString> m_promise;
};
class WaylandXdgActivationV1 : public QWaylandClientExtensionTemplate<WaylandXdgActivationV1>, public QtWayland::xdg_activation_v1
diff --git a/src/platforms/wayland/windowsystem.cpp b/src/platforms/wayland/windowsystem.cpp
index f2d8b4f2..ebb22d78 100644
--- a/src/platforms/wayland/windowsystem.cpp
+++ b/src/platforms/wayland/windowsystem.cpp
@@ -50,9 +50,7 @@ public:
};
WindowSystem::WindowSystem()
- : QObject()
- , KWindowSystemPrivateV2()
- , m_lastToken(qEnvironmentVariable("XDG_ACTIVATION_TOKEN"))
+ : m_lastToken(qEnvironmentVariable("XDG_ACTIVATION_TOKEN"))
{
m_windowManagement = new WindowManagement;
}
@@ -303,4 +301,25 @@ void WindowSystem::doSetMainWindow(QWindow *window, const QString &handle)
}
}
+QFuture<QString> WindowSystem::xdgActivationToken(QWindow *window, uint32_t serial, const QString &appId)
+{
+ WaylandXdgActivationV1 *activation = WaylandXdgActivationV1::self();
+ if (!activation->isActive()) {
+ return QFuture<QString>();
+ }
+
+ auto waylandApp = qGuiApp->nativeInterface<QNativeInterface::QWaylandApplication>();
+ if (!waylandApp) {
+ return QFuture<QString>();
+ }
+
+ if (window) {
+ window->create();
+ }
+ wl_surface *wlSurface = surfaceForWindow(window);
+
+ auto token = activation->requestXdgActivationToken(waylandApp->lastInputSeat(), wlSurface, serial, appId);
+ return token->future();
+}
+
#include "moc_windowsystem.cpp"
diff --git a/src/platforms/wayland/windowsystem.h b/src/platforms/wayland/windowsystem.h
index 87bf23ed..4df82388 100644
--- a/src/platforms/wayland/windowsystem.h
+++ b/src/platforms/wayland/windowsystem.h
@@ -12,7 +12,7 @@
class WindowManagement;
-class WindowSystem : public QObject, public KWindowSystemPrivateV2
+class WindowSystem : public QObject, public KWindowSystemPrivateV3
{
Q_OBJECT
public:
@@ -27,6 +27,7 @@ public:
void exportWindow(QWindow *window) override;
void unexportWindow(QWindow *window) override;
void setMainWindow(QWindow *window, const QString &handle) override;
+ QFuture<QString> xdgActivationToken(QWindow *window, uint32_t serial, const QString &appId) override;
protected:
bool eventFilter(QObject *watched, QEvent *event) override;
diff --git a/tests/activationtest.cpp b/tests/activationtest.cpp
index 306c6048..7aaae4ea 100644
--- a/tests/activationtest.cpp
+++ b/tests/activationtest.cpp
@@ -28,13 +28,12 @@ public:
pushButton->setText("Raise other");
layout()->addWidget(pushButton);
- connect(pushButton, &QPushButton::clicked, this, [this] {
- KWaylandExtras::requestXdgActivationToken(windowHandle(), KWaylandExtras::lastInputSerial(windowHandle()), QString());
- });
-
- connect(KWaylandExtras::self(), &KWaylandExtras::xdgActivationTokenArrived, this, [otherWindow](int /*serial*/, const QString &token) {
- KWindowSystem::setCurrentXdgActivationToken(token);
- KWindowSystem::activateWindow(otherWindow->windowHandle());
+ connect(pushButton, &QPushButton::clicked, this, [this, otherWindow] {
+ KWaylandExtras::xdgActivationToken(windowHandle(), KWaylandExtras::lastInputSerial(windowHandle()), QString())
+ .then(otherWindow, [otherWindow](const QString &token) {
+ KWindowSystem::setCurrentXdgActivationToken(token);
+ KWindowSystem::activateWindow(otherWindow->windowHandle());
+ });
});
}
};
diff --git a/tests/kwaylandextrastest.cpp b/tests/kwaylandextrastest.cpp
index 3048cb37..2ee86a82 100644
--- a/tests/kwaylandextrastest.cpp
+++ b/tests/kwaylandextrastest.cpp
@@ -79,16 +79,10 @@ void Window::updateSerial()
void Window::requestToken()
{
- connect(
- KWaylandExtras::self(),
- &KWaylandExtras::xdgActivationTokenArrived,
- this,
- [this](int /*serial*/, const QString &token) {
+ KWaylandExtras::xdgActivationToken(windowHandle(), KWaylandExtras::self()->lastInputSerial(windowHandle()), QString())
+ .then(this, [this](const QString &token) {
m_tokenLabel->setText("XDG actvation token: " + token);
- },
- Qt::SingleShotConnection);
-
- KWaylandExtras::requestXdgActivationToken(windowHandle(), KWaylandExtras::self()->lastInputSerial(windowHandle()), QString());
+ });
}
void Window::exportWindow()
--
GitLab
From 1b16c417c697b5d30724ce37d0364af894f6680d Mon Sep 17 00:00:00 2001
From: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
Date: Wed, 17 Sep 2025 12:01:53 +0300
Subject: [PATCH 2/2] Deprecate KWaylandExtras::requestXdgActivationToken()
KWaylandExtras::xdgActivationToken() provides a more convenient way to
retrieve an xdg activation token.
Note that the QML side has no corresponding counterpart, however on the
other hand, there is no QML code that uses this function too. If the need
arises, the QML specific API could provide a Promise-like object.
---
src/CMakeLists.txt | 2 +-
src/kwaylandextras.cpp | 2 ++
src/kwaylandextras.h | 9 ++++++++-
src/kwindowsystem_p.h | 2 ++
src/platforms/wayland/windowsystem.cpp | 2 ++
src/platforms/wayland/windowsystem.h | 2 ++
6 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index fd72063b..ba748c2c 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -88,7 +88,7 @@ ecm_generate_export_header(KF6WindowSystem
VERSION ${KF_VERSION}
USE_VERSION_HEADER
DEPRECATED_BASE_VERSION 0
- DEPRECATION_VERSIONS 6.0
+ DEPRECATION_VERSIONS 6.0 6.19
EXCLUDE_DEPRECATED_BEFORE_AND_AT ${EXCLUDE_DEPRECATED_BEFORE_AND_AT}
)
diff --git a/src/kwaylandextras.cpp b/src/kwaylandextras.cpp
index a5f8af8f..241f80be 100644
--- a/src/kwaylandextras.cpp
+++ b/src/kwaylandextras.cpp
@@ -26,6 +26,7 @@ KWaylandExtras *KWaylandExtras::self()
return &instance;
}
+#if KWINDOWSYSTEM_BUILD_DEPRECATED_SINCE(6, 19)
void KWaylandExtras::requestXdgActivationToken(QWindow *window, uint32_t serial, const QString &app_id)
{
auto dv2 = dynamic_cast<KWindowSystemPrivateV2 *>(KWindowSystem::d_func());
@@ -39,6 +40,7 @@ void KWaylandExtras::requestXdgActivationToken(QWindow *window, uint32_t serial,
}
dv2->requestToken(window, serial, app_id);
}
+#endif
quint32 KWaylandExtras::lastInputSerial(QWindow *window)
{
diff --git a/src/kwaylandextras.h b/src/kwaylandextras.h
index 2f763dd5..56424b89 100644
--- a/src/kwaylandextras.h
+++ b/src/kwaylandextras.h
@@ -31,14 +31,18 @@ public:
*/
static KWaylandExtras *self();
+#if KWINDOWSYSTEM_ENABLE_DEPRECATED_SINCE(6, 19)
/*!
* Requests an xdg_activation_v1 token for a specific window \a win with the given \a app_id.
*
* \a serial Serial of the event that triggered the request.
*
* \sa lastInputSerial
+ * \deprecated [6.19] Use xdgActivationToken() instead.
*/
+ KWINDOWSYSTEM_DEPRECATED_VERSION(6, 19, "Use xdgActivationToken()")
Q_INVOKABLE static void requestXdgActivationToken(QWindow *win, uint32_t serial, const QString &app_id);
+#endif
/*!
* Offers the seat's current serial for the given \a window.
@@ -83,14 +87,17 @@ public:
static QFuture<QString> xdgActivationToken(QWindow *window, const QString &appId);
Q_SIGNALS:
+#if KWINDOWSYSTEM_ENABLE_DEPRECATED_SINCE(6, 19)
/*!
* Activation \a token to pass to the client.
*
* \a serial Serial of the event that triggered the request
*
* \sa requestXdgActivationToken
+ * \deprecated [6.19] Use xdgActivationToken() instead.
*/
- void xdgActivationTokenArrived(int serial, const QString &token);
+ KWINDOWSYSTEM_DEPRECATED_VERSION(6, 19, "Use xdgActivationToken()") void xdgActivationTokenArrived(int serial, const QString &token);
+#endif
/*!
* The \a handle of the given \a window to pass to the client.
diff --git a/src/kwindowsystem_p.h b/src/kwindowsystem_p.h
index e4b51e3e..92997120 100644
--- a/src/kwindowsystem_p.h
+++ b/src/kwindowsystem_p.h
@@ -27,7 +27,9 @@ public:
class KWINDOWSYSTEM_EXPORT KWindowSystemPrivateV2 : public KWindowSystemPrivate
{
public:
+#if KWINDOWSYSTEM_BUILD_DEPRECATED_SINCE(6, 19)
virtual void requestToken(QWindow *win, uint32_t serial, const QString &app_id) = 0;
+#endif
virtual void setCurrentToken(const QString &token) = 0;
virtual quint32 lastInputSerial(QWindow *window) = 0;
virtual void setMainWindow(QWindow *window, const QString &handle) = 0;
diff --git a/src/platforms/wayland/windowsystem.cpp b/src/platforms/wayland/windowsystem.cpp
index ebb22d78..bc803a4f 100644
--- a/src/platforms/wayland/windowsystem.cpp
+++ b/src/platforms/wayland/windowsystem.cpp
@@ -74,6 +74,7 @@ void WindowSystem::activateWindow(QWindow *win, long int time)
activation->activate(m_lastToken, s);
}
+#if KWINDOWSYSTEM_BUILD_DEPRECATED_SINCE(6, 19)
void WindowSystem::requestToken(QWindow *window, uint32_t serial, const QString &app_id)
{
if (window) {
@@ -97,6 +98,7 @@ void WindowSystem::requestToken(QWindow *window, uint32_t serial, const QString
Q_EMIT KWaylandExtras::self()->xdgActivationTokenArrived(serial, token);
});
}
+#endif
void WindowSystem::setCurrentToken(const QString &token)
{
diff --git a/src/platforms/wayland/windowsystem.h b/src/platforms/wayland/windowsystem.h
index 4df82388..e9dca128 100644
--- a/src/platforms/wayland/windowsystem.h
+++ b/src/platforms/wayland/windowsystem.h
@@ -19,7 +19,9 @@ public:
WindowSystem();
~WindowSystem() override;
void activateWindow(QWindow *win, long time) override;
+#if KWINDOWSYSTEM_BUILD_DEPRECATED_SINCE(6, 19)
void requestToken(QWindow *win, uint32_t serial, const QString &app_id) override;
+#endif
quint32 lastInputSerial(QWindow *window) override;
void setCurrentToken(const QString &token) override;
bool showingDesktop() override;
--
GitLab

View file

@ -14,3 +14,8 @@ Pr 5678 https://invent.kde.org/plasma/plasma-workspace/-/merge_requests/5678
Depends on Pr 5673 https://invent.kde.org/plasma/plasma-workspace/-/merge_requests/5673 Depends on Pr 5673 https://invent.kde.org/plasma/plasma-workspace/-/merge_requests/5673
Pr 5788 https://invent.kde.org/plasma/plasma-workspace/-/merge_requests/5788 Pr 5788 https://invent.kde.org/plasma/plasma-workspace/-/merge_requests/5788
Allows compiling on gcc 14 after applying pr 5678 Allows compiling on gcc 14 after applying pr 5678
Plasma 6.6.0:
Pr 5818 https://invent.kde.org/plasma/plasma-workspace/-/merge_requests/5818
Pr 5816 https://invent.kde.org/plasma/plasma-workspace/-/merge_requests/5816

View file

@ -0,0 +1,349 @@
From 77b3ec8cf4fb9414167bb15bcc3c69b1be6c2dbf Mon Sep 17 00:00:00 2001
From: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
Date: Tue, 16 Sep 2025 15:52:29 +0300
Subject: [PATCH 1/2] shell: Pass an xdg activation token from DesktopView to
KRunner
This makes sure that krunner gets focused after starting to type while
a desktop view is focused when using medium or high focus stealing
prevention level.
---
krunner/dbus/org.kde.krunner.App.xml | 4 ++
krunner/view.cpp | 14 +++++++
krunner/view.h | 1 +
shell/desktopview.cpp | 61 ++++++++++++++++++++++++++--
shell/desktopview.h | 2 +
5 files changed, 79 insertions(+), 3 deletions(-)
diff --git a/krunner/dbus/org.kde.krunner.App.xml b/krunner/dbus/org.kde.krunner.App.xml
index 6553e9a1b56..e6926b1b63a 100644
--- a/krunner/dbus/org.kde.krunner.App.xml
+++ b/krunner/dbus/org.kde.krunner.App.xml
@@ -17,5 +17,9 @@
<arg name="runnerName" type="s" direction="in"/>
<arg name="term" type="s" direction="in"/>
</method>
+ <method name="queryWithActivationToken">
+ <arg name="term" type="s" direction="in"/>
+ <arg name="activationToken" type="s" direction="in"/>
+ </method>
</interface>
</node>
diff --git a/krunner/view.cpp b/krunner/view.cpp
index afefe9ab486..bb7edd5d654 100644
--- a/krunner/view.cpp
+++ b/krunner/view.cpp
@@ -263,6 +263,20 @@ void View::querySingleRunner(const QString &runnerName, const QString &term)
m_engine->rootObject()->setProperty("query", term);
}
+void View::queryWithActivationToken(const QString &term, const QString &activationToken)
+{
+ qputenv("XDG_ACTIVATION_TOKEN", activationToken.toUtf8());
+
+ if (!isVisible()) {
+ display();
+ } else {
+ requestActivate();
+ }
+
+ m_engine->rootObject()->setProperty("singleRunner", QString());
+ m_engine->rootObject()->setProperty("query", term);
+}
+
bool View::pinned() const
{
return m_pinned;
diff --git a/krunner/view.h b/krunner/view.h
index 979c6d3b483..af1d477d6f3 100644
--- a/krunner/view.h
+++ b/krunner/view.h
@@ -93,6 +93,7 @@ public Q_SLOTS:
void displayWithClipboardContents();
void query(const QString &term);
void querySingleRunner(const QString &runnerName, const QString &term);
+ void queryWithActivationToken(const QString &term, const QString &activationToken);
protected Q_SLOTS:
void loadConfig();
diff --git a/shell/desktopview.cpp b/shell/desktopview.cpp
index 36e23149272..744176e6d3e 100644
--- a/shell/desktopview.cpp
+++ b/shell/desktopview.cpp
@@ -23,6 +23,7 @@
#include <KAuthorized>
#include <KStartupInfo>
+#include <KWaylandExtras>
#include <KX11Extras>
#include <klocalizedstring.h>
#include <kwindowsystem.h>
@@ -384,11 +385,54 @@ bool DesktopView::event(QEvent *e)
{
if (e->type() == QEvent::FocusOut) {
m_krunnerText.clear();
+
+ if (!m_krunnerFuture.isCanceled()) {
+ m_krunnerFuture.cancel();
+ m_krunnerFuture = {};
+ }
}
return PlasmaQuick::ContainmentView::event(e);
}
+class ActivationTokenRequest : public QObject
+{
+ Q_OBJECT
+
+public:
+ explicit ActivationTokenRequest(QWindow *window)
+ : m_serial(KWaylandExtras::lastInputSerial(window))
+ {
+ m_promise.start();
+
+ connect(KWaylandExtras::self(), &KWaylandExtras::xdgActivationTokenArrived, this, [this](int serial, const QString &token) {
+ if (m_serial == serial) {
+ if (!m_promise.isCanceled()) {
+ m_promise.addResult(token);
+ }
+ m_promise.finish();
+ delete this;
+ }
+ });
+ KWaylandExtras::requestXdgActivationToken(window, m_serial, QString());
+ }
+
+ QFuture<QString> future() const
+ {
+ return m_promise.future();
+ }
+
+private:
+ QPromise<QString> m_promise;
+ int m_serial;
+};
+
+static QFuture<QString> fetchActivationToken(QWindow *window)
+{
+ auto request = new ActivationTokenRequest(window);
+ return request->future();
+}
+
bool DesktopView::handleKRunnerTextInput(QKeyEvent *e)
{
// allow only Shift and GroupSwitch modifiers
@@ -408,12 +452,22 @@ bool DesktopView::handleKRunnerTextInput(QKeyEvent *e)
krunnerTextChanged = true;
}
if (krunnerTextChanged) {
- const QString interface(QStringLiteral("org.kde.krunner"));
if (!KAuthorized::authorize(QStringLiteral("run_command"))) {
return false;
}
- org::kde::krunner::App krunner(interface, QStringLiteral("/App"), QDBusConnection::sessionBus());
- krunner.query(m_krunnerText);
+ if (KWindowSystem::isPlatformWayland()) {
+ if (!m_krunnerFuture.isCanceled()) {
+ m_krunnerFuture.cancel();
+ }
+ m_krunnerFuture = fetchActivationToken(this);
+ m_krunnerFuture.then(this, [this](const QString &token) {
+ org::kde::krunner::App krunner(QStringLiteral("org.kde.krunner"), QStringLiteral("/App"), QDBusConnection::sessionBus());
+ krunner.queryWithActivationToken(m_krunnerText, token);
+ });
+ } else {
+ org::kde::krunner::App krunner(QStringLiteral("org.kde.krunner"), QStringLiteral("/App"), QDBusConnection::sessionBus());
+ krunner.query(m_krunnerText);
+ }
return true;
}
return false;
@@ -596,4 +650,5 @@ void DesktopView::setAccentColorFromWallpaper(const QColor &accentColor)
QDBusConnection::sessionBus().send(applyAccentColor);
}
+#include "desktopview.moc"
#include "moc_desktopview.cpp"
diff --git a/shell/desktopview.h b/shell/desktopview.h
index c2b642d9a15..9e152611a31 100644
--- a/shell/desktopview.h
+++ b/shell/desktopview.h
@@ -10,6 +10,7 @@
#include <PlasmaQuick/ConfigView>
#include <PlasmaQuick/ContainmentView>
+#include <QFuture>
#include <QPointer>
#include <KConfigWatcher>
@@ -127,6 +128,7 @@ private:
QPointer<QScreen> m_screenToFollow;
LayerShellQt::Window *m_layerWindow = nullptr;
QString m_krunnerText;
+ QFuture<QString> m_krunnerFuture;
// KRunner config
KConfigWatcher::Ptr m_configWatcher;
--
GitLab
From b3d97405cb5b0ee9859576309bd826dea6b74274 Mon Sep 17 00:00:00 2001
From: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
Date: Wed, 17 Sep 2025 09:59:07 +0300
Subject: [PATCH 2/2] shell: Use org.freedesktop.Application.ActivateAction to
pass xdg activation token to krunner
---
krunner/dbus/org.kde.krunner.App.xml | 4 ----
krunner/main.cpp | 4 +++-
krunner/view.cpp | 14 ------------
krunner/view.h | 1 -
shell/CMakeLists.txt | 4 ----
shell/desktopview.cpp | 32 +++++++++++++++++++++++-----
6 files changed, 30 insertions(+), 29 deletions(-)
diff --git a/krunner/dbus/org.kde.krunner.App.xml b/krunner/dbus/org.kde.krunner.App.xml
index e6926b1b63a..6553e9a1b56 100644
--- a/krunner/dbus/org.kde.krunner.App.xml
+++ b/krunner/dbus/org.kde.krunner.App.xml
@@ -17,9 +17,5 @@
<arg name="runnerName" type="s" direction="in"/>
<arg name="term" type="s" direction="in"/>
</method>
- <method name="queryWithActivationToken">
- <arg name="term" type="s" direction="in"/>
- <arg name="activationToken" type="s" direction="in"/>
- </method>
</interface>
</node>
diff --git a/krunner/main.cpp b/krunner/main.cpp
index 514c34b032f..02174bb2cda 100644
--- a/krunner/main.cpp
+++ b/krunner/main.cpp
@@ -136,9 +136,11 @@ int main(int argc, char **argv)
parser.parse(arguments);
updateVisibility();
});
- QObject::connect(&service, &KDBusService::activateActionRequested, &view, [&view](const QString &action) {
+ QObject::connect(&service, &KDBusService::activateActionRequested, &view, [&view](const QString &action, const QVariant &parameter) {
if (action == QLatin1String("RunClipboard")) {
view.displayWithClipboardContents();
+ } else if (action == QLatin1String("Query")) {
+ view.query(parameter.toString());
}
});
diff --git a/krunner/view.cpp b/krunner/view.cpp
index bb7edd5d654..afefe9ab486 100644
--- a/krunner/view.cpp
+++ b/krunner/view.cpp
@@ -263,20 +263,6 @@ void View::querySingleRunner(const QString &runnerName, const QString &term)
m_engine->rootObject()->setProperty("query", term);
}
-void View::queryWithActivationToken(const QString &term, const QString &activationToken)
-{
- qputenv("XDG_ACTIVATION_TOKEN", activationToken.toUtf8());
-
- if (!isVisible()) {
- display();
- } else {
- requestActivate();
- }
-
- m_engine->rootObject()->setProperty("singleRunner", QString());
- m_engine->rootObject()->setProperty("query", term);
-}
-
bool View::pinned() const
{
return m_pinned;
diff --git a/krunner/view.h b/krunner/view.h
index af1d477d6f3..979c6d3b483 100644
--- a/krunner/view.h
+++ b/krunner/view.h
@@ -93,7 +93,6 @@ public Q_SLOTS:
void displayWithClipboardContents();
void query(const QString &term);
void querySingleRunner(const QString &runnerName, const QString &term);
- void queryWithActivationToken(const QString &term, const QString &activationToken);
protected Q_SLOTS:
void loadConfig();
diff --git a/shell/CMakeLists.txt b/shell/CMakeLists.txt
index 96b91888f1b..814413ac827 100644
--- a/shell/CMakeLists.txt
+++ b/shell/CMakeLists.txt
@@ -92,10 +92,6 @@ qt6_generate_wayland_protocol_client_sources(plasmashell
${PLASMA_WAYLAND_PROTOCOLS_DIR}/plasma-shell.xml
)
-set(krunner_xml ${plasma-workspace_SOURCE_DIR}/krunner/dbus/org.kde.krunner.App.xml)
-qt_add_dbus_interface(plasma_shell_SRCS ${krunner_xml} krunner_interface)
-
-
target_sources(plasmashell PRIVATE ${plasma_shell_SRCS})
target_link_libraries(plasmashell PRIVATE
diff --git a/shell/desktopview.cpp b/shell/desktopview.cpp
index 744176e6d3e..9c3baa84b91 100644
--- a/shell/desktopview.cpp
+++ b/shell/desktopview.cpp
@@ -6,12 +6,12 @@
#include "desktopview.h"
#include "containmentconfigview.h"
-#include "krunner_interface.h"
#include "screenpool.h"
#include "shellcorona.h"
#include <QDBusConnection>
#include <QDBusMessage>
+#include <QDBusPendingCall>
#include <QGuiApplication>
#include <QQmlContext>
#include <QQmlEngine>
@@ -461,12 +461,34 @@ bool DesktopView::handleKRunnerTextInput(QKeyEvent *e)
}
m_krunnerFuture = fetchActivationToken(this);
m_krunnerFuture.then(this, [this](const QString &token) {
- org::kde::krunner::App krunner(QStringLiteral("org.kde.krunner"), QStringLiteral("/App"), QDBusConnection::sessionBus());
- krunner.queryWithActivationToken(m_krunnerText, token);
+ auto message = QDBusMessage::createMethodCall(QStringLiteral("org.kde.krunner"),
+ QStringLiteral("/org/kde/krunner"),
+ QStringLiteral("org.freedesktop.Application"),
+ QStringLiteral("ActivateAction"));
+ message.setArguments({
+ QStringLiteral("Query"),
+ QVariantList{
+ m_krunnerText,
+ },
+ QVariantMap{
+ {QStringLiteral("activation-token"), token},
+ },
+ });
+ QDBusConnection::sessionBus().asyncCall(message);
});
} else {
- org::kde::krunner::App krunner(QStringLiteral("org.kde.krunner"), QStringLiteral("/App"), QDBusConnection::sessionBus());
- krunner.query(m_krunnerText);
+ auto message = QDBusMessage::createMethodCall(QStringLiteral("org.kde.krunner"),
+ QStringLiteral("/org/kde/krunner"),
+ QStringLiteral("org.freedesktop.Application"),
+ QStringLiteral("ActivateAction"));
+ message.setArguments({
+ QStringLiteral("Query"),
+ QVariantList{
+ m_krunnerText,
+ },
+ QVariantMap{},
+ });
+ QDBusConnection::sessionBus().asyncCall(message);
}
return true;
}
--
GitLab

View file

@ -0,0 +1,76 @@
From b29509a32a0aa93555f47bc3d3f04c665c511f30 Mon Sep 17 00:00:00 2001
From: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
Date: Wed, 17 Sep 2025 10:27:07 +0300
Subject: [PATCH] shell: Port to KWaylandExtras::xdgActivationToken()
---
shell/desktopview.cpp | 41 +----------------------------------------
1 file changed, 1 insertion(+), 40 deletions(-)
diff --git a/shell/desktopview.cpp b/shell/desktopview.cpp
index 9c3baa84b91..ca48e44e887 100644
--- a/shell/desktopview.cpp
+++ b/shell/desktopview.cpp
@@ -395,44 +395,6 @@ bool DesktopView::event(QEvent *e)
return PlasmaQuick::ContainmentView::event(e);
}
-class ActivationTokenRequest : public QObject
-{
- Q_OBJECT
-
-public:
- explicit ActivationTokenRequest(QWindow *window)
- : m_serial(KWaylandExtras::lastInputSerial(window))
- {
- m_promise.start();
-
- connect(KWaylandExtras::self(), &KWaylandExtras::xdgActivationTokenArrived, this, [this](int serial, const QString &token) {
- if (m_serial == serial) {
- if (!m_promise.isCanceled()) {
- m_promise.addResult(token);
- }
- m_promise.finish();
- delete this;
- }
- });
- KWaylandExtras::requestXdgActivationToken(window, m_serial, QString());
- }
-
- QFuture<QString> future() const
- {
- return m_promise.future();
- }
-
-private:
- QPromise<QString> m_promise;
- int m_serial;
-};
-
-static QFuture<QString> fetchActivationToken(QWindow *window)
-{
- auto request = new ActivationTokenRequest(window);
- return request->future();
-}
-
bool DesktopView::handleKRunnerTextInput(QKeyEvent *e)
{
// allow only Shift and GroupSwitch modifiers
@@ -459,7 +421,7 @@ bool DesktopView::handleKRunnerTextInput(QKeyEvent *e)
if (!m_krunnerFuture.isCanceled()) {
m_krunnerFuture.cancel();
}
- m_krunnerFuture = fetchActivationToken(this);
+ m_krunnerFuture = KWaylandExtras::xdgActivationToken(this, QString());
m_krunnerFuture.then(this, [this](const QString &token) {
auto message = QDBusMessage::createMethodCall(QStringLiteral("org.kde.krunner"),
QStringLiteral("/org/kde/krunner"),
@@ -672,5 +634,4 @@ void DesktopView::setAccentColorFromWallpaper(const QColor &accentColor)
QDBusConnection::sessionBus().send(applyAccentColor);
}
-#include "desktopview.moc"
#include "moc_desktopview.cpp"
--
GitLab