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

Reply via email to