Skip to content

Commit 7a60ef7

Browse files
committed
core/qmlglobal: add clipboard support
1 parent 9295933 commit 7a60ef7

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

src/core/qmlglobal.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "qmlglobal.hpp"
22
#include <utility>
33

4+
#include <qclipboard.h>
45
#include <qcontainerfwd.h>
56
#include <qcoreapplication.h>
67
#include <qdir.h>
@@ -17,6 +18,7 @@
1718
#include <qtmetamacros.h>
1819
#include <qtypes.h>
1920
#include <qvariant.h>
21+
#include <qwindowdefs.h>
2022
#include <unistd.h>
2123

2224
#include "generation.hpp"
@@ -132,6 +134,13 @@ QuickshellGlobal::QuickshellGlobal(QObject* parent): QObject(parent) {
132134

133135
QObject::connect(QuickshellTracked::instance(), &QuickshellTracked::screensChanged, this, &QuickshellGlobal::screensChanged);
134136
// clang-format on
137+
138+
QObject::connect(
139+
static_cast<QGuiApplication*>(QGuiApplication::instance())->clipboard(), // NOLINT
140+
&QClipboard::changed,
141+
this,
142+
&QuickshellGlobal::onClipboardChanged
143+
);
135144
}
136145

137146
qint32 QuickshellGlobal::processId() const { // NOLINT
@@ -190,6 +199,20 @@ void QuickshellGlobal::setWatchFiles(bool watchFiles) { // NOLINT
190199
QuickshellSettings::instance()->setWatchFiles(watchFiles);
191200
}
192201

202+
QString QuickshellGlobal::clipboardText() {
203+
return static_cast<QGuiApplication*>(QGuiApplication::instance())->clipboard()->text(); // NOLINT
204+
}
205+
206+
void QuickshellGlobal::setClipboardText(const QString& text) {
207+
return static_cast<QGuiApplication*>(QGuiApplication::instance()) // NOLINT
208+
->clipboard()
209+
->setText(text);
210+
}
211+
212+
void QuickshellGlobal::onClipboardChanged(QClipboard::Mode mode) {
213+
if (mode == QClipboard::Clipboard) emit this->clipboardTextChanged();
214+
}
215+
193216
QString QuickshellGlobal::dataDir() const { // NOLINT
194217
return QsPaths::instance()->shellDataDir().path();
195218
}

src/core/qmlglobal.hpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#pragma once
22

3+
#include <qclipboard.h>
34
#include <qcontainerfwd.h>
45
#include <qjsengine.h>
56
#include <qobject.h>
@@ -10,6 +11,7 @@
1011
#include <qtmetamacros.h>
1112
#include <qtypes.h>
1213
#include <qvariant.h>
14+
#include <qwindowdefs.h>
1315

1416
#include "qmlscreen.hpp"
1517

@@ -108,6 +110,10 @@ class QuickshellGlobal: public QObject {
108110
/// If true then the configuration will be reloaded whenever any files change.
109111
/// Defaults to true.
110112
Q_PROPERTY(bool watchFiles READ watchFiles WRITE setWatchFiles NOTIFY watchFilesChanged);
113+
/// The system clipboard.
114+
///
115+
/// > [!WARNING] Under wayland the clipboard will be empty unless a quickshell window is focused.
116+
Q_PROPERTY(QString clipboardText READ clipboardText WRITE setClipboardText NOTIFY clipboardTextChanged);
111117
/// The per-shell data directory.
112118
///
113119
/// Usually `~/.local/share/quickshell/by-shell/<shell-id>`
@@ -176,6 +182,9 @@ class QuickshellGlobal: public QObject {
176182
[[nodiscard]] bool watchFiles() const;
177183
void setWatchFiles(bool watchFiles);
178184

185+
[[nodiscard]] static QString clipboardText();
186+
static void setClipboardText(const QString& text);
187+
179188
[[nodiscard]] QString dataDir() const;
180189
[[nodiscard]] QString stateDir() const;
181190
[[nodiscard]] QString cacheDir() const;
@@ -195,6 +204,10 @@ class QuickshellGlobal: public QObject {
195204
void screensChanged();
196205
void workingDirectoryChanged();
197206
void watchFilesChanged();
207+
void clipboardTextChanged();
208+
209+
private slots:
210+
void onClipboardChanged(QClipboard::Mode mode);
198211

199212
private:
200213
QuickshellGlobal(QObject* parent = nullptr);

0 commit comments

Comments
 (0)