On Fri, 14 Mar 2008 09:41:22 +0100 Gabriele Greco wrote: > After some headache with my gtk C++ classes I've found with a small > test program this fact about the gobject references:
Sorry, not sure what you're trying to do. Are you trying to do something with gtkmm? Or are you creating your own bindings? > Here is the code (tested with GTK 2.12): > > #include <gtk/gtk.h> > > int main() > { > gtk_init(NULL, NULL); > > GtkWindow *w = gtk_window_new(GTK_WINDOW_TOPLEVEL); > GtkWidget *l = gtk_label_new("Test"); > > printf("Window\nStart: %d ", G_OBJECT(w)->ref_count); > g_object_ref_sink(G_OBJECT(w)); Gtk owns all toplevel windows. It already does _ref_sink() on GtkWindows on creation (see gtk_window_init() in gtk/gtkwindow.c). In this case, if you want to keep an extra reference to 'w', you'd just call g_object_ref() on it. > printf("Sink: %d ", ((GObject *)w)->ref_count); > g_object_unref(G_OBJECT(w)); This should be ok as well, IFF you've previously called g_object_ref() and thus own a reference to it. As I said, Gtk owns the initial (non-floating) reference GtkWindow that you get back with gtk_window_new(). > printf("End: %d\n", ((GObject *)w)->ref_count); > > printf("Label\nStart: %d ", G_OBJECT(l)->ref_count); > g_object_ref_sink(G_OBJECT(l)); > printf("Sink: %d ", ((GObject *)l)->ref_count); > g_object_unref(G_OBJECT(l)); > printf("End: %d\n", ((GObject *)l)->ref_count); > } This more or less works (because non-window GtkObjects are created floating), but that's usually not what you'd want to do. Again you'd probably want to just take a normal reference on the widget and then unref it when you don't need it anymore. When you add a widget to a container, it will take care of ditching the floating reference and taking a real reference. -brian _______________________________________________ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list