builder gio::resource problem
- From: Marty Moore <pl8swash gmail com>
- To: gtkmm-list gnome org
- Subject: builder gio::resource problem
- Date: Sat, 08 Apr 2017 10:14:50 -0600
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]