File indexing completed on 2025-04-20 04:33:18
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"