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:
parent
28354d90fc
commit
c039fef565
@ -89,7 +89,7 @@ public:
|
||||
void UsePrimarySelection( bool WXUNUSED(primary) = false ) { }
|
||||
|
||||
private:
|
||||
bool m_clearOnExit;
|
||||
IDataObject *m_lastDataObject;
|
||||
bool m_isOpened;
|
||||
};
|
||||
|
||||
|
@ -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") );
|
||||
|
Loading…
Reference in New Issue
Block a user