summaryrefslogtreecommitdiff
path: root/dtrans/source/win32/clipb/WinClipbImpl.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'dtrans/source/win32/clipb/WinClipbImpl.cxx')
-rw-r--r--dtrans/source/win32/clipb/WinClipbImpl.cxx12
1 files changed, 12 insertions, 0 deletions
diff --git a/dtrans/source/win32/clipb/WinClipbImpl.cxx b/dtrans/source/win32/clipb/WinClipbImpl.cxx
index 003a266f84bc..8d59be7ca430 100644
--- a/dtrans/source/win32/clipb/WinClipbImpl.cxx
+++ b/dtrans/source/win32/clipb/WinClipbImpl.cxx
@@ -83,6 +83,10 @@ Reference< XTransferable > CWinClipbImpl::getContents( )
return m_pCurrentClipContent->m_XTransferable;
}
+ // Content cached?
+ if (m_foreignContent.is())
+ return m_foreignContent;
+
// release the mutex, so that the variable may be
// changed by other threads
}
@@ -101,6 +105,9 @@ Reference< XTransferable > CWinClipbImpl::getContents( )
// remember pIDo destroys itself due to the smart pointer
rClipContent = CDOTransferable::create( m_pWinClipboard->m_xContext, pIDo );
+
+ MutexGuard aGuard(m_ClipContentMutex);
+ m_foreignContent = rClipContent;
}
return rClipContent;
@@ -117,6 +124,8 @@ void CWinClipbImpl::setContents(
{
MutexGuard aGuard(m_ClipContentMutex);
+ m_foreignContent.clear();
+
m_pCurrentClipContent
= new CXNotifyingDataObject(CDTransObjFactory::createDataObjFromTransferable(
m_pWinClipboard->m_xContext, xTransferable),
@@ -176,7 +185,10 @@ void WINAPI CWinClipbImpl::onClipboardContentChanged()
// reassociation to instance through static member
if ( nullptr != s_pCWinClipbImpl )
+ {
+ s_pCWinClipbImpl->m_foreignContent.clear();
s_pCWinClipbImpl->m_pWinClipboard->notifyAllClipboardListener( );
+ }
}
void CWinClipbImpl::onReleaseDataObject( CXNotifyingDataObject* theCaller )