GResource
GResource is a resource bundle that includes application data like:
- UI files
- Icons
- CSS
There are quite a few ways to bundle such assets in Crystal (including manually loading them using macros), however GResource offers something important that they don't - being integrated with GTK.
That allows you to e.g. directly set css & icons to those loaded from the bundle (Widget#icon_name = "path/in/bundle/icon.svg").
Getting Started
- Create a
data/APP_ID.gresource.xmlwith the following content:
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
<gresource prefix="/path/for/bundle">
<file compressed="true">css/style.css</file>
<file compressed="true" preprocess="xml-stripblanks">icons/my_app.svg</file>
<file compressed="true" preprocess="xml-stripblanks">ui/my_app.ui</file>
</gresource>
</gresources>That will bundle the following files:
data/css/style.css,icons/my_app.svg&ui/my_app.ui, compress them and strip their whitespace.You should replace
/path/for/bundlewith the path you want, usually the APP_ID (e.g.dev.geopjr.My_app=>/dev/geopjr/My_app).And now you can load them as if they are at that location, e.g.:
Gtk::CssProvider#load_from_resource("/dev/geopjr/My_app/css/style.css")`.Debugger should also be able to list them under Global > Resources.
Creating & Loading the binary
You can either create and load it manually or use the Gio#register_resource macro that does both of them for you:
Gio#register_resource
We just call it in prerequisites:
Gio.register_resource("data/dev.geopjr.My_app.gresource.xml", "data")Manually
Creating the binary
The binary is being created with the use of an external tool, glib-compile-resources.
The full command is:
$ glib-compile-resources --sourcedir BASE_FOLDER --target PATH/TO/COMPILED.gresource PATH/TO/FILE.gresource.xmlHaving the above locations as examples, it should look like:
$ glib-compile-resources --sourcedir data --target data/dev.geopjr.My_app.gresource data/dev.geopjr.My_app.gresource.xmlLoading the binary
There should now be a data/dev.geopjr.My_app.gresource binary.
We load it in memory using macros and then register it in prerequisites. Follow Gio#register_resource's source.
TIP
Remember to add *.gresource to your .gitignore.
TIP
Replace APP_ID with your app's ID.