[Libreoffice-commits] core.git: vcl/unx

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Thu Oct 7 13:25:02 UTC 2021


 vcl/unx/gtk3/gtkinst.cxx |  127 ++++++++++++++++++++++++++---------------------
 1 file changed, 71 insertions(+), 56 deletions(-)

New commits:
commit 02f8dba5df5296c3b8c5d6aab46bea53235314fb
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Thu Oct 7 11:56:29 2021 +0100
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Thu Oct 7 15:24:28 2021 +0200

    fix "gtk_bin_remove: assertion 'priv->child == child' failed" warning
    
    on closing a document from tdf#141633 with a combobox in the tableform.
    
    So remove the mouse event widget before we remove the combobox
    replacement
    
    Change-Id: I95395ba60bb5fe7cf0b6e25176d0556c6bcc6611
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/123210
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 762870b912ac..3cd60a2777a6 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -2714,6 +2714,74 @@ protected:
         }
     }
 
+    void DisconnectMouseEvents()
+    {
+        if (m_nButtonPressSignalId)
+        {
+#if GTK_CHECK_VERSION(4, 0, 0)
+            g_signal_handler_disconnect(get_click_controller(), m_nButtonPressSignalId);
+#else
+            g_signal_handler_disconnect(m_pMouseEventBox, m_nButtonPressSignalId);
+#endif
+            m_nButtonPressSignalId = 0;
+        }
+        if (m_nMotionSignalId)
+        {
+#if GTK_CHECK_VERSION(4, 0, 0)
+            g_signal_handler_disconnect(get_motion_controller(), m_nMotionSignalId);
+#else
+            g_signal_handler_disconnect(m_pMouseEventBox, m_nMotionSignalId);
+#endif
+            m_nMotionSignalId = 0;
+        }
+        if (m_nLeaveSignalId)
+        {
+#if GTK_CHECK_VERSION(4, 0, 0)
+            g_signal_handler_disconnect(get_motion_controller(), m_nLeaveSignalId);
+#else
+            g_signal_handler_disconnect(m_pMouseEventBox, m_nLeaveSignalId);
+#endif
+            m_nLeaveSignalId = 0;
+        }
+        if (m_nEnterSignalId)
+        {
+#if GTK_CHECK_VERSION(4, 0, 0)
+            g_signal_handler_disconnect(get_motion_controller(), m_nEnterSignalId);
+#else
+            g_signal_handler_disconnect(m_pMouseEventBox, m_nEnterSignalId);
+#endif
+            m_nEnterSignalId = 0;
+        }
+        if (m_nButtonReleaseSignalId)
+        {
+#if GTK_CHECK_VERSION(4, 0, 0)
+            g_signal_handler_disconnect(get_click_controller(), m_nButtonReleaseSignalId);
+#else
+            g_signal_handler_disconnect(m_pMouseEventBox, m_nButtonReleaseSignalId);
+#endif
+            m_nButtonReleaseSignalId = 0;
+        }
+
+#if !GTK_CHECK_VERSION(4, 0, 0)
+        if (m_pMouseEventBox && m_pMouseEventBox != m_pWidget)
+        {
+            // put things back they way we found them
+            GtkWidget* pParent = gtk_widget_get_parent(m_pMouseEventBox);
+
+            g_object_ref(m_pWidget);
+            gtk_container_remove(GTK_CONTAINER(m_pMouseEventBox), m_pWidget);
+
+            gtk_widget_destroy(m_pMouseEventBox);
+
+            gtk_container_add(GTK_CONTAINER(pParent), m_pWidget);
+            // coverity[freed_arg : FALSE] - this does not free m_pWidget, it is reffed by pParent
+            g_object_unref(m_pWidget);
+
+            m_pMouseEventBox = m_pWidget;
+        }
+#endif
+    }
+
 private:
     bool m_bTakeOwnership;
 #if !GTK_CHECK_VERSION(4, 0, 0)
@@ -4164,46 +4232,6 @@ public:
             g_signal_handler_disconnect(m_pWidget, m_nKeyReleaseSignalId);
 #endif
         }
-        if (m_nButtonPressSignalId)
-        {
-#if GTK_CHECK_VERSION(4, 0, 0)
-            g_signal_handler_disconnect(get_click_controller(), m_nButtonPressSignalId);
-#else
-            g_signal_handler_disconnect(m_pMouseEventBox, m_nButtonPressSignalId);
-#endif
-        }
-        if (m_nMotionSignalId)
-        {
-#if GTK_CHECK_VERSION(4, 0, 0)
-            g_signal_handler_disconnect(get_motion_controller(), m_nMotionSignalId);
-#else
-            g_signal_handler_disconnect(m_pMouseEventBox, m_nMotionSignalId);
-#endif
-        }
-        if (m_nLeaveSignalId)
-        {
-#if GTK_CHECK_VERSION(4, 0, 0)
-            g_signal_handler_disconnect(get_motion_controller(), m_nLeaveSignalId);
-#else
-            g_signal_handler_disconnect(m_pMouseEventBox, m_nLeaveSignalId);
-#endif
-        }
-        if (m_nEnterSignalId)
-        {
-#if GTK_CHECK_VERSION(4, 0, 0)
-            g_signal_handler_disconnect(get_motion_controller(), m_nEnterSignalId);
-#else
-            g_signal_handler_disconnect(m_pMouseEventBox, m_nEnterSignalId);
-#endif
-        }
-        if (m_nButtonReleaseSignalId)
-        {
-#if GTK_CHECK_VERSION(4, 0, 0)
-            g_signal_handler_disconnect(get_click_controller(), m_nButtonReleaseSignalId);
-#else
-            g_signal_handler_disconnect(m_pMouseEventBox, m_nButtonReleaseSignalId);
-#endif
-        }
 
         if (m_nFocusInSignalId)
         {
@@ -4228,22 +4256,7 @@ public:
 
         do_set_background(COL_AUTO);
 
-#if !GTK_CHECK_VERSION(4, 0, 0)
-        if (m_pMouseEventBox && m_pMouseEventBox != m_pWidget)
-        {
-            // put things back they way we found them
-            GtkWidget* pParent = gtk_widget_get_parent(m_pMouseEventBox);
-
-            g_object_ref(m_pWidget);
-            gtk_container_remove(GTK_CONTAINER(m_pMouseEventBox), m_pWidget);
-
-            gtk_widget_destroy(m_pMouseEventBox);
-
-            gtk_container_add(GTK_CONTAINER(pParent), m_pWidget);
-            // coverity[freed_arg : FALSE] - this does not free m_pWidget, it is reffed by pParent
-            g_object_unref(m_pWidget);
-        }
-#endif
+        DisconnectMouseEvents();
 
         if (m_bTakeOwnership)
         {
@@ -21183,6 +21196,8 @@ public:
         // restore original hierarchy in dtor so a new GtkInstanceComboBox will
         // result in the same layout each time
         {
+            DisconnectMouseEvents();
+
             g_object_ref(m_pComboBox);
 
             GtkContainer* pContainer = getContainer();


More information about the Libreoffice-commits mailing list