Skip to content

Commit

Permalink
Fix behavior for waiting on clipboard change
Browse files Browse the repository at this point in the history
  • Loading branch information
hluk committed Feb 24, 2025
1 parent ab2c6bc commit 6e059f7
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 14 deletions.
19 changes: 11 additions & 8 deletions src/gui/clipboardspy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ ClipboardSpy::ClipboardSpy(ClipboardMode mode, const QByteArray &owner)
mode == ClipboardMode::Clipboard ? ClipboardMode::Selection : ClipboardMode::Clipboard,
false);

connect(m_clipboard.get(), &PlatformClipboard::changed, this, &ClipboardSpy::check);
connect(m_clipboard.get(), &PlatformClipboard::changed, this, &ClipboardSpy::emitChangeIfChanged);
m_clipboard->startMonitoring( QStringList(mimeOwner) );
}

Expand All @@ -44,18 +44,20 @@ void ClipboardSpy::wait(int ms, int checkIntervalMs)

QTimer timerCheck;
timerCheck.setInterval(checkIntervalMs);
connect( &timerCheck, &QTimer::timeout, this, &ClipboardSpy::check );
connect( &timerCheck, &QTimer::timeout, this, &ClipboardSpy::emitChangeIfChanged );
timerCheck.start();

loop.exec();
}

bool ClipboardSpy::setClipboardData(const QVariantMap &data)
{
m_settingClipboard = true;
m_oldOwnerData = currentOwnerData();
m_clipboard->setData(m_mode, data);
wait();
m_oldOwnerData = data.value(mimeOwner).toByteArray();
m_settingClipboard = false;
return m_oldOwnerData == currentOwnerData();
}

Expand All @@ -69,11 +71,12 @@ void ClipboardSpy::stop()
emit stopped();
}

bool ClipboardSpy::check()
void ClipboardSpy::emitChangeIfChanged()
{
if (!m_oldOwnerData.isEmpty() && m_oldOwnerData == currentOwnerData())
return false;

emit changed();
return true;
const auto newOwner = currentOwnerData();
if (m_oldOwnerData != newOwner) {
emit changed();
} else if (!m_settingClipboard && m_oldOwnerData.isEmpty() && newOwner.isEmpty()) {
emit changed();
}
}
3 changes: 2 additions & 1 deletion src/gui/clipboardspy.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,12 @@ class ClipboardSpy final : public QObject
void stopped();

private:
bool check();
void emitChangeIfChanged();

ClipboardMode m_mode;
PlatformClipboardPtr m_clipboard;
QByteArray m_oldOwnerData;
bool m_settingClipboard = false;
};

#endif // CLIPBOARDSPY_H
9 changes: 4 additions & 5 deletions src/platform/x11/x11platformclipboard.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,10 @@ void X11PlatformClipboard::updateClipboardData(X11PlatformClipboard::ClipboardDa

void X11PlatformClipboard::useNewClipboardData(X11PlatformClipboard::ClipboardData *clipboardData)
{
COPYQ_LOG( QStringLiteral("%1 CHANGED, owner=%2")
.arg(clipboardData->mode == ClipboardMode::Clipboard ? "Clipboard" : "Selection")
.arg(clipboardData->newOwner) );

clipboardData->data = clipboardData->newData;
clipboardData->owner = clipboardData->newOwner;
clipboardData->timerEmitChange.stop();
Expand All @@ -331,9 +335,4 @@ void X11PlatformClipboard::checkAgainLater(bool clipboardChanged, int interval)
m_timerCheckAgain.start(interval);
else if (clipboardChanged)
m_timerCheckAgain.start(maxCheckAgainIntervalMs);

if (m_clipboardData.timerEmitChange.isActive())
COPYQ_LOG( QStringLiteral("Clipboard CHANGED, owner: '%1'").arg(m_clipboardData.newOwner) );
if (m_selectionData.timerEmitChange.isActive())
COPYQ_LOG( QStringLiteral("Selection CHANGED, owner: '%1'").arg(m_selectionData.newOwner) );
}

0 comments on commit 6e059f7

Please sign in to comment.