grub-dev: GUI Components
12.3 GUI Components
===================
The graphical menu implements a GUI component system that supports a
container-based layout system. Components can be added to containers,
and containers (which are a type of component) can then be added to
other containers, to form a tree of components. Currently, the root
component of this tree is a 'canvas' component, which allows manual
layout of its child components.
Components (non-container):
* label
* image
* progress_bar
* circular_progress
* list (currently hard coded to be a boot menu list)
Containers:
* canvas
* hbox
* vbox
The GUI component instances are created by the theme loader in
'gfxmenu/theme_loader.c' when a theme is loaded. Theme files specify
statements such as '+vbox{ +label { text="Hello" } +label{ text="World"
} }' to add components to the component tree root. By nesting the
component creation statements in the theme file, the instantiated
components are nested the same way.
When a component is added to a container, that new child is
considered *owned* by the container. Great care should be taken if the
caller retains a reference to the child component, since it will be
destroyed if its parent container is destroyed. A better choice instead
of storing a pointer to the child component is to use the component ID
to find the desired component. Component IDs do not have to be unique
(it is often useful to have multiple components with an ID of
"__timeout__", for instance).
In order to access and use components in the component tree, there
are two functions (defined in 'gfxmenu/gui_util.c') that are
particularly useful:
* 'grub_gui_find_by_id (root, id, callback, userdata)':
This function ecursively traverses the component tree rooted at
ROOT, and for every component that has an ID equal to ID, calls the
function pointed to by CALLBACK with the matching component and the
void pointer USERDATA as arguments. The callback function can do
whatever is desired to use the component passed in.
* 'grub_gui_iterate_recursively (root, callback, userdata)':
This function calls the function pointed to by CALLBACK for every
component that is a descendant of ROOT in the component tree. When
the callback function is called, the component and the void pointer
USERDATA as arguments. The callback function can do whatever is
desired to use the component passed in.