Expand description
KBVM is an implementation of the XKB specification and associated protocols.
At its core, KBVM provides two types:
StateMachine, a compositor-side keyboard state machine.LookupTable, a client-side lookup table that can be used to look up keysyms.
These types can be created from XKB keymaps or RMLVO names by using an
xkb::Context.
Additionally, KBVM provides other tools from the XKB ecosystem:
ComposeTablescan be created from XCompose files as a simple input method.- XKB keymaps can be loaded from X11 connections via integration with the x11rb crate.
- The RMLVO registry can be loaded to display the available RMLVO names to users.
While XKB keymaps can be used to create StateMachines and LookupTables, it is also
possible to created these objects manually with the Builder
type. To retain compatibility with XKB, any LookupTable can be
turned into an XKB keymap.
Manually created StateMachines allow you to run arbitrary logic when keys are
pressed and released. For example, you can use this logic to implement sticky keys,
radio groups, locked keys, key redirection, latching keys, etc.
§The common compositor pattern
If you are developing a wayland compositor, you might use this crate as follows:
-
For each seat, the user configures either an XKB map directly or a set of RMLVO names from which you have to create an XKB map.
-
Either way, you use an
xkb::Contextand eitherkeymap_from_bytesorkeymap_from_namesto create anxkb::Keymap. -
You can format this keymap as a string by using
Keymap::format. You send this keymap to clients via thewl_keyboard.keymapevent. -
You then use
Keymap::to_builderfollowed byBuilder::build_state_machineto create aStateMachine. -
Whenever you receive a libinput key event, you feed it into the
StateMachinewithStateMachine::handle_key. This in turn produces a number ofEventsthat you forward to clients.The
handle_keydocumentation contains an example showing how to do this correctly.
If you are also handling keyboard shortcuts in your compositor, you will likely also
want to create a LookupTable as described in the next section.
§The common client pattern
If you are developing a wayland client, you might use this crate as follows:
- For each seat, you receive a keymap via the
wl_keyboard.keymapevent. - You use an
xkb::Contextandkeymap_from_bytesto create anxkb::Keymapfrom the buffer from the event. - You then use
Keymap::to_builderfollowed byBuilder::build_lookup_tableto create aLookupTable. - You create a
Componentsobject to store the active modifiers and group of the keyboard. - Whenever you receive a
wl_keyboard.modifiersevent, you update theComponentsas shown inComponents::update_effective. - Whenever you receive a
wl_keyboard.keyevent for a key press, you useLookupTable::lookupto look up the keysyms produced by this event, using the effective modifiers and group from yourComponents.
Modules§
- builder
- A
StateMachineandLookupTablebuilder. - evdev
Keycodeconstants for evdev keys.- group_
type GroupTypehelpers.- keysym
Keysymhelpers.- lookup
- The client-side
LookupTable. - modifier
- Modifier helpers.
- routine
- Custom logic to modify the behavior of keys.
- state_
machine - The compositor-side
StateMachine. - syms
Keysymconstants for well-known keysyms.- xkb
- Integration with the XKB ecosystem.
Structs§
- Components
- The active modifiers/group of a keyboard.
- Controls
Mask - A bitmask of control flags.
- Group
Delta - A group delta.
- Group
Index - A 0-based index into the groups of a keyboard.
- Group
Type - The type of a key group.
- Keycode
- A keycode.
- Keysym
- A keysym.
- Modifier
Index - A modifier index.
- Modifier
Mask - A modifier mask.