diff options
author | Caolán McNamara <caolanm@redhat.com> | 2016-09-01 15:50:20 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2016-09-20 11:36:32 +0100 |
commit | 8a382d4ad190cf07cbd6b1fd6b903975134b0cf1 (patch) | |
tree | a56cff8e360685f2243f906280ef04834a737a9b /vcl | |
parent | 3e826f8897170caee4b8a51a8346c71cb767984d (diff) |
Related: rhbz#1362451 avoid recursive ownerchanged handling during ownerchange
Change-Id: Id9c12b7ce6458348890d7c7ff7fdb2cd37c4601c
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/unx/gtk3/gtk3gtkinst.cxx | 55 |
1 files changed, 32 insertions, 23 deletions
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx index 7c04b1d42a4d..7148882c1796 100644 --- a/vcl/unx/gtk3/gtk3gtkinst.cxx +++ b/vcl/unx/gtk3/gtk3gtkinst.cxx @@ -364,6 +364,29 @@ namespace } } +namespace +{ + void ClipboardGetFunc(GtkClipboard *clipboard, GtkSelectionData *selection_data, + guint info, + gpointer user_data_or_owner) + { + VclGtkClipboard* pThis = static_cast<VclGtkClipboard*>(user_data_or_owner); + pThis->ClipboardGet(clipboard, selection_data, info); + } + + void ClipboardClearFunc(GtkClipboard *clipboard, gpointer user_data_or_owner) + { + VclGtkClipboard* pThis = static_cast<VclGtkClipboard*>(user_data_or_owner); + pThis->ClipboardClear(clipboard); + } + + void handle_owner_change(GtkClipboard *clipboard, GdkEvent *event, gpointer user_data) + { + VclGtkClipboard* pThis = static_cast<VclGtkClipboard*>(user_data); + pThis->OwnerPossiblyChanged(clipboard, event); + } +} + void VclGtkClipboard::OwnerPossiblyChanged(GtkClipboard* clipboard, GdkEvent* /*event*/) { if (!m_aContents.is()) @@ -376,6 +399,10 @@ void VclGtkClipboard::OwnerPossiblyChanged(GtkClipboard* clipboard, GdkEvent* /* //our pid, in which case it's us. bool bSelf = false; + //disconnect and reconnect after gtk_clipboard_wait_for_targets to + //avoid possible recursion + g_signal_handler_disconnect(clipboard, m_nOwnerChangedSignalId); + OString sTunnel = "application/x-libreoffice-internal-id-" + getPID(); GdkAtom *targets; gint n_targets; @@ -394,6 +421,9 @@ void VclGtkClipboard::OwnerPossiblyChanged(GtkClipboard* clipboard, GdkEvent* /* g_free(targets); } + m_nOwnerChangedSignalId = g_signal_connect(clipboard, "owner-change", + G_CALLBACK(handle_owner_change), this); + if (!bSelf) { //null out m_aContents to return control to the system-one which @@ -486,29 +516,6 @@ void VclToGtkHelper::setSelectionData(const Reference<css::datatransfer::XTransf aData.getLength()); } -namespace -{ - void ClipboardGetFunc(GtkClipboard *clipboard, GtkSelectionData *selection_data, - guint info, - gpointer user_data_or_owner) - { - VclGtkClipboard* pThis = static_cast<VclGtkClipboard*>(user_data_or_owner); - pThis->ClipboardGet(clipboard, selection_data, info); - } - - void ClipboardClearFunc(GtkClipboard *clipboard, gpointer user_data_or_owner) - { - VclGtkClipboard* pThis = static_cast<VclGtkClipboard*>(user_data_or_owner); - pThis->ClipboardClear(clipboard); - } - - void handle_owner_change(GtkClipboard *clipboard, GdkEvent *event, gpointer user_data) - { - VclGtkClipboard* pThis = static_cast<VclGtkClipboard*>(user_data); - pThis->OwnerPossiblyChanged(clipboard, event); - } -} - VclGtkClipboard::VclGtkClipboard(GdkAtom nSelection) : cppu::WeakComponentImplHelper<datatransfer::clipboard::XSystemClipboard, datatransfer::clipboard::XFlushableClipboard, XServiceInfo> @@ -539,6 +546,7 @@ VclGtkClipboard::~VclGtkClipboard() if (!m_aGtkTargets.empty()) { gtk_clipboard_clear(clipboard); + ClipboardClear(clipboard); } assert(m_aGtkTargets.empty()); } @@ -602,6 +610,7 @@ void VclGtkClipboard::setContents( if (!m_aGtkTargets.empty()) { gtk_clipboard_clear(clipboard); + ClipboardClear(clipboard); } assert(m_aGtkTargets.empty()); if (m_aContents.is()) |