tdf#138183 sync pending clipboard assign on clipboard ownership-change

Change-Id: I325add499fbd4d11a942ce550346dcbcb5343e4d
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105928
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index fb5227d..be37b2b 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -750,6 +750,7 @@ public:
    void ClipboardClear();
    void OwnerPossiblyChanged(GtkClipboard *clipboard);
    void SetGtkClipboard();
    void SyncGtkClipboard();
};

}
@@ -835,6 +836,7 @@ namespace

void VclGtkClipboard::OwnerPossiblyChanged(GtkClipboard* clipboard)
{
    SyncGtkClipboard(); // tdf#138183 do any pending SetGtkClipboard calls
    if (!m_aContents.is())
        return;

@@ -1049,6 +1051,17 @@ IMPL_LINK_NOARG(VclGtkClipboard, AsyncSetGtkClipboard, void*, void)
    SetGtkClipboard();
}

void VclGtkClipboard::SyncGtkClipboard()
{
    osl::ClearableMutexGuard aGuard(m_aMutex);
    if (m_pSetClipboardEvent)
    {
        Application::RemoveUserEvent(m_pSetClipboardEvent);
        m_pSetClipboardEvent = nullptr;
        SetGtkClipboard();
    }
}

void VclGtkClipboard::SetGtkClipboard()
{
    GtkClipboard* clipboard = gtk_clipboard_get(m_nSelection);