Re: Gtk::Widget::on_hide




On 19/11/2013 15:48, Kjell Ahlstedt wrote:

You mentioned in https://mail.gnome.org/archives/gtkmm-list/2013-November/msg00022.html that you have "glibmm_Glib::quark_" in the list of GQuarks, when I have "glibmm_Glib::quark_cpp_wrapper_deleted_". It's as if

    g_object_steal_qdata((GObject*)gobj(), Glib::quark_);
g_object_set_qdata((GObject*)gobj(), Glib::quark_cpp_wrapper_deleted_, (gpointer)true);

in Gtk::Object::disconnect_cpp_wrapper() don't do what they should. Confusing!

What's confusing to me is that your code ever reaches those two lines! When I close my test window (MyDialog), the function Object::destroy_notify_() invariably gets called before Object::disconnect_cpp_wrapper(). Since Object::destroy_notify_() sets 'gobject_' to NULL, I don't see how those lines can ever get reached... ??? Should it be setting 'gobject_ to NULL or is there a bit of the patch missing?

Apart from that little quirk it's all much more solid today than it was yesterday.

John
You are right. I have tested with gtkmm 3, where the patches in bug 605728 have been applied. Then Gtk::Object::destroy_notify_() is called before Gtk::Object::disconnect_cpp_wrapper(), and the *_qdata() functions are not called. But with gtkmm 2.24.4 without those patches, Gtk::Object::disconnect_cpp_wrapper() is called first. It removes Glib::quark_, and therefore Gtk::Object::destroy_notify_() is not called when the underlying GDialog object is finalized. (Without Glib::quark_, Glib::ObjectBase::destroy_notify_callback_() is not called.)

The most puzzling thing is why you are (as far as I know) the only one who have reported crashes with even the shortest possible gtkmm applications. Your problems are so severe that I would expect complaints from most affected users of gtkmm.

Getting back to https://mail.gnome.org/archives/gtkmm-list/2013-November/msg00043.html, you say there, before you applied any patches, that gobject_ is set to 0 in Gtk::Object::disconnect_cpp_wrapper(), and then Gtk::Widget::on_unrealize() is called, and the program crashes there, because gobject_ == 0. But when disconnect_cpp_wrapper() sets gobject_ = 0, it also removes Glib::quark_ with g_object_steal_qdata((GObject*)gobj(), Glib::quark_). If that's done, on_unrealize() won't be called. See also https://mail.gnome.org/archives/gtkmm-list/2013-November/msg00045.html.

Kjell


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