Re: Various questions about Gtk::PlacesSidebar



On Tue, 03 Sep 2013 22:34:51 +0200
Murray Cumming <murrayc murrayc com> wrote:
On Tue, 2013-09-03 at 21:20 +0100, Chris Vine wrote:
On Tue, 03 Sep 2013 09:40:19 +0200
Murray Cumming <murrayc murrayc com> wrote:
On Mon, 2013-09-02 at 16:13 +0200, Krzysztof Kosiński wrote:
2013/9/2 Kjell Ahlstedt <kjell ahlstedt bredband net>:
Objects of classes that derive from Gtk::Object are not put in
Glib::RefPtr<>s. I'm not sure why.

I'm also a little confused by this but it probably has
something to do with Gtk::manage().

GtkWidgets don't use simple reference counting in the GTK+ C API.
They can be destroyed at any time regardless of the reference
count. So we can't use RefPtr with them easily.

That is not really true.  widgets are always (and only) destroyed
when their sunk reference count reaches 0,

Calling gtk_widget_destroy() will destroy a widget. Containers destroy
their child widgets by default in GTK+ with C.

On reflection I think you may well be right (except that it _is_ the
case that widgets will only be finalized when their reference count
reaches 0). gtk_widget_destroy() calls g_object_run_dispose() which
causes the object to drop all references to other objects.  This will
cause all containers to drop their references to it.  However, if the
references dropped includes other objects which are part of the
widget's own implementation then there are problems.

The documentation for gtk_widget_destroy() sort-of suggests that
keeping a reference will keep the widget alive: "... If the widget is
inside a container, the widget will be removed from the container. If
the widget is a toplevel (derived from GtkWindow), it will be removed
from the list of toplevels, and the reference GTK+ holds to it will be
removed.  Removing a widget from its container or the list of toplevels
results in the widget being finalized, unless you've added additional
references to the widget with g_object_ref()."  It would be somewhat
pointless to not finalize the widget if in fact it is unusable.  At a
suitable opportunity I will do a test and see which result occurs.

However, GTK+ containers don't call gtk_widget_destroy(): users do.
GTK+ containers just drop their references when being finalized.

Chris


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