I believe the current implementation of Item::get_items_at is wrong: #m4 _CONVERSION(`GList*',`Glib::ListHandle< Glib::RefPtr<Item> >',` $2($3, Glib::OWNERSHIP_NONE)')
_WRAP_METHOD(Glib::ListHandle< Glib::RefPtr<Item> > get_items_at(double x, double y, const Cairo::RefPtr<Cairo::Context>& context, bool is_pointer_event, bool parent_is_visible, Glib::ListHandle< Glib::RefPtr<Item> >& found_items), goo_canvas_item_get_items_at) Since the ownership of the returned ListHandle is set to NONE, the actual GList* will be leaked. However, if we set shallow ownership, then we get memory corruption because in the C API, the returned GList* is meant to be the same as the one passed in, with perhaps some items added to the front and thus returning a new list head. If I get it right, then the ownership of the found_items ListHandle needs to be set to none, and a new ListHandle with shallow ownership needs to be returned. We can't do this though, probably, because the ownership of the ListHandle is private. I think the C++ way to handle this is to use an insert iterator such as template<typename InsertIter> InsertIter get_items_at(double x, double y, const Cairo::RefPtr<Cairo::Context>& context, bool is_pointer_event, bool parent_is_visible, InsertIter iter); to be used like this: std::vector<Glib::RefPtr<Item> > items; some_item->get_items_at(..., std::inserter(items, items.end())); This is also more powerful because items can be inserted anywhere instead of just at the beginning. However, I don't think other *mm projects do anything similar, which is why I am asking for opinions first. The corresponding vfunc still needs special consideration then, since virtual functions cannot be templatized. Probably it is enough to just pass a specific container, such as std::vector, since the only code calling it is goocanvasmm itself anyway. Any opinions? Do you think it is OK to change it this way, or do you have other ideas to tackle this? Armin _______________________________________________ gtkmm-list mailing list [email protected] http://mail.gnome.org/mailman/listinfo/gtkmm-list
