builder gio::resource problem



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);




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