don't clear clipboard if it was changed by another application since we used it (patch 1436601)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@37935 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2006-03-09 13:59:31 +00:00
parent 28354d90fc
commit c039fef565
2 changed files with 29 additions and 15 deletions

View File

@ -89,7 +89,7 @@ public:
void UsePrimarySelection( bool WXUNUSED(primary) = false ) { }
private:
bool m_clearOnExit;
IDataObject *m_lastDataObject;
bool m_isOpened;
};

View File

@ -531,13 +531,13 @@ wxClipboard::wxClipboard()
wxOleInitialize();
#endif
m_clearOnExit = false;
m_lastDataObject = NULL;
m_isOpened = false;
}
wxClipboard::~wxClipboard()
{
if ( m_clearOnExit )
if ( m_lastDataObject )
{
Clear();
}
@ -550,30 +550,44 @@ wxClipboard::~wxClipboard()
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
@ -626,6 +640,12 @@ bool wxClipboard::AddData( wxDataObject *data )
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
@ -633,12 +653,6 @@ bool wxClipboard::AddData( wxDataObject *data )
// 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") );