void ClipboardMonitor::checkClipboard(QClipboard::Mode mode) { #ifdef COPYQ_WS_X11 if ( m_x11->isSynchronizing() ) return; m_x11->synchronizeNone(); #endif // Check clipboard after interval because someone is updating it very quickly. bool needToWait = m_updateTimer->isActive(); if (mode == QClipboard::Clipboard) m_needCheckClipboard = needToWait; #ifdef COPYQ_WS_X11 else if (mode == QClipboard::Selection) m_needCheckSelection = needToWait; #endif m_updateTimer->start(); if (needToWait) return; COPYQ_LOG( QString("Checking for new %1 content.") .arg(mode == QClipboard::Clipboard ? "clipboard" : "selection") ); #ifdef COPYQ_WS_X11 if (mode == QClipboard::Clipboard) { if ( QApplication::clipboard()->ownsClipboard() ) return; } else if (mode == QClipboard::Selection) { if ( (!m_checksel && !m_copysel) || QApplication::clipboard()->ownsSelection() || !updateSelection(false) ) { return; } } else { return; } #else /* !COPYQ_WS_X11 */ // check if clipboard data are needed if (mode != QClipboard::Clipboard || QApplication::clipboard()->ownsClipboard()) return; #endif // get clipboard data const QMimeData *data = clipboardData(mode); // data retrieved? if (!data) { log( tr("Cannot access clipboard data!"), LogError ); return; } // clone only mime types defined by user QMimeData *data2 = cloneData(*data, &m_formats); // any data found? if ( data2->formats().isEmpty() ) { delete data2; return; } // add window title of clipboard owner PlatformPtr platform = createPlatformNativeInterface(); data2->setData( QString(mimeWindowTitle), platform->getWindowTitle(platform->getCurrentWindow()).toUtf8() ); #ifdef COPYQ_WS_X11 if (mode == QClipboard::Clipboard) { if (m_copyclip) m_x11->synchronize(data2, QClipboard::Selection); clipboardChanged(mode, data2); } else { if (m_copysel) m_x11->synchronize(data2, QClipboard::Clipboard); if (m_checksel) clipboardChanged(mode, data2); else delete data2; } #else /* !COPYQ_WS_X11 */ clipboardChanged(mode, data2); #endif }
void ClipboardMonitor::checkClipboard(QClipboard::Mode mode) { #ifdef COPYQ_WS_X11 m_x11->cancelSynchronization(); #endif // Check clipboard after interval because someone is updating it very quickly. bool needToWait = m_updateTimer->isActive(); if (mode == QClipboard::Clipboard) m_needCheckClipboard = needToWait; #ifdef COPYQ_WS_X11 else if (mode == QClipboard::Selection) m_needCheckSelection = needToWait; #endif else return; m_updateTimer->start(); if (needToWait) return; #ifdef COPYQ_WS_X11 if ( mode == QClipboard::Selection && m_x11->isSelectionIncomplete() ) return; if ( m_x11->maybeResetClipboard(mode) ) return; #endif COPYQ_LOG( QString("Checking for new %1 content.") .arg(mode == QClipboard::Clipboard ? "clipboard" : "selection") ); // get clipboard data const QMimeData *data = clipboardData(mode); // data retrieved? if (!data) { log( tr("Cannot access clipboard data!"), LogError ); return; } // clone only mime types defined by user #if defined(Q_OS_MAC) // On OS X, when you copy files in Finder, etc. you get: // - The file name(s) (not paths) as plain text // - The file URI(s) // - The icon (not thumbnail) for the type of item you have in various image formants // We really only want the URI list, so throw the rest away QStringList formats = m_formats; if (data->formats().contains(mimeUriList) && formats.contains(mimeUriList)) { formats = QStringList() << mimeUriList; } QVariantMap data2( cloneData(*data, formats) ); #else QVariantMap data2( cloneData(*data, m_formats) ); #endif // add window title of clipboard owner if ( !data2.contains(mimeOwner) && !data2.contains(mimeWindowTitle) ) { PlatformPtr platform = createPlatformNativeInterface(); PlatformWindowPtr currentWindow = platform->getCurrentWindow(); if (currentWindow) data2.insert( mimeWindowTitle, currentWindow->getTitle().toUtf8() ); } #ifdef COPYQ_WS_X11 m_x11->setData(mode, data2); if (mode == QClipboard::Clipboard) { if ( !ownsClipboardData(data2) && m_x11->synchronize(QClipboard::Selection) ) m_needCheckSelection = false; clipboardChanged(data2); } else { data2.insert(mimeClipboardMode, "selection"); if ( !ownsClipboardData(data2) && m_x11->synchronize(QClipboard::Clipboard) ) m_needCheckClipboard = false; if ( m_x11->hasCheckSelection() ) clipboardChanged(data2); } #else /* !COPYQ_WS_X11 */ clipboardChanged(data2); #endif }
void ClipboardMonitor::onClipboardChanged(ClipboardMode mode) { QVariantMap data = m_clipboard->data(mode, m_formats); auto clipboardData = mode == ClipboardMode::Clipboard ? &m_clipboardData : &m_selectionData; if ( hasSameData(data, *clipboardData) ) { COPYQ_LOG( QString("Ignoring unchanged %1") .arg(mode == ClipboardMode::Clipboard ? "clipboard" : "selection") ); return; } *clipboardData = data; COPYQ_LOG( QString("%1 changed, owner is \"%2\"") .arg(mode == ClipboardMode::Clipboard ? "Clipboard" : "Selection", getTextData(data, mimeOwner)) ); if (mode != ClipboardMode::Clipboard) { const QString modeName = mode == ClipboardMode::Selection ? "selection" : "find buffer"; data.insert(mimeClipboardMode, modeName); } // add window title of clipboard owner if ( !data.contains(mimeOwner) && !data.contains(mimeWindowTitle) ) { PlatformPtr platform = createPlatformNativeInterface(); PlatformWindowPtr currentWindow = platform->getCurrentWindow(); if (currentWindow) data.insert( mimeWindowTitle, currentWindow->getTitle().toUtf8() ); } #ifdef HAS_MOUSE_SELECTIONS if ( (mode == ClipboardMode::Clipboard ? m_clipboardToSelection : m_selectionToClipboard) && !data.contains(mimeOwner) ) { const auto text = getTextData(data); if ( !text.isEmpty() ) { const auto targetData = mode == ClipboardMode::Clipboard ? &m_selectionData : &m_clipboardData; const auto targetText = getTextData(*targetData); emit synchronizeSelection(mode, text, qHash(targetText)); } } #endif // run automatic commands if ( anySessionOwnsClipboardData(data) ) { emit clipboardChanged(data, ClipboardOwnership::Own); } else if ( isClipboardDataHidden(data) ) { emit clipboardChanged(data, ClipboardOwnership::Hidden); } else { const auto defaultTab = m_clipboardTab.isEmpty() ? defaultClipboardTabName() : m_clipboardTab; setTextData(&data, defaultTab, mimeCurrentTab); #ifdef HAS_MOUSE_SELECTIONS if (mode == ClipboardMode::Clipboard ? m_storeClipboard : m_storeSelection) { #else if (m_storeClipboard) { #endif setTextData(&data, m_clipboardTab, mimeOutputTab); } emit clipboardChanged(data, ClipboardOwnership::Foreign); } }