Hi, Thank you very much. That script got serious :) I patched gtk_signals.defs and that did the trick: now I don't see the warning message, and the GFile is wrapped just fine.
I still have a few problems: - How can I provide a const version of _WRAP_METHOD(std::vector< Glib::RefPtr<Gio::File> > list_shortcuts(), gtk_places_sidebar_list_shortcuts) - How can I deal with gpointers that are actually well known objects? Regards, Juan. On Thu, 2013-09-05 at 17:27 +0200, Kjell Ahlstedt wrote: > 2013-09-04 22:20, Juan Rafael García Blanco skrev: > > On Sun, 2013-09-01 at 20:20 +0200, Kjell Ahlstedt wrote: > >> 2013-08-31 21:12, Juan Rafael García Blanco skrev: > >>> On Mon, 2013-08-26 at 19:50 +0100, Chris Vine wrote: > >>>> On Mon, 26 Aug 2013 09:00:34 +0200 > >>>> Kjell Ahlstedt <kjell.ahlst...@bredband.net> wrote: > >>>>> 2013-08-25 12:19, Juan Rafael Garcia Blanco skrev: > >>>>>> Hello, > >>>>>> > >>>>>> I'm fairly new to developing inside gtkmm. I'm trying to wrap > >>>>>> GtkPlacesSidebar. I managed to get a first version > >>>>>> (https://bugzilla.gnome.org/show_bug.cgi?id=705642) and now I'm > >>>>>> writing a simple example to test it. > >>>>>> > >>>>>> In that example program I attach a handler to the open-location > >>>>>> signal. That signal, when emitted, provides a Gio::File object in > >>>>>> the form of Glib::Object; when it is emitted I get this message: > >>>>>> > >>>>>> glibmm-WARNING **: Failed to wrap object of type 'GLocalFile'. > >>>>>> Hint: this error is commonly caused by failing to call a library > >>>>>> init() function. > >>>>>> > >>>>>> GtkPlacesSidebar docs state that the signature for that signal > >>>>>> handler should be: > >>>>>> > >>>>>> void user_function (GtkPlacesSidebar *sidebar, > >>>>>> GObject *location, > >>>>>> ...) > >>>>>> > >>>>>> where location is a GFile. > >>>>>> > >>>>>> I've added Gio::init() at the beginning of my main.cc, but the > >>>>>> problem remains. I would like to learn how this can be done, and > >>>>>> why it is not working. > >>>>>> > >>>>>> Thank you very much in advance. > >>>>>> > >>>>>> Regards, > >>>>>> Juan. > >>>>>> > >>>>> gtk_init() must be called in a gtk+ program, and thus also in a gtkmm > >>>>> program. gtk_init() is called by > >>>>> Gtk::Application::create(int& argc, char**& argv, const > >>>>> Glib::ustring& application_id, Gio::ApplicationFlags flags) > >>>>> but it's not called by > >>>>> Gtk::Application::create(const Glib::ustring& application_id, > >>>>> Gio::ApplicationFlags flags) > >>>>> > >>>>> Don't know if this is bug, or done deliberately. My guess is that > >>>>> both Gtk::Application::create() shall call gtk_init(). > >>>>> Don't know if a missing call to gtk_init() is the reason for your > >>>>> warning message. > >>>> g_application_run() is not subclassed in GtkApplication to call > >>>> gtk_init(), and it doesn't need to be because GtkApplication itself > >>>> initializes GTK+ when the object is constructed. When using > >>>> GtkApplication you can call gtk_init(), but you do not have to. The > >>>> main point is that g_application_run() does not strip out command line > >>>> arguments which are GTK+ specific, such as --display and the like. > >>>> That is the only reason, in a GTK+ program, to call gtk_init() with > >>>> GtkApplication. (I think the suggestion is that you should not do so, > >>>> but should use environmental variables or the GOptionGroup/GOptionEntry > >>>> interface.) > >>>> > >>>> Given the different approach to library initialization taken by gtkmm, > >>>> this no doubt caused a problem. The decision seems to have been taken > >>>> to pass the program arguments to gtk_init() when they are passed to > >>>> Gtk::Application::create(), but not to call gtk_init() otherwise. This > >>>> should work OK. The problem may lie elsewhere: perhaps there is > >>>> something wrong about the use of (or wrapping of) GApplication's 'open' > >>>> signal. > >>>> > >>>> Chris > >>> I think the problem is not related to missing ::init() funtions. I think > >>> the problem has something to do with the fact that the handler takes a > >>> GObject instead of a GFile. I think I'm missing some _CONVERSION macro. > >>> As I said the open_location signal handler takes a GFile argument as a > >>> GObject. I'm wrapping it with this line: > >>> > >>> _WRAP_SIGNAL(void open_location(const Glib::RefPtr<Glib::Object>& > >>> location, PlacesOpenFlags open_flags=Gtk::PLACES_OPEN_NORMAL), > >>> "open_location"); > >>> > >>> I took a look at how Gtk::Entry has wrapped the populate_popup signal, > >>> which also takes a GtkWidget argument that actually is a GMenu. But it > >>> gives me little information since the wrapped signal handler does not > >>> use RefPtr<>. > >>> > >>> Thank you in advance. > >>> > >> Now I understand what causes your problem, but I'm not sure what's the > >> best way to fix it. > >> > >> PlacesSidebar_signal_open_location_callback() gets a GObject* p0, where > >> p0 points to an object which is actually a GLocalFile. GLocalFile is not > >> wrapped in gtkmm. > >> Glib::wrap(p0) tries to create a C++ wrapper. It fails because > >> Glib::wrap_auto() only tries to find a corresponding C++ class for > >> GLocalFIle and those of its base classes that derive from GObject, i.e. > >> no interfaces derived from GInterface. There is a corresponding C++ > >> class for GObject itself (Glib::Object), but Glib::wrap_auto() does not > >> find it, because it's not registered with a call to > >> Glib::wrap_register(). A Glib::Object wrapper would probably be useless > >> anyway. It would not be possible to dynamic_cast it to a Gio::File. > >> > >> Probably GLocalFile shall not be wrapped. I suspect that there are a > >> number of gtk+ classes that implement the GFile interface, and all of > >> those shall be wrapped in a Gio::File wrapper. > >> > >> There is already a gtkmm/gtk/src/gtk_signals.defs.patch file that > >> patches the file generated by > >> gtkmm/tools/extra_defs_gen/generate_defs_gtk. Perhaps it would help to > >> add a patch for PlacesSidebar's open_location signal, changing > >> '("GObject*" "p0") > >> to > >> '("GFile*" "p0") > >> > >> You should then also change the _WRAP_SIGNAL directive to > >> _WRAP_SIGNAL(void open_location(const Glib::RefPtr<Gio::File>& > >> location, PlacesOpenFlags open_flags=Gtk::PLACES_OPEN_NORMAL), > >> "open_location"); > >> > >> Kjell > >> > > How can I generate the gtk_signals.defs.patch file? I'm not sure how to > > do that. Thank you very much. > > > > Regards, > > Juan. > > > > > I have updated > https://git.gnome.org/browse/gtkmm/tree/tools/gen_scripts/gtk_generate_extra_defs.sh. > Read the comments there. > > Kjell _______________________________________________ gtkmm-list mailing list gtkmm-list@gnome.org https://mail.gnome.org/mailman/listinfo/gtkmm-list