A lot of concepts are explained through examples in this document, please read through them to understand different ways of defining layouts.
A good way to learn is also to read through the existing layouts in this repository.
The YAML file's entry point is the Keyboard data class. It only requires a name and rows.
The QWERTY layout is defined like so:
name: "QWERTY"
rows:
- letters: q w e r t y u i o p
- letters: a s d f g h j k l
- letters: z x c v b n m
The name must be defined first, and letter rows are defined next.
There are many ways to define the same thing. Use which one makes most sense for your use case. All rows in the below example are functionally identical:
name: Different examples
rows:
# Basic definition as string
- letters: q w e r t
# Basic definition as string (quoting is necessary if you use some symbols)
- letters: "q w e r t"
# Definition as inline list
- letters: ["q", "w", "e", "r", "t"]
# Definition as multiline list, and unicode escapes
- letters:
# U+0071: LATIN SMALL LETTER Q
- "\u0071"
# U+0077: LATIN SMALL LETTER W
- "\u0077"
# U+0065: LATIN SMALL LETTER E
- "\u0065"
# U+0072: LATIN SMALL LETTER R
- "\u0072"
# U+0074: LATIN SMALL LETTER T
- "\u0074"
# Defining base, explicit case, and mixing randomly
- letters:
- {type: base, spec: q}
- {type: case, normal: w, shifted: W}
- e
- "\u0072"
- type: case
normal:
type: base
spec: "t|t" # pipe symbol is keyspec syntax: label|code
code: 0x74 # though you can set code explicitly too
shifted: {type: base, spec: T}
Defining layout-specific moreKeys can also be done in multiple ways:
name: MoreKeys examples
rows:
# List syntax: [primarykey, ...morekeys]
- letters:
- [a, ą]
- b
- [c, č]
- [d] # For consistency you can also specify a key without morekeys like this
- [e, ė, ę]
# You can also do it inline at the cost of readability
- letters: [[a, ą], b, [c, č], d, [e, ė, ę]]
# Explicit BaseKey syntax
- letters:
- {type: base, spec: "a", moreKeys: "ą"}
- {type: base, spec: b}
- type: base
spec: "c"
moreKeys: "č"
- "d"
- type: base
spec: "e"
moreKeys: ["ę", "ė"]
# You can use list syntax anywhere that expects a Key, such as `case`
- letters:
- type: case
normal: [a, ą]
shifted: [A, Ą]
- b
- {type: case, normal: [c, č], shifted: [C, Č]}
- d
- [e, ę, ė]
These shortcuts for defining things are explained more in the shortcuts section. In practice you should avoid randomly mixing different ways of defining keys, you should stick to something that keeps the file readable and understandable.
With RTL languages it's advised to use unicode escapes in order to keep the file easily editable. It's good practice to include a comment explaining each unicode character:
name: Arabic
rows:
- letters:
# U+0636: "ض" ARABIC LETTER DAD
- "\u0636"
# U+0635: "ص" ARABIC LETTER SAD
- "\u0635"
# U+062B: "ث" ARABIC LETTER THEH
- "\u062B"
# U+0642: "ق" ARABIC LETTER QAF
# U+06A8: "ڨ" ARABIC LETTER QAF WITH THREE DOTS ABOVE
- ["\u0642", "\u06A8"]
A default number row and bottom row will be added if they are not explicitly defined. You can override them with custom ones for more advanced layouts:
name: "PC QWERTY Example"
numberRowMode: AlwaysEnabled
rows:
- numbers: "` 1 2 3 4 5 6 7 8 9 0 - ="
- letters: "q w e r t y u i o p [ ] \\"
- letters: "a s d f g h j k l ; ' $delete"
- letters: "$shift z x c v b n m , . / $shift"
- bottom: "$symbols $space $enter"
There can at most be one number row, and one bottom row. If they are explicitly defined in the layout file, then the number row must be at the top and bottom row must be at the bottom. Between 1 and 8 letter rows are permitted.
The keyboard parser automatically prepends $shift
and appends $delete
to the final letter row
when all of the following conditions are met:
- No
bottom
row is explicitly defined - None of the letter rows explicitly set
$shift
or$delete
What this means is that to customize the location of shift and delete, or to disable the shift key
in your layout, you just need to specify $shift
and/or $delete
somewhere, and the automatic
insertion will be disabled. If you specify an explicit bottom row, you will need to manually specify
them as well.
In this example, the backspace ($delete
) is relocated to the second row instead of its usual place in the third row:
name: "Alphabet"
rows:
- letters: a b c d e f g h i j
- letters: k l m n o p q r s $delete # Backspace on this row instead of bottom row
- letters: $shift t u v w x y z $shift # Two shift keys
- bottom: $symbols $space $enter # No comma or period
You can use the following template keys:
$shift
- shift key$delete
- backspace key$space
- spacebar$enter
- enter/search/next/prev/go key$symbols
- switch to symbols menu$alphabet
- switch back to alphabet (only used in symbols layout)$action
- action key, user-defined, may be empty$number
- switch to numpad mode$contextual
- contextual key,/
for URLs and date fields,@
for email fields,:
for time fields$zwnj
- Zero-width non-joiner key, and zero-width joiner key in morekeys.$optionalzwnj
- same as$zwnj
if useZWNJKey is true, else none$gap
- regular-width gap$alt0
- switch to alt page 0, or back from alt page 0$alt1
- switch to alt page 1, or back from alt page 1$alt2
- switch to alt page 2, or back from alt page 2
There are a few shortcuts to help make it easier to define layouts. These are documented in this section.
An example of a full BaseKey definition:
name: example
rows:
- letters:
- type: base
spec: "a"
This shortcut allows you to define the exact same thing with just
name: example
rows:
- letters:
- a
An example of a full BaseKey definition with moreKeys:
name: example
rows:
- letters:
- type: base
spec: "a"
moreKeys: "ayy,ahh"
This shortcut allows you to define the exact same thing with just
name: example
rows:
- letters:
- [a, ayy, ahh]
The first element is treated as the spec, and all subsequent elements are turned into moreKeys.
An example of a List definition, using the string shortcut for defining Key
:
name: example
rows:
- letters: [a, b, c]
This shortcut allows you to define the exact same thing with just
name: example
rows:
- letters: a b c
# or - letters: "a b c", necessary for yaml parsing if you use some special symbols
Key specs work the same way they do in AOSP keyboard. For example you can define a differing label from its code, without needing to use the long format.
name: "Arabic example"
rows:
- letters:
- " \u0654◌|\u0654" # The label will appear as ٔ◌ but it will only type the Hamza mark, without the ◌ circle
moreKeys refers to the extra keys that are accessible by long-pressing a key. The layout engine automatically adds a bunch of moreKeys to keys by default - symbols, actions, numbers, and accented letters are added based on the key's location and user settings.
You can customize the behavior of automatic moreKeys by setting moreKeyMode
in attributes. For
example, to disable all automatic moreKeys, you can include this near the top of your layout
definition:
attributes: {moreKeyMode: OnlyExplicit}
moreKey modes are documented in the More Key Mode section of API reference.
Attributes can be defined in multiple places: the keyboard itself, a specific row, or an individual key. Attributes which are unset get inherited in a particular order. See the Key Attributes section of the API reference for all attributes and defaults.
The base
key is fit for most cases, but case
is also useful when you need the key to change
based on shift state. See the Keys section of the API reference for all key types.
The Keyboard
data class represents a keyboard layout definition, serving as the entry point for layout YAML files.
- Description: The human-readable name of the layout. If the layout is for a specific language, this should be written in the relevant language.
- Type:
String
- Optional: No
- Description: The rows defined for the layout. Defining the number row, bottom row, or the functional keys (shift/backspace) is optional here. If they are missing, defaults will automatically be added to
effectiveRows
. - Type:
List<
Row
>
- Optional: No
- Description: (optional) List of languages this layout is intended for. It will be displayed as an option for the specified languages.
- Type:
List<String>
- Optional: Yes
- Default Value: empty list
- Description: (optional) A human-readable description of the layout. Authorship/origin information may be added here. This is intended to be displayed to the user when they are selecting layouts.
- Type:
String
- Optional: Yes
- Default Value: empty string
- Description: (optional) Override the symbols layout or other layouts for this layout set.
- Type:
LayoutSetOverrides
- Optional: Yes
- Default Value: A default instance of
LayoutSetOverrides
- Description: (optional) Whether the number row should be user-configurable, always displayed, or never.
- Type:
NumberRowMode
- Optional: Yes
- Default Value:
UserConfigurable
- Description: (optional) Whether the bottom row should always maintain a consistent height, or whether it should grow and shrink.
- Type:
BottomRowHeightMode
- Optional: Yes
- Default Value:
Fixed
- Description: (optional) Whether the bottom row should follow key widths of other rows, or should maintain separate widths for consistency.
- Type:
BottomRowWidthMode
- Optional: Yes
- Default Value:
SeparateFunctional
- Description: (optional) Default attributes to use for all rows
- Type:
KeyAttributes
- Optional: Yes
- Default Value: A default instance of
KeyAttributes
- Description: (optional) Definitions of custom key widths. Values are between 0.0 and 1.0, with 1.0 representing 100% of the keyboard width.
- Type:
Map<
KeyWidth
, Float>
- Optional: Yes
- Default Value: empty map
- Description: (optional) Whether or not rows should fill the vertical space, or have vertical gaps added.
- Type:
RowHeightMode
- Optional: Yes
- Default Value:
ClampHeight
- Description: (optional) Whether or not the ZWNJ key should be shown in place of the contextual key.
- Type:
Boolean
- Optional: Yes
- Default Value:
false
- Description: (optional) Minimum width for functional keys.
- Type:
Float
- Optional: Yes
- Default Value: 0.125f
- Description: (optional) Minimum width for functional keys in the bottom row.
- Type:
Float
- Optional: Yes
- Default Value: 0.15f
- Description: (optional) Alternative pages for this layout, use in conjunction with
$alt0
,$alt1
,$alt2
. - Type:
List<List<
Row
>>
- Optional: Yes
- Default Value: empty list
The Row
data class represents a single row in a keyboard layout. It allows for customization of various aspects, including the type of keys, row height, splittability, and behavior with respect to the number row.
One of numbers
, letters
or bottom
must be defined.
- Description: Defines this as a number row.
- Type:
List<Key>?
- Optional: One of
numbers
,letters
orbottom
must be defined. - Default Value:
null
- Behavior:
- If defined, will be treated as a number row by default.
- Number rows are given grow keys, no background, and smaller height by default.
- Description: Defines this as a letters row.
- Type:
List<Key>?
- Optional: One of
numbers
,letters
orbottom
must be defined. - Default Value:
null
- Behavior:
- If defined, will be treated as a letters row by default.
- Letter rows are splittable by default.
- Description: Defines this as a bottom row.
- Type:
List<Key>?
- Optional: One of
numbers
,letters
orbottom
must be defined. - Default Value:
null
- Behavior:
- If defined, this is a bottom row. Bottom row should typically contain:
$symbols , $action $space $optionalzwnj . $enter
- If defined, this is a bottom row. Bottom row should typically contain:
The default bottom row is the following:
- bottom:
- $symbols
- type: contextual
fallbackKey: ","
- $action
- $space
- $optionalzwnj
- "."
- $enter
- Description: The height multiplier for this row.
- Type:
Double
- Optional: Yes
- Default Value:
1.0
for letters and bottom rows,0.8
for number rows. - Behavior:
- Can be used to customize the row height with respect to other rows.
- Description: Whether this row is splittable.
- Type:
Boolean
- Optional: Yes
- Default Value:
true
if defined as a letters row,false
otherwise - Behavior:
- If true, allows the row to be split when the user prefers a split layout (e.g. landscape)
- Description: How this row should behave with respect to the number row.
- Type:
RowNumberRowMode
- Optional: Yes
- Default Value:
Default
- Behavior:
- Can be customized to control when the row is displayed in relation to the number row.
- Description: Default key attributes for this row.
- Type:
KeyAttributes
- Optional: Yes
- Default Value: a default set of attributes
- Behavior:
- Allows customization of key styles, widths, and other attributes.
The LayoutSetOverrides
data class represents a set of overrides for specific layouts.
All layouts currently leave this default.
- Description: The layout used when the keyboard is in symbols mode.
- Type:
String
- Default Value:
"symbols"
- Description: The layout used when the keyboard is in shifted symbols mode.
- Type:
String
- Default Value:
"symbols_shift"
- Description: The layout used when the keyboard is in numpad mode.
- Type:
String
- Default Value:
"number"
- Description: The layout used when the keyboard is in phone mode.
- Type:
String
- Default Value:
"phone"
- Description: The layout used when the keyboard is in shifted phone mode.
- Type:
String
- Default Value:
"phone_shift"
The LabelFlags
data class represents flags for customizing the behavior of key labels on a key.
- Description: Aligns the hint label to the bottom of the key.
- Type:
Boolean
- Default Value:
false
- Description: Aligns icon to the bottom of the key.
- Type:
Boolean
- Default Value:
false
- Description: Aligns label off-center in the key.
- Type:
Boolean
- Default Value:
false
- Description: Indicates whether the key has a hint label.
- Type:
Boolean
- Default Value:
false
- Description: Follows the key label ratio for text size.
- Type:
Boolean
- Default Value:
false
- Description: Follows the key letter ratio for text size.
- Type:
Boolean
- Default Value:
false
- Description: Follows the key large letter ratio for text size.
- Type:
Boolean
- Default Value:
false
- Description: Enables automatic x-axis scaling to fit label within key.
- Type:
Boolean
- Default Value:
false
The KeyAttributes
data class represents various attributes for keys in a keyboard layout. These attributes control how keys are displayed and behave.
- Description: The width token for the key.
- Type:
KeyWidth?
- DefaultKeyAttributes Value:
Regular
- Behavior:
- Specifies the width of the key using a width token.
- Description: The visual style (background) for the key.
- Type:
KeyVisualStyle?
- DefaultKeyAttributes Value:
Normal
- Behavior:
- Defines the background appearance of the key.
- Description: Whether or not to anchor the key to the edges.
- Type:
Boolean?
- DefaultKeyAttributes Value:
false
- Behavior:
- If true, anchors the key to the edges, adding padding as needed.
- Description: Whether or not to show the popup indicator when the key is pressed.
- Type:
Boolean?
- DefaultKeyAttributes Value:
true
- Behavior:
- If true, displays a popup indicator for letters, but this may be undesirable for functional or large keys.
- Description: Which moreKeys to add automatically.
- Type:
MoreKeyMode?
- getEffectiveAttributes Default Value:
All
if the row is a letter or bottom row, and the effective width is Regular, elseOnlyFromLetter
- Behavior:
- Specifies the mode for adding more keys automatically.
- Description: Whether or not to use keyspec shortcuts.
- Type:
Boolean?
- DefaultKeyAttributes Value:
true
- Behavior:
- If true, enables automatic conversion of certain characters using keyspec shortcuts.
- Description: Whether or not longpress is enabled for the key.
- Type:
Boolean?
- DefaultKeyAttributes Value:
false
- Behavior:
- If true, enables long press functionality for the key.
- Description: Label flags for how the key's label (and its hint) should be presented.
- Type:
LabelFlags?
- DefaultKeyAttributes Value:
{ autoXScale: true }
- Behavior:
- Specifies how to display the key's label and hint.
- Description: Whether or not the key is repeatable, intended for backspace or arrow keys.
- Type:
Boolean?
- DefaultKeyAttributes Value:
false
- Behavior:
- If true, enables repeat functionality for the key.
- Description: Whether or not the key is automatically shiftable.
- Type:
Boolean?
- DefaultKeyAttributes Value:
true
- Behavior:
- If true, the code and label automatically becomes uppercased when the layout is shifted. If this is not desired, this can be set to false. Shift behavior can be customized by using a CaseSelector.
The attributes are inherited in the following order:
Key.attributes
Row.attributes
Keyboard.attributes
DefaultKeyAttributes
The BaseKey
data class is the main one used to define keys in a keyboard layout. It contains various attributes and settings for customization.
Explicit definition in yaml is done with type: base
.
You can automatically define a BaseKey with default settings by simply specifying the spec in place of the BaseKey object:
# Instead of
- letters:
- type: base
spec: "a"
# You can do the same thing like this
- letters:
- "a"
# But customizing attributes requires the long-form definition
- letters:
- type: base
spec: "a"
attributes: { style: NoBackground }
- Description: AOSP key spec.
- Type:
String
- Behavior:
- Specifies the key specification, which can contain custom label, code, icon, or output text.
- Description: Attributes for this key.
- Type:
KeyAttributes
- Default Value: blank
- Behavior:
- Specifies various attributes for the key, such as width, style, and more.
- Values defined here supersede any other values inherited from row, keyboard, or default attributes.
- Description: More keys for this key.
- Type:
List<String>
- Default Value: empty list
- Behavior:
- Specifies more keys that should be added.
- Can be defined as a list or comma-separated string in YAML (e.g.
a,b,c
)
- Description: Hint for the key.
- Type:
String?
- Default Value:
null
- Behavior:
- If set, overrides a default hint from the value of moreKeys.
- Specifies a custom hint for the key.
Each key specification is one of the following:
- Label optionally followed by keyOutputText (keyLabel|keyOutputText).
- Label optionally followed by code point (keyLabel|!code/code_name).
- Icon followed by keyOutputText (!icon/icon_name|keyOutputText).
- Icon followed by code point (!icon/icon_name|!code/code_name).
Label and keyOutputText are one of the following:
- Literal string.
- Label reference represented by (!text/label_name), see {@link KeyboardTextsSet}.
- String resource reference represented by (!text/resource_name), see {@link KeyboardTextsSet}.
Icon is represented by (!icon/icon_name), see {@link KeyboardIconsSet}.
Code is one of the following:
- Code point presented by hexadecimal string prefixed with "0x"
- Code reference represented by (!code/code_name), see Codes and Icons.
Special character, comma ',' backslash '', and bar '|' can be escaped by '' character. Note that the '' is also parsed by XML parser and {@link MoreKeySpec#splitKeySpecs(String)} as well.
See valid icon names and code names in Codes and Icons
Note: In moreKeys, %
tells where to put the automatic morekeys (e.g. the numbers in the top row).
If no %
is present, they are automatically put at the end, so you can use %
to put them in the
middle. If you want a literal %
symbol, use %|%
You can customize the order that moreKeys appear, as well as the column count.
!autoColumnOrder!3
or!fixedColumnOrder!3
- force 3 columns, you can put a different number too; auto will lay them out in automatic order, fixed will use the specific order as defined!hasLabels!
- affects the font size of moreKeys!needsDividers!
- currently has no effect!noPanelAutoMoreKey!
- long pressing will type the first morekey instead of opening panel
Example:
- letters:
- ["q", "!fixedColumnOrder!2", "a", "b", "c", "d"] # will lay out 2x2 - a, b; c, d
- ["w", "!autoColumnOrder!3", "!hasLabels!", "1", "2", "3", "4", "5", "6"] # 3, 1, 2; 6, 4, 5
The CaseSelector
data class represents a case selector key in a keyboard layout. It allows specifying different types of keys depending on when the layout is shifted or not.
Defined in yaml using type: case
Note: You can specify a different type of Key in different cases. For example, normal can be a base key, and shifted can be a gap.
- Description: Key to use normally. Required.
- Type:
Key
- Behavior:
- Specifies the key to use when the layout is not shifted.
- Description: Key to use when shifted.
- Type:
Key
- Default Value: same as
normal
- Behavior:
- Specifies the key to use when the layout is shifted.
- Description: Key to use when shifted, excluding automatic shift.
- Type:
Key
- Default Value: same as
shifted
- Behavior:
- Specifies the key to use when the layout is shifted manually.
- Description: Key to use when shift locked (caps lock).
- Type:
Key
- Default Value: same as
shiftedManually
- Behavior:
- Specifies the key to use when the shift lock is enabled.
- Description: Key to use when in symbols layout.
- Type:
Key
- Default Value: same as
normal
- Behavior:
- Specifies the key to use when the layout is in symbols mode.
- Description: Key to use when in symbols layout and shifted.
- Type:
Key
- Default Value: same as
normal
- Behavior:
- Specifies the key to use when the layout is in symbols mode and shifted.
The GapKey
data class represents a gap in the keyboard layout.
Instead of a key, a gap will be placed in its place.
Defined in yaml using type: gap
, or just use the $gap
shortcut.
- Description: Attributes for this key. This is mainly useful for setting the width.
- Type:
KeyAttributes
- Default Value: blank
The EnterKey
data class represents an enter key. Its icon and moreKeys will depend on the input field.
Defined in yaml using type: enter
This is not intended to be used in layouts, instead please use the $enter
shortcut when possible.
- Description: Attributes for this key.
- Type:
KeyAttributes
- Default Value: blank
The ActionKey
data class represents the user-configurable action key. If an action key is not set,
then the key will be skipped.
Defined in yaml using type: action
This is not intended to be used in layouts, instead please use the $action
shortcut when possible.
- Description: Attributes for this key.
- Type:
KeyAttributes
- Default Value: blank
The ContextualKey
data class represents a contextual key. In specific text field types, it displays a key useful for that text field type, as defined here:
KeyboardId.MODE_EMAIL to BaseKey(spec = "@", attributes = attributes),
KeyboardId.MODE_URL to BaseKey(spec = "/", attributes = attributes),
KeyboardId.MODE_DATETIME to BaseKey(spec = "/", moreKeys = listOf(":"), attributes = attributes),
KeyboardId.MODE_DATE to BaseKey(spec = "/", attributes = attributes),
KeyboardId.MODE_TIME to BaseKey(spec = ":", attributes = attributes),
If the current text field does not match any of the types (e.g. it's a normal text field), it uses the fallbackKey. If fallbackKey is null (or if you use $contextual
) then no key will be displayed at all.
Defined in yaml using type: contextual
- Description: Attributes for this key.
- Type:
KeyAttributes
- Default Value: blank
- Description: Default key to use in normal text fields that are not listed above
- Type:
Key?
- Default Value:
null
The KeyWidth
enum represents various width tokens for keys in a keyboard layout. It simplifies the process of specifying key widths by using tokens instead of explicit percentages.
- Description: Regular key width, used for normal letters.
- Behavior:
- Calculated based on the total keyboard width and maximum number of keys in a row.
- Consistent across the entire keyboard except in some cases (bottom row, split layout, or rows with functional keys).
- Description: Functional key width, used for functional keys like Shift, Backspace, Enter, and Symbols.
- Behavior:
- Has a minimum width specified by the
minimumFunctionalKeyWidth
property. - May be larger than the minimum if there is available space.
- Has a minimum width specified by the
- Description: Grow width, used for keys that take up remaining space divided evenly among all grow keys in the row.
- Behavior:
- Currently not supported in splittable rows.
- Can complicate width calculation for functional keys and others.
- Mainly used for spacebar.
- Description: Custom width tokens, defined in the
overrideWidths
property of the keyboard configuration. - Behavior:
- Values are between 0.0 and 1.0.
- Used to specify custom widths for specific keys or layouts.
The KeyVisualStyle
enum represents the visual style of a key in a keyboard layout. It affects the background of the key based on user theme settings.
- Description: Uses a normal key background, intended for all letters.
- Behavior: This may be a rounded rectangle or no background depending on user settings.
- Description: Uses no key background, intended for number row numbers.
- Behavior: No background will be shown for this key.
- Description: Uses a slightly darker colored background, intended for functional keys (backspace, etc).
- Behavior: A more visually distinct background is used, it may be dimmer or more saturated.
- Description: Intended for Shift when it's not shiftlocked.
- Behavior: Specifies a background for Shift when it's not shiftlocked.
- Description: Intended for Shift to indicate it's shiftlocked. Uses a more bright background.
- Behavior: Specifies a brighter background for Shift when it's shiftlocked.
- Description: Uses a bright fully rounded background, normally used for the enter key.
- Behavior: Specifies a bright, fully rounded background for the enter key.
- Description: Depending on the key borders setting, this is either the same as Normal (key borders enabled) or a fully rounded rectangle (key borders disabled).
- Behavior: Specifies a background for the spacebar key, which may be the same as Normal or a fully rounded rectangle depending on key borders settings.
- Description: Visual style for moreKeys. Not intended for use in layout definitions.
- Behavior: Specifies a background for more keys.
The MoreKeyMode
enum specifies which morekeys can be automatically added to the key.
- Description: Insert all possible automatic moreKeys
- Behavior:
- Inserts moreKeys from keyspec shortcut.
- Inserts moreKeys for numbers, symbols, actions, and language letters based on user settings and based on the key's coordinate.
- Counts towards keyCoordinate.
- Description: Only automatically insert morekeys from keyspec shortcut or language-related accents
- Behavior:
- Inserts moreKeys from keyspec shortcut, and for language letters based on user settings.
- Does not count towards keyCoordinate.
- Description: Do not automatically insert any morekeys.
- Behavior:
- Does not count towards keyCoordinate
- Only moreKeys explicitly defined for the key are included.
Represents the height mode of the bottom row in a layout.
- Description: The bottom row height is fixed.
- Description: The bottom row height can vary based on row count.
Represents the key width mode of keys in the bottom row.
- Description: The functional keys (symbols, enter) are at least
minimumBottomFunctionalKeyWidth
wide.
- Description: The functional keys (symbols, enter) follow the functional width from other rows.
Represents the height mode of rows in this layout.
- Description: The row height is clamped to a reasonable height, row spacing is added to fill the space.
- Description: The row height fills available height.
Represents the behavior of the number row in a layout.
- Description: The number row can be enabled or disabled by the user in typing settings.
- Description: The number row is always enabled and visible.
- Description: The number row is never enabled or visible.
Represents the behavior of a row's visibility with respect to the number row in a layout.
- Description: The row is unaffected by the state of the number row
- Description: This row only displays when the number row is active.
- Description: This row only displays when the number row is inactive.
Codes: (e.g. !code/key_tab
)
key_tab
key_enter
key_space
key_shift
key_capslock
key_switch_alpha_symbol
key_output_text
key_delete
key_settings
key_shortcut
key_action_next
key_action_previous
key_shift_enter
key_language_switch
key_emoji
key_alpha_from_emoji
key_to_number_layout
key_to_alt_0_layout
key_to_alt_1_layout
key_to_alt_2_layout
key_unspecified
action_{...}
(e.g.!code/action_emoji
)
Icons: (e.g. !icon/go_key
)
undefined
shift_key
shift_key_shifted
delete_key
settings_key
space_key
space_key_for_number_layout
enter_key
go_key
search_key
send_key
next_key
done_key
previous_key
tab_key
zwnj_key
zwj_key
emoji_action_key
emoji_normal_key
numpad
action_{...}
(e.g.!icon/action_emoji
)
Actions:
emoji
settings
paste
text_edit
themes
undo
redo
voice_input
system_voice_input
switch_language
clipboard_history
mem_dbg
cut
copy
select_all
more
bugs
keyboard_modes
up
down
left
right
Combine icon and code with |, e.g. !icon/delete_key|!code/key_delete
or !icon/action_emoji|!code/action_emoji
.
Example usage:
name: Arrow keys with a and b
rows:
- letters:
- "!icon/action_up|!code/action_up"
- "!icon/action_down|!code/action_down"
- "!icon/action_left|!code/action_left"
- "!icon/action_right|!code/action_right"
- letters:
- "a"
- "b"