Usage Overview
libeek is a library to create keyboard-like user interface.
Since it is designed as simple as possible, it provides only two
kind of objects. One is keyboard element
(objects derived from #EekElement) and another is
keyboard layout engine (objects which
implements the #EekLayout interface).
A keyboard element represents either a keyboard
(#EekKeyboard), a section (#EekSection), or a key (#EekKey). Each
element implements the Builder design pattern so that it can map
itself to different UI widgets (#ClutterActor, #GtkDrawingArea,
aso).
A layout engine arranges keyboard elements using information
from external configuration mechanisms (libxklavier, XKB,
matchbox-keyboard layouts in XML, aso)
Here is a sample code which demonstrates (1) keyboard
elements are arranged with the system keyboard layout using
libxklavier and (2) keyboard elements are mapped into
#ClutterActor:
EekKeyboard *keyboard;
EekLayout *layout;
/* Create a keyboard layout using libxklavier configuration. */
layout = eek_xkl_layout_new ();
/* Create a keyboard implemented as ClutterActor. */
keyboard = eek_clutter_keyboard_new ();
/* Apply the layout to the keyboard. */
eek_keyboard_set_layout (keyboard, layout);
clutter_group_add (CLUTTER_GROUP(stage),
eek_clutter_keyboard_get_actor (EEK_CLUTTER_KEYBOARD(keyboard)));
The most interesting feature of libeek is that developer can
choose arbitrary combination of UI toolkits and layout engine
supported by libeek. For example, to create a keyboard-like
#GtkWidget instead of #ClutterActor, all you need is to replace
eek_clutter_keyboard_new() with eek_gtk_keyboard_new() and
eek_clutter_keyboard_get_actor() with
eek_gtk_keyboard_get_widget(). Similarly, if you want to use XKB
configuration directly (without libxklavier), you will only need to
replace eek_xkl_layout_new () with eek_xkb_layout_new().
To achieve portability across different UI toolkits,
there is a seperate represention of keyboard elements apart from
the actual UI widgets. For example, a keyboard is represented as a tree of
#EekElement -- #EekKeyboard contains one or more #EekSection's and
#EekSection contains one or more #EekKey's. Each element may emit
events when user pushes the corresponding UI widget.
Here is another sample code which demonstrates logical events on
#EekElement:
/* Find a key element in the logical keyboard. */
EekKey *key = eek_keyboard_find_key_by_keycode (keyboard, 0x38);
g_signal_connect (key, "pressed", on_a_pressed);
When user pushed a widget which looks like "a" key (i.e. keycode 0x38), on_a_pressed will be called.