File indexing completed on 2024-04-28 08:49:06

0001 /**
0002  * SPDX-FileCopyrightText: 2016 Albert Vaca <albertvaka@gmail.com>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005  */
0006 
0007 #include "clipboardlistener.h"
0008 
0009 #include <KSystemClipboard>
0010 
0011 #include <QDateTime>
0012 #include <QMimeData>
0013 
0014 QString ClipboardListener::currentContent()
0015 {
0016     return m_currentContent;
0017 }
0018 
0019 ClipboardListener::ClipboardContentType ClipboardListener::currentContentType()
0020 {
0021     return m_currentContentType;
0022 }
0023 
0024 qint64 ClipboardListener::updateTimestamp()
0025 {
0026     return m_updateTimestamp;
0027 }
0028 
0029 ClipboardListener *ClipboardListener::instance()
0030 {
0031     static ClipboardListener *me = nullptr;
0032     if (!me) {
0033         me = new ClipboardListener();
0034     }
0035     return me;
0036 }
0037 
0038 void ClipboardListener::refreshContent(const QString &content, ClipboardListener::ClipboardContentType contentType)
0039 {
0040     m_updateTimestamp = QDateTime::currentDateTime().toMSecsSinceEpoch();
0041     m_currentContent = content;
0042     m_currentContentType = contentType;
0043 }
0044 
0045 ClipboardListener::ClipboardListener()
0046     : clipboard(KSystemClipboard::instance())
0047 {
0048 #ifdef Q_OS_MAC
0049     connect(&m_clipboardMonitorTimer, &QTimer::timeout, this, [this]() {
0050         updateClipboard(QClipboard::Clipboard);
0051     });
0052     m_clipboardMonitorTimer.start(1000); // Refresh 1s
0053 #endif
0054     connect(clipboard, &KSystemClipboard::changed, this, &ClipboardListener::updateClipboard);
0055 }
0056 
0057 void ClipboardListener::updateClipboard(QClipboard::Mode mode)
0058 {
0059     if (mode != QClipboard::Clipboard) {
0060         return;
0061     }
0062 
0063     ClipboardListener::ClipboardContentType contentType = ClipboardListener::ClipboardContentTypeUnknown;
0064     if (clipboard->mimeData(mode) && clipboard->mimeData(mode)->data(QStringLiteral("x-kde-passwordManagerHint")) == QByteArrayLiteral("secret")) {
0065         contentType = ClipboardListener::ClipboardContentTypePassword;
0066     }
0067 
0068     const QString content = clipboard->text(QClipboard::Clipboard);
0069     if (content == m_currentContent && contentType == m_currentContentType) {
0070         return;
0071     }
0072     refreshContent(content, contentType);
0073     Q_EMIT clipboardChanged(content, contentType);
0074 }
0075 
0076 void ClipboardListener::setText(const QString &content)
0077 {
0078     refreshContent(content, ClipboardListener::ClipboardContentTypeUnknown);
0079     auto mime = new QMimeData;
0080     mime->setText(content);
0081     clipboard->setMimeData(mime, QClipboard::Clipboard);
0082 }
0083 
0084 #include "moc_clipboardlistener.cpp"