Hi all, I'm trying to update from gtkmm-2.24 to gtkmm-3.18. As a dinosaur of a previous age, I'm trying to move from manual menus to Gtk::Builder and Gio::Resources. I've been through section 12 of the tutorial several times, and have looked at the 3.18 source /demo/Makefile as a reference. I'm using the example_builder.cc to learn how to load resources int an app.
So far, the program compiles, but I'm getting a runtime error: marty@builder$./x main 0: Error loading example_builder.ui: The resource at '/builder/example_builder.ui' does not exist I'm obvioysly mis-understanding something about resources, and would appreciate any help you can provide. I've been stewing over this for weeks. Thanks, Marty I'm running: Ubuntu-16.LTS g++-5 emacs-24 gresource.xml: <?xml version="1.0" encoding="UTF-8"?> <gresources> <gresource prefix="/builder"> <file>example_builder.ui</file> </gresource> </gresources makefile: PKGS = gtkmm-3.0 #epoxy INCL = `pkg-config --cflags $(PKGS)` LIBS = `pkg-config --libs $(PKGS)` COMP_RES = /usr/lib/x86_64-linux-gnu/glib-2.0/glib-compile-resources SRCDIR = /home/marty/gtkmm3/builder CC = g++ CFLAGS = -g -Wall $(INCL) EXE = x OBJS = example_builder.o resource.c resource.c: gresource.xml example_builder.ui $(COM P_RES) --target=resource.c --generate-source builder.gresource.xml all: $(EXE) $(EXE): $(OBJS) $(CC) $(OBJS) $(LIBS) -o $(EXE) example_builder.o: example_builder.cc $(CC) $(CFLAGS) -c example_builder.cc clean: rm *.o *. example_builder.ui: <?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> <interface> <object class="GtkListStore" id="liststore1"> <columns> <column type="gchararray"/> <column type="gchararray"/> <column type="gint"/> <column type="gchararray"/> </columns> <data> <row> <col id="0" translatable="yes">John</col> <col id="1" translatable="yes">Doe</col> <col id="2">25</col> <col id="3" translatable="yes">This is the John Doe row</col> </row> <row> <col id="0" translatable="yes">Mary</col> <col id="1" translatable="yes">Unknown</col> <col id="2">50</col> <col id="3" translatable="yes">This is the Mary Unknown row</col> </row> </data> </object> <object class="GtkAboutDialog" id="aboutdialog1"> <property name="program-name" translatable="yes">Gtk::Builder demo</property> <property name="logo-icon-name" translatable="yes">gtk3- demo</property> <accessibility> <relation target="window1" type="subwindow-of"/> </accessibility> </object> <object class="GtkWindow" id="window1"> <property name="default_height">250</property> <property name="default_width">440</property> <property name="title">Gtk::Builder demo</property> <child> <object class="GtkVBox" id="vbox1"> <property name="visible">True</property> <child> <object class="GtkMenuBar" id="menubar1"> <property name="visible">True</property> <child internal-child="accessible"> <object class="AtkObject" id="a11y-menubar"> <property name="AtkObject::accessible-name">The menubar</property> </object> </child> <child> <object class="GtkMenuItem"> <property name="visible">True</property> <property name="label" translatable="yes">_File</property> <property name="use-underline">True</property> <child type="submenu"> <object class="GtkMenu"> <child> <object class="GtkMenuItem" id="new_item"> <property name="visible">True</property> <property name="label" translatable="yes">_New</property> <property name="use-underline">True</property> </object> </child> <child> <object class="GtkMenuItem" id="open_item"> <property name="visible">True</property> <property name="label" translatable="yes">_Open</property> <property name="use-underline">True</property> </object> </child> <child> <object class="GtkMenuItem" id="save_item"> <property name="visible">True</property> <property name="label" translatable="yes">_Save</property> <property name="use-underline">True</property> </object> </child> <child> <object class="GtkMenuItem" id="save_as_item"> <property name="visible">True</property> <property name="label" translatable="yes">Save _As</property> <property name="use-underline">True</property> </object> </child> <child> <object class="GtkSeparatorMenuItem"> <property name="visible">True</property> </object> </child> <child> <object class="GtkMenuItem" id="quit_item"> <property name="visible">True</property> <property name="label" translatable="yes">_Quit</property> <property name="use-underline">True</property> <property name="action- name">win.quit</property> </object> </child> </object> </child> </object> </child> <child> <object class="GtkMenuItem"> <property name="visible">True</property> <property name="label" translatable="yes">_Edit</property> <property name="use-underline">True</property> <child type="submenu"> <object class="GtkMenu"> <child> <object class="GtkMenuItem" id="copy_item"> <property name="visible">True</property> <property name="label" translatable="yes">_Copy</property> <property name="use-underline">True</property> </object> </child> <child> <object class="GtkMenuItem" id="cut_item"> <property name="visible">True</property> <property name="label" translatable="yes">_Cut</property> <property name="use-underline">True</property> </object> </child> <child> <object class="GtkMenuItem" id="paste_item"> <property name="visible">True</property> <property name="label" translatable="yes">_Paste</property> <property name="use-underline">True</property> </object> </child> </object> </child> </object> </child> <child> <object class="GtkMenuItem"> <property name="visible">True</property> <property name="label" translatable="yes">_Help</property> <property name="use-underline">True</property> <child type="submenu"> <object class="GtkMenu"> <child> <object class="GtkMenuItem" id="help_item"> <property name="visible">True</property> <property name="label" translatable="yes">_Help</property> <property name="use-underline">True</property> <property name="action- name">win.help</property> </object> </child> <child> <object class="GtkMenuItem" id="about_item"> <property name="visible">True</property> <property name="label" translatable="yes">_About</property> <property name="use-underline">True</property> <property name="action- name">win.about</property> </object> </child> </object> </child> </object> </child> </object> <packing> <property name="expand">False</property> </packing> </child> <child> <object class="GtkToolbar" id="toolbar1"> <property name="visible">True</property> <child internal-child="accessible"> <object class="AtkObject" id="a11y-toolbar"> <property name="AtkObject::accessible-name">The toolbar</property> </object> </child> <child> <object class="GtkToolButton"> <property name="visible">True</property> <property name="label" translatable="yes">New</property> <property name="tooltip-text" translatable="yes">Create a new file</property> <property name="icon-name">document-new</property> </object> </child> <child> <object class="GtkToolButton"> <property name="visible">True</property> <property name="label" translatable="yes">Open</property> <property name="tooltip-text" translatable="yes">Open a file</property> <property name="icon-name">document-open</property> </object> </child> <child> <object class="GtkToolButton"> <property name="visible">True</property> <property name="label" translatable="yes">Save</property> <property name="tooltip-text" translatable="yes">Save a file</property> <property name="icon-name">document-save</property> <property name="is-important">True</property> </object> </child> <child> <object class="GtkSeparatorToolItem"> <property name="visible">True</property> </object> </child> <child> <object class="GtkToolButton"> <property name="visible">True</property> <property name="label" translatable="yes">Copy</property> <property name="tooltip-text" translatable="yes">Copy selected object into the clipboard</property> <property name="icon-name">edit-copy</property> </object> </child> <child> <object class="GtkToolButton"> <property name="visible">True</property> <property name="label" translatable="yes">Cut</property> <property name="tooltip-text" translatable="yes">Cut selected object into the clipboard</property> <property name="icon-name">edit-cut</property> </object> </child> <child> <object class="GtkToolButton"> <property name="visible">True</property> <property name="label" translatable="yes">Paste</property> <property name="tooltip-text" translatable="yes">Paste object from the clipboard</property> <property name="icon-name">edit-paste</property> </object> </child> </object> <packing> <property name="position">1</property> <property name="expand">False</property> </packing> </child> <child> <object class="GtkScrolledWindow" id="scrolledwindow1"> <property name="shadow_type">in</property> <property name="visible">True</property> <child> <object class="GtkTreeView" id="treeview1"> <property name="visible">True</property> <property name="model">liststore1</property> <property name="tooltip-column">3</property> <child internal-child="accessible"> <object class="AtkObject" id="a11y-treeview"> <property name="AtkObject::accessible-name">Name list</property> <property name="AtkObject::accessible-description"> A list of person with name, surname and age columns </property> </object> </child> <child> <object class="GtkTreeViewColumn" id="column1"> <property name="title">Name</property> <child> <object class="GtkCellRendererText" id="renderer1"/> <attributes> <attribute name="text">0</attribute> </attributes> </child> </object> </child> <child> <object class="GtkTreeViewColumn" id="column2"> <property name="title">Surname</property> <child> <object class="GtkCellRendererText" id="renderer2"/> <attributes> <attribute name="text">1</attribute> </attributes> </child> </object> </child> <child> <object class="GtkTreeViewColumn" id="column3"> <property name="title">Age</property> <child> <object class="GtkCellRendererText" id="renderer3"/> <attributes> <attribute name="text">2</attribute> </attributes> </child> </object> </child> </object> </child> </object> <packing> <property name="position">2</property> <property name="expand">True</property> </packing> </child> <child> <object class="GtkStatusbar" id="statusbar1"> <property name="visible">True</property> </object> <packing> <property name="position">3</property> <property name="expand">False</property> </packing> </child> </object> </child> </object> </interface example_builder.cc * Demonstrates an interface loaded from a XML description. */ #include "gtkmm.h" #include "gtk/gtk.h" #include <iostream> // For std::cout class Example_Builder : public Gtk::Window { public: Example_Builder(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder); virtual ~Example_Builder(); protected: void on_file_quit(); void on_help_about(); void on_help_help(); Glib::RefPtr<Gtk::Builder> m_builder; }; //Called by DemoWindow: Gtk::Window* do_builder() { cout << "do_builder 0: << endl; // Load the XML file and instantiate its widgets: Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create(); try { cout << "do_builder 1: << endl; builder->add_from_resource( "/builder/example_builder.ui"); cout << "do_builder 99: << endl; } catch (const Glib::Error& error) { std::cout << "Error loading example_builder.ui: " << error.what() << std::endl; return nullptr; } // Get the GtkBuilder-instantiated window: Example_Builder* pWindow = nullptr; builder->get_widget_derived("window1", pWindow); if (!pWindow) { std::cout << "Could not get 'window1' from the builder." << std::endl; return nullptr; } return pWindow; } Example_Builder::Example_Builder( BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder) : Gtk::Window(cobject), m_builder(builder) { Gtk::Toolbar* pToolbar = nullptr; builder->get_widget("toolbar1", pToolbar); if (pToolbar) pToolbar->get_style_context()->add_class("primary-toolbar"); Glib::RefPtr<Gio::SimpleActionGroup> refActions = Gio::SimpleActionGroup::create(); refActions->add_action("quit", sigc::mem_fun(*this, &Example_Builder::on_file_quit)); refActions->add_action("about", sigc::mem_fun(*this, &Example_Builder::on_help_about)); refActions->add_action("help", sigc::mem_fun(*this, &Example_Builder::on_help_help)); insert_action_group("win", refActions); Glib::RefPtr<Gtk::AccelGroup> refAccelGroup = Gtk::AccelGroup::create(); add_accel_group(refAccelGroup); Gtk::MenuItem* pMenuItem = nullptr; builder->get_widget("new_item", pMenuItem); if (pMenuItem) pMenuItem->add_accelerator("activate", refAccelGroup, GDK_KEY_n, Gdk::CONTROL_MASK, Gtk::ACCEL_VISIBLE); builder->get_widget("open_item", pMenuItem); if (pMenuItem) pMenuItem->add_accelerator("activate", refAccelGroup, GDK_KEY_o, Gdk::CONTROL_MASK, Gtk::ACCEL_VISIBLE); builder->get_widget("save_item", pMenuItem); if (pMenuItem) pMenuItem->add_accelerator("activate", refAccelGroup, GDK_KEY_s, Gdk::CONTROL_MASK, Gtk::ACCEL_VISIBLE); builder->get_widget("quit_item", pMenuItem); if (pMenuItem) pMenuItem->add_accelerator("activate", refAccelGroup, GDK_KEY_q, Gdk::CONTROL_MASK, Gtk::ACCEL_VISIBLE); builder->get_widget("copy_item", pMenuItem); if (pMenuItem) pMenuItem->add_accelerator("activate", refAccelGroup, GDK_KEY_c, Gdk::CONTROL_MASK, Gtk::ACCEL_VISIBLE); builder->get_widget("cut_item", pMenuItem); if (pMenuItem) pMenuItem->add_accelerator("activate", refAccelGroup, GDK_KEY_x, Gdk::CONTROL_MASK, Gtk::ACCEL_VISIBLE); builder->get_widget("paste_item", pMenuItem); if (pMenuItem) pMenuItem->add_accelerator("activate", refAccelGroup, GDK_KEY_v, Gdk::CONTROL_MASK, Gtk::ACCEL_VISIBLE); builder->get_widget("help_item", pMenuItem); if (pMenuItem) pMenuItem->add_accelerator("activate", refAccelGroup, GDK_KEY_F1, (Gdk::ModifierType)0, Gtk::ACCEL_VISIBLE); builder->get_widget("about_item", pMenuItem); if (pMenuItem) pMenuItem->add_accelerator("activate", refAccelGroup, GDK_KEY_F7, (Gdk::ModifierType)0, Gtk::ACCEL_VISIBLE); show_all(); } Example_Builder::~Example_Builder() { } void Example_Builder::on_file_quit() { hide(); } void Example_Builder::on_help_about() { Gtk::AboutDialog* pDialog = nullptr; m_builder->get_widget("aboutdialog1", pDialog); if (pDialog) { pDialog->set_transient_for(*this); pDialog->run(); pDialog->hide(); } } void Example_Builder::on_help_help() { std::cout << "Help not available." << std::endl; } int main( int argc, char* argv[]) { std::cout << "main 0:" << std::endl; auto app = Gtk::Application::create( argc, argv); Gtk::Window* win = do_builder(); return app->run(*win); _______________________________________________ gtkmm-list mailing list gtkmm-list@gnome.org https://mail.gnome.org/mailman/listinfo/gtkmm-list