[gtkmm/gtkmm-3-24] Gtk::Object::_release_c_instance(): Unref orphan managed widgets
- From: Kjell Ahlstedt <kjellahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtkmm/gtkmm-3-24] Gtk::Object::_release_c_instance(): Unref orphan managed widgets
- Date: Thu, 14 Apr 2022 11:23:37 +0000 (UTC)
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]