/////////////////////////////////////////////////////////////////////////////
-// Name: clipbrd.cpp
+// Name: src/msw/clipbrd.cpp
// Purpose: Clipboard functionality
// Author: Julian Smart
// Modified by:
#if wxUSE_CLIPBOARD
+#include "wx/clipbrd.h"
+
#ifndef WX_PRECOMP
#include "wx/object.h"
#include "wx/event.h"
#include "wx/bitmap.h"
#include "wx/utils.h"
#include "wx/intl.h"
+ #include "wx/log.h"
#endif
#if wxUSE_METAFILE
#include "wx/metafile.h"
#endif
-#include "wx/log.h"
-#include "wx/clipbrd.h"
#include <string.h>
wxOleInitialize();
#endif
- m_clearOnExit = false;
+ m_lastDataObject = NULL;
m_isOpened = false;
}
wxClipboard::~wxClipboard()
{
- if ( m_clearOnExit )
+ if ( m_lastDataObject )
{
Clear();
}
void wxClipboard::Clear()
{
#if wxUSE_OLE_CLIPBOARD
- HRESULT hr = OleSetClipboard(NULL);
+ if (m_lastDataObject)
+ {
+ // don't touch data set by other applications
+ HRESULT hr = OleIsCurrentClipboard(m_lastDataObject);
+ if (S_OK == hr)
+ {
+ hr = OleSetClipboard(NULL);
if ( FAILED(hr) )
{
wxLogApiError(wxT("OleSetClipboard(NULL)"), hr);
}
+ }
+ m_lastDataObject = NULL;
+ }
#endif // wxUSE_OLE_CLIPBOARD
}
bool wxClipboard::Flush()
{
#if wxUSE_OLE_CLIPBOARD
- HRESULT hr = OleFlushClipboard();
+ if (m_lastDataObject)
+ {
+ // don't touch data set by other applications
+ HRESULT hr = OleIsCurrentClipboard(m_lastDataObject);
+ m_lastDataObject = NULL;
+ if (S_OK == hr)
+ {
+ hr = OleFlushClipboard();
if ( FAILED(hr) )
{
wxLogApiError(wxT("OleFlushClipboard"), hr);
return false;
}
- else
- {
- m_clearOnExit = false;
-
return true;
}
+ }
+ return false;
#else // !wxUSE_OLE_CLIPBOARD
return false;
#endif // wxUSE_OLE_CLIPBOARD/!wxUSE_OLE_CLIPBOARD
return false;
}
+ // we have to call either OleSetClipboard(NULL) or OleFlushClipboard() when
+ // using OLE clipboard when the app terminates - by default, we call
+ // OleSetClipboard(NULL) which won't waste RAM, but the app can call
+ // wxClipboard::Flush() to change this
+ m_lastDataObject = data->GetInterface();
+
// we have a problem here because we should delete wxDataObject, but we
// can't do it because IDataObject which we just gave to the clipboard
// would try to use it when it will need the data. IDataObject is ref
// and tell it to delete wxDataObject when it is deleted itself.
data->SetAutoDelete();
- // we have to call either OleSetClipboard(NULL) or OleFlushClipboard() when
- // using OLE clipboard when the app terminates - by default, we call
- // OleSetClipboard(NULL) which won't waste RAM, but the app can call
- // wxClipboard::Flush() to chaneg this
- m_clearOnExit = true;
-
return true;
#elif wxUSE_DATAOBJ
wxCHECK_MSG( wxIsClipboardOpened(), false, wxT("clipboard not open") );
}
#endif // wxUSE_CLIPBOARD
-