[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();