vcl/unx/gtk3/gtk3gtkinst.cxx | 60 +++++++++++++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 16 deletions(-)
New commits: commit 85622e6cf676e507dea8845b5637f3a1df327490 Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Thu Nov 12 12:35:07 2020 +0000 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Fri Nov 13 10:08:14 2020 +0100 tdf#138047 wait until map to disable the parent SalFrame tab-cycling because the original parent is changed before the popup appears and the wrong SalFrame is affected Change-Id: I4dbf50c6bac063b7730f5b6c0f388b4983e0866c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105735 Tested-by: Caolán McNamara <caol...@redhat.com> Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx index 23bd3f34d205..3105a4e3056b 100644 --- a/vcl/unx/gtk3/gtk3gtkinst.cxx +++ b/vcl/unx/gtk3/gtk3gtkinst.cxx @@ -16497,6 +16497,47 @@ private: GtkInstanceBuilder* pThis = static_cast<GtkInstanceBuilder*>(user_data); pThis->postprocess_widget(GTK_WIDGET(pObject)); } + + void DisallowCycleFocusOut() + { + assert(!m_bAllowCycleFocusOut); // we only expect this to be called when this holds + + GtkWidget* pTopLevel = gtk_widget_get_toplevel(m_pParentWidget); + assert(pTopLevel); + GtkSalFrame* pFrame = GtkSalFrame::getFromWindow(pTopLevel); + assert(pFrame); + // unhook handler and let gtk cycle its own way through this widget's + // children because it has no non-gtk siblings + pFrame->DisallowCycleFocusOut(); + } + + static void signalMap(GtkWidget*, gpointer user_data) + { + GtkInstanceBuilder* pThis = static_cast<GtkInstanceBuilder*>(user_data); + // tdf#138047 wait until map to do this because the final SalFrame may + // not be the same as at ctor time + pThis->DisallowCycleFocusOut(); + } + + void AllowCycleFocusOut() + { + assert(!m_bAllowCycleFocusOut); // we only expect this to be called when this holds + + GtkWidget* pTopLevel = gtk_widget_get_toplevel(m_pParentWidget); + assert(pTopLevel); + GtkSalFrame* pFrame = GtkSalFrame::getFromWindow(pTopLevel); + assert(pFrame); + // rehook handler and let vcl cycle its own way through this widget's + // children + pFrame->AllowCycleFocusOut(); + } + + static void signalUnmap(GtkWidget*, gpointer user_data) + { + GtkInstanceBuilder* pThis = static_cast<GtkInstanceBuilder*>(user_data); + pThis->AllowCycleFocusOut(); + } + public: GtkInstanceBuilder(GtkWidget* pParent, const OUString& rUIRoot, const OUString& rUIFile, SystemChildWindow* pInterimGlue, bool bAllowCycleFocusOut) @@ -16540,13 +16581,8 @@ public: if (!m_bAllowCycleFocusOut) { - GtkWidget* pTopLevel = gtk_widget_get_toplevel(m_pParentWidget); - assert(pTopLevel); - GtkSalFrame* pFrame = GtkSalFrame::getFromWindow(pTopLevel); - assert(pFrame); - // unhook handler and let gtk cycle its own way through this widget's - // children because it has no non-gtk siblings - pFrame->DisallowCycleFocusOut(); + g_signal_connect(G_OBJECT(m_pParentWidget), "map", G_CALLBACK(signalMap), this); + g_signal_connect(G_OBJECT(m_pParentWidget), "unmap", G_CALLBACK(signalUnmap), this); } } } @@ -16610,15 +16646,7 @@ public: g_object_unref(m_pBuilder); if (m_xInterimGlue && !m_bAllowCycleFocusOut) - { - GtkWidget* pTopLevel = gtk_widget_get_toplevel(m_pParentWidget); - assert(pTopLevel); - GtkSalFrame* pFrame = GtkSalFrame::getFromWindow(pTopLevel); - assert(pFrame); - // rehook handler and let vcl cycle its own way through this widget's - // children - pFrame->AllowCycleFocusOut(); - } + AllowCycleFocusOut(); m_xInterimGlue.disposeAndClear(); } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits