void QWindowsClipboard::setMimeData(QMimeData *mimeData, QClipboard::Mode mode) { if (QWindowsContext::verboseOLE) qDebug() << __FUNCTION__ << mode << *mimeData; if (mode != QClipboard::Clipboard) return; const bool newData = !m_data || m_data->mimeData() != mimeData; if (newData) { releaseIData(); if (mimeData) m_data = new QWindowsOleDataObject(mimeData); } const HRESULT src = OleSetClipboard(m_data); if (src != S_OK) { QString mimeDataFormats = mimeData ? mimeData->formats().join(QStringLiteral(", ")) : QString(QStringLiteral("NULL")); qErrnoWarning("OleSetClipboard: Failed to set mime data (%s) on clipboard: %s", qPrintable(mimeDataFormats), QWindowsContext::comErrorString(src).constData()); releaseIData(); return; } }
~QClipboardData() { Q_ASSERT(clipBoardViewer->testAttribute(Qt::WA_WState_Created)); ChangeClipboardChain(clipBoardViewer->internalWinId(), nextClipboardViewer); delete clipBoardViewer; releaseIData(); }
bool QWindowsClipboard::clipboardViewerWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, LRESULT *result) { enum { wMClipboardUpdate = 0x031D }; *result = 0; if (QWindowsContext::verbose) qCDebug(lcQpaMime) << __FUNCTION__ << hwnd << message << QWindowsGuiEventDispatcher::windowsMessageName(message); switch (message) { case WM_CHANGECBCHAIN: { const HWND toBeRemoved = (HWND)wParam; if (toBeRemoved == m_nextClipboardViewer) { m_nextClipboardViewer = (HWND)lParam; } else { propagateClipboardMessage(message, wParam, lParam); } } return true; case wMClipboardUpdate: // Clipboard Format listener (Vista onwards) case WM_DRAWCLIPBOARD: { // Clipboard Viewer Chain handling (up to XP) const bool owned = ownsClipboard(); qCDebug(lcQpaMime) << "Clipboard changed owned " << owned; emitChanged(QClipboard::Clipboard); // clean up the clipboard object if we no longer own the clipboard if (!owned && m_data) releaseIData(); if (!m_formatListenerRegistered) propagateClipboardMessage(message, wParam, lParam); } return true; case WM_DESTROY: // Recommended shutdown if (ownsClipboard()) { qCDebug(lcQpaMime) << "Clipboard owner on shutdown, releasing."; OleFlushClipboard(); releaseIData(); } return true; } // switch (message) return false; }
bool QWindowsClipboard::clipboardViewerWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, LRESULT *result) { *result = 0; if (QWindowsContext::verboseOLE) qDebug("%s HWND=%p 0x%x %s", __FUNCTION__, hwnd, message, QWindowsGuiEventDispatcher::windowsMessageName(message)); switch (message) { case WM_CHANGECBCHAIN: { const HWND toBeRemoved = (HWND)wParam; if (toBeRemoved == m_nextClipboardViewer) { m_nextClipboardViewer = (HWND)lParam; } else { propagateClipboardMessage(message, wParam, lParam); } } return true; case WM_DRAWCLIPBOARD: { const bool owned = ownsClipboard(); if (QWindowsContext::verboseOLE) qDebug("Clipboard changed owned %d", owned); emitChanged(QClipboard::Clipboard); // clean up the clipboard object if we no longer own the clipboard if (!owned && m_data) releaseIData(); propagateClipboardMessage(message, wParam, lParam); } return true; case WM_DESTROY: // Recommended shutdown if (ownsClipboard()) { if (QWindowsContext::verboseOLE) qDebug("Clipboard owner on shutdown, releasing."); OleFlushClipboard(); releaseIData(); } return true; } // switch (message) return false; }
void QWindowsClipboard::cleanup() { unregisterViewer(); // Should release data if owner. releaseIData(); }
QWindowsClipboard::~QWindowsClipboard() { unregisterViewer(); // Should release data if owner. releaseIData(); QWindowsClipboard::m_instance = 0; }