[frameworks/kguiaddons] src/systemclipboard: Add KSystemClipboard::ownsClipboard

David Edmundson <[email protected]>
Newsgroups gmane.comp.kde.cvs
Message-ID <[email protected]>
Git commit 36ff5dd441d7203a527da19806d7bdefa755e5a8 by David Edmundson.
Committed on 06/08/2026 at 19:32.
Pushed by davidedmundson into branch 'master'.

Add KSystemClipboard::ownsClipboard

This brings it in line with QClipboard

M  +34   -0    src/systemclipboard/ksystemclipboard.cpp
M  +8    -0    src/systemclipboard/ksystemclipboard.h
M  +10   -0    src/systemclipboard/qtclipboard.cpp
M  +3    -0    src/systemclipboard/qtclipboard_p.h
M  +10   -0    src/systemclipboard/waylandclipboard.cpp
M  +2    -0    src/systemclipboard/waylandclipboard_p.h
M  +16   -0    src/systemclipboard/wlrwaylandclipboard.cpp
M  +3    -0    src/systemclipboard/wlrwaylandclipboard_p.h

https://invent.kde.org/frameworks/kguiaddons/-/commit/36ff5dd441d7203a527da19806d7bdefa755e5a8

diff --git a/src/systemclipboard/ksystemclipboard.cpp b/src/systemclipboard/ksystemclipboard.cpp
index 88324ee..c738a26 100644
--- a/src/systemclipboard/ksystemclipboard.cpp
+++ b/src/systemclipboard/ksystemclipboard.cpp
@@ -53,6 +53,40 @@ QString KSystemClipboard::text(QClipboard::Mode mode)
     return QString();
 }
 
+bool KSystemClipboard::ownsSelection() const
+{
+    // This is a fake virtual, but we're limited due to ABI concerns.
+    // In hindsight I should have added a facade
+#ifdef WITH_WAYLAND
+    if (const auto waylandClipboard = qobject_cast<const WaylandClipboard *>(this)) {
+        return waylandClipboard->ownsSelection();
+    }
+    if (const auto wlrWaylandClipboard = qobject_cast<const WlrWaylandClipboard *>(this)) {
+        return wlrWaylandClipboard->ownsSelection();
+    }
+#endif
+    if (const auto qtClipboard = qobject_cast<const QtClipboard *>(this)) {
+        return qtClipboard->ownsSelection();
+    }
+    return false;
+}
+
+bool KSystemClipboard::ownsClipboard() const
+{
+#ifdef WITH_WAYLAND
+    if (const auto waylandClipboard = qobject_cast<const WaylandClipboard *>(this)) {
+        return waylandClipboard->ownsClipboard();
+    }
+    if (const auto wlrWaylandClipboard = qobject_cast<const WlrWaylandClipboard *>(this)) {
+        return wlrWaylandClipboard->ownsClipboard();
+    }
+#endif
+    if (const auto qtClipboard = qobject_cast<const QtClipboard *>(this)) {
+        return qtClipboard->ownsClipboard();
+    }
+    return false;
+}
+
 KSystemClipboard::KSystemClipboard(QObject *parent)
     : QObject(parent)
 {
diff --git a/src/systemclipboard/ksystemclipboard.h b/src/systemclipboard/ksystemclipboard.h
index eaae134..7894c1b 100644
--- a/src/systemclipboard/ksystemclipboard.h
+++ b/src/systemclipboard/ksystemclipboard.h
@@ -54,6 +54,14 @@ public:
      * Similar to QClipboard::text(QClipboard::Mode mode)
      */
     QString text(QClipboard::Mode mode);
+    /*!
+     * Returns true if this process owns the current primary selection.
+     */
+    bool ownsSelection() const;
+    /*!
+     * Returns true if this process owns the current clipboard selection.
+     */
+    bool ownsClipboard() const;
 Q_SIGNALS:
     /*!
      * Emitted when the clipboard changes similar to QClipboard::changed
diff --git a/src/systemclipboard/qtclipboard.cpp b/src/systemclipboard/qtclipboard.cpp
index 1501794..a0ef4de 100644
--- a/src/systemclipboard/qtclipboard.cpp
+++ b/src/systemclipboard/qtclipboard.cpp
@@ -29,3 +29,13 @@ const QMimeData *QtClipboard::mimeData(QClipboard::Mode mode) const
 {
     return qGuiApp->clipboard()->mimeData(mode);
 }
+
+bool QtClipboard::ownsSelection() const
+{
+    return qGuiApp->clipboard()->ownsSelection();
+}
+
+bool QtClipboard::ownsClipboard() const
+{
+    return qGuiApp->clipboard()->ownsClipboard();
+}
diff --git a/src/systemclipboard/qtclipboard_p.h b/src/systemclipboard/qtclipboard_p.h
index ae06a10..f583b5b 100644
--- a/src/systemclipboard/qtclipboard_p.h
+++ b/src/systemclipboard/qtclipboard_p.h
@@ -11,11 +11,14 @@
 
 class QtClipboard : public KSystemClipboard
 {
+    Q_OBJECT
 public:
     explicit QtClipboard(QObject *parent);
     void setMimeData(QMimeData *mime, QClipboard::Mode mode) override;
     void clear(QClipboard::Mode mode) override;
     const QMimeData *mimeData(QClipboard::Mode mode) const override;
+    bool ownsSelection() const;
+    bool ownsClipboard() const;
 };
 
 #endif
diff --git a/src/systemclipboard/waylandclipboard.cpp b/src/systemclipboard/waylandclipboard.cpp
index 28f3c79..5868a1c 100644
--- a/src/systemclipboard/waylandclipboard.cpp
+++ b/src/systemclipboard/waylandclipboard.cpp
@@ -731,5 +731,15 @@ const QMimeData *WaylandClipboard::mimeData(QClipboard::Mode mode) const
     return nullptr;
 }
 
+bool WaylandClipboard::ownsSelection() const
+{
+    return m_device && m_device->primarySelection();
+}
+
+bool WaylandClipboard::ownsClipboard() const
+{
+    return m_device && m_device->selection();
+}
+
 #include "moc_waylandclipboard_p.cpp"
 #include "waylandclipboard.moc"
diff --git a/src/systemclipboard/waylandclipboard_p.h b/src/systemclipboard/waylandclipboard_p.h
index 6aecd76..51f98d4 100644
--- a/src/systemclipboard/waylandclipboard_p.h
+++ b/src/systemclipboard/waylandclipboard_p.h
@@ -24,6 +24,8 @@ public:
     void setMimeData(QMimeData *mime, QClipboard::Mode mode) override;
     void clear(QClipboard::Mode mode) override;
     const QMimeData *mimeData(QClipboard::Mode mode) const override;
+    bool ownsSelection() const;
+    bool ownsClipboard() const;
 
     bool isValid();
 
diff --git a/src/systemclipboard/wlrwaylandclipboard.cpp b/src/systemclipboard/wlrwaylandclipboard.cpp
index 43db0ae..d257022 100644
--- a/src/systemclipboard/wlrwaylandclipboard.cpp
+++ b/src/systemclipboard/wlrwaylandclipboard.cpp
@@ -726,4 +726,20 @@ const QMimeData *WlrWaylandClipboard::mimeData(QClipboard::Mode mode) const
     return nullptr;
 }
 
+bool WlrWaylandClipboard::ownsSelection() const
+{
+    if (!m_device) {
+        return false;
+    }
+    return m_device->primarySelection();
+}
+
+bool WlrWaylandClipboard::ownsClipboard() const
+{
+    if (!m_device) {
+        return false;
+    }
+    return m_device->selection();
+}
+
 #include "wlrwaylandclipboard.moc"
diff --git a/src/systemclipboard/wlrwaylandclipboard_p.h b/src/systemclipboard/wlrwaylandclipboard_p.h
index 761dd41..76b839b 100644
--- a/src/systemclipboard/wlrwaylandclipboard_p.h
+++ b/src/systemclipboard/wlrwaylandclipboard_p.h
@@ -17,12 +17,15 @@ class WlrKeyboardFocusWatcher;
 
 class WlrWaylandClipboard : public KSystemClipboard
 {
+    Q_OBJECT
 public:
     ~WlrWaylandClipboard();
     static WlrWaylandClipboard *create(QObject *parent);
     void setMimeData(QMimeData *mime, QClipboard::Mode mode) override;
     void clear(QClipboard::Mode mode) override;
     const QMimeData *mimeData(QClipboard::Mode mode) const override;
+    bool ownsSelection() const;
+    bool ownsClipboard() const;
 
     bool isValid();
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.