[gtkmm/gtkmm-3-24] Gtk::Object::_release_c_instance(): Unref orphan managed widgets



commit acdca1641deac1a7575201c5bf4cf2d75d2aed57
Author: Kjell Ahlstedt <kjellahlstedt gmail com>
Date:   Thu Apr 14 13:18:26 2022 +0200

    Gtk::Object::_release_c_instance(): Unref orphan managed widgets
    
    g_object_run_dispose() unrefs a widget only if it has a parent.
    Use g_object_unref() on all widgets without a parent.
    Fixes #115

 gtk/gtkmm/object.cc | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)
---
diff --git a/gtk/gtkmm/object.cc b/gtk/gtkmm/object.cc
index be5dc63b..5a56a5b1 100644
--- a/gtk/gtkmm/object.cc
+++ b/gtk/gtkmm/object.cc
@@ -20,7 +20,6 @@
 #include <glibmm/quark.h>
 #include <gtk/gtk.h>
 
-
 namespace Gtk
 {
 
@@ -101,13 +100,21 @@ void Object::_release_c_instance()
     //This prevents us from unref-ing it again, or destroying it again after GTK+ has told us that it has 
been disposed.
     if (!gobject_disposed_)
     {
-      if(referenced_)
+      if (referenced_ || (GTK_IS_WIDGET(object) && !gtk_widget_get_parent(GTK_WIDGET(object))))
       {
-        //It's not manage()ed so we just unref to destroy it
+        // It's not manage()d or it's an orphan widget, so we just unref to destroy it.
         #ifdef GLIBMM_DEBUG_REFCOUNTING
         g_warning("final unref: gtypename: %s, refcount: %d\n", G_OBJECT_TYPE_NAME(object), 
((GObject*)object)->ref_count);
         #endif
 
+        if (!referenced_ && g_object_is_floating(object))
+        {
+          GLIBMM_DEBUG_REFERENCE(this, object);
+          // It's floating if it's a managed widget which is not stored in a container.
+          // GTK prints a warning if a widget with a floating ref is finalized.
+          g_object_ref_sink(object); // Stop it from being floating.
+        }
+
         GLIBMM_DEBUG_UNREFERENCE(this, object);
         g_object_unref(object);
 
@@ -388,5 +395,4 @@ GType Object::get_base_type()
   return g_object_get_type();
 }
 
-
 } // namespace Gtk


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]