diff options
author | Caolán McNamara <caolanm@redhat.com> | 2016-07-08 14:50:56 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2016-07-08 14:53:32 +0100 |
commit | 84059c853f15e0e3b1433193e8136350869c23d7 (patch) | |
tree | 06dfaed7c48c16c68fcb151decfa0e24e8979333 /vcl/unx | |
parent | af8419fa1d3cea57481e0e53518237eea2d9cdad (diff) |
Resolves: rhbz#1352965 gtk3 infinite clipboard recursion with clipit installed
Change-Id: Ib67afaf532b8409e05fffbf1b8312d664460567d
Diffstat (limited to 'vcl/unx')
-rw-r--r-- | vcl/unx/gtk3/gtk3gtkinst.cxx | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx index 363de3d5d5af..b5db25d63819 100644 --- a/vcl/unx/gtk3/gtk3gtkinst.cxx +++ b/vcl/unx/gtk3/gtk3gtkinst.cxx @@ -587,6 +587,7 @@ void VclGtkClipboard::setContents( { osl::ClearableMutexGuard aGuard( m_aMutex ); Reference< datatransfer::clipboard::XClipboardOwner > xOldOwner( m_aOwner ); + bool bOwnerChange = (xOldOwner.is() && xOldOwner != xClipboardOwner); Reference< datatransfer::XTransferable > xOldContents( m_aContents ); m_aContents = xTrans; m_aOwner = xClipboardOwner; @@ -594,6 +595,10 @@ void VclGtkClipboard::setContents( std::list< Reference< datatransfer::clipboard::XClipboardListener > > aListeners( m_aListeners ); datatransfer::clipboard::ClipboardEvent aEv; + GtkClipboard* clipboard = gtk_clipboard_get(m_nSelection); + if (bOwnerChange) + gtk_clipboard_clear(clipboard); + assert(m_aGtkTargets.empty()); if (m_aContents.is()) { css::uno::Sequence<css::datatransfer::DataFlavor> aFormats = xTrans->getTransferDataFlavors(); @@ -607,15 +612,11 @@ void VclGtkClipboard::setContents( aEntry.info = 0; aGtkTargets.push_back(aEntry); - GtkClipboard* clipboard = gtk_clipboard_get(m_nSelection); gtk_clipboard_set_with_data(clipboard, aGtkTargets.data(), aGtkTargets.size(), ClipboardGetFunc, ClipboardClearFunc, this); gtk_clipboard_set_can_store(clipboard, aGtkTargets.data(), aGtkTargets.size()); } - for (auto &a : m_aGtkTargets) - g_free(a.target); - m_aGtkTargets = aGtkTargets; } @@ -623,7 +624,7 @@ void VclGtkClipboard::setContents( aGuard.clear(); - if( xOldOwner.is() && xOldOwner != xClipboardOwner ) + if (bOwnerChange) xOldOwner->lostOwnership( this, xOldContents ); for( std::list< Reference< datatransfer::clipboard::XClipboardListener > >::iterator it = aListeners.begin(); it != aListeners.end() ; ++it ) |