@defgroup keysym-encoding Keysym encoding @brief Description of the keysyms encoding and the categories of keysyms
@sa Appendix A “Keysym Encoding” of the X Window System Protocol. @sa Appendix C “New keysyms” of the XKB Protocol Specification.
@tableofcontents{html:2}
@important Keysyms are 32-bit integers whoose 3 most significant
bits are always set to zero. Thus valid keysyms are in the range
0 – 0x1fffffff = @ref XKB_KEYSYM_MAX.
@note Throughout this documentation, keysyms values are viewed as four bytes, numbered from most significant to least significant:
There are 6 categories:
| Category | Subcategory | Byte 1 | Byte 2 | Byte 3 | Byte 4 | First keysym | Last keysym |
|---|---|---|---|---|---|---|---|
| @ref special-keysyms | `0` | `0` | `0` | `0` | [`NoSymbol`][NoSymbol] | ||
| @ref latin-1-keysyms | ASCII non-control characters | `0` | `0` | `0` | `0x20` – `0x7e` | [`space`](@ref XKB_KEY_space) | [`asciitilde`](@ref XKB_KEY_asciitilde) |
| Latin-1 Supplement | `0xa0` – `0xff` | [`nobreakspace`](@ref XKB_KEY_nobreakspace) | [`ydiaeresis`](@ref XKB_KEY_ydiaeresis) | ||||
| @ref legacy-keysyms | [Latin-2] | `0` | `0` | `0x01` | `0x00` – `0xff` | [`Aogonek`](@ref XKB_KEY_Aogonek) | [`abovedot`](@ref XKB_KEY_abovedot) |
| [Latin-3] | `0x02` | [`Hstroke`](@ref XKB_KEY_Hstroke) | [`scircumflex`](@ref XKB_KEY_scircumflex) | ||||
| [Latin-4] | `0x03` | [`kra`](@ref XKB_KEY_kra) | [`umacron`](@ref XKB_KEY_umacron) | ||||
| Kana | `0x04` | [`overline`](@ref XKB_KEY_overline) | [`semivoicedsound`](@ref XKB_KEY_semivoicedsound) | ||||
| Arabic | `0x05` | [`Arabic_comma`](@ref XKB_KEY_Arabic_comma) | [`Arabic_sukun`](@ref XKB_KEY_Arabic_sukun) | ||||
| Cyrillic | `0x06` | [`Serbian_dje`](@ref XKB_KEY_Serbian_dje) | [`Cyrillic_HARDSIGN`](@ref XKB_KEY_Cyrillic_HARDSIGN) | ||||
| Greek | `0x07` | [`Greek_ALPHAaccent`](@ref XKB_KEY_Greek_ALPHAaccent) | [`Greek_omega`](@ref XKB_KEY_Greek_omega) | ||||
| Technical | `0x08` | [`leftradical`](@ref XKB_KEY_leftradical) | [`downarrow`](@ref XKB_KEY_downarrow) | ||||
| Special | `0x09` | [`blank`](@ref XKB_KEY_blank) | [`vertbar`](@ref XKB_KEY_vertbar) | ||||
| Publishing | `0x0a` | [`emspace`](@ref XKB_KEY_emspace) | [`cursor`](@ref XKB_KEY_cursor) | ||||
| APL | `0x0b` | [`leftcaret`](@ref XKB_KEY_leftcaret) | [`righttack`](@ref XKB_KEY_righttack) | ||||
| Hebrew | `0x0c` | [`hebrew_doublelowline`](@ref XKB_KEY_hebrew_doublelowline) | [`hebrew_taf`](@ref XKB_KEY_hebrew_taf) | ||||
| Thai | `0x0d` | [`Thai_kokai`](@ref XKB_KEY_Thai_kokai) | [`Thai_lekkao`](@ref XKB_KEY_Thai_lekkao) | ||||
| Korean | `0x0e` | [`Hangul_Kiyeog`](@ref XKB_KEY_Hangul_Kiyeog) | [`Korean_Won`](@ref XKB_KEY_Korean_Won) | ||||
| [Latin-5] | `0x0f` | ||||||
| [Latin-6] | `0x10` | ||||||
| [Latin-7] | `0x11` | ||||||
| [Latin-8] | `0x12` | ||||||
| [Latin-9] | `0x13` | [`OE`](@ref XKB_KEY_OE) | [`Ydiaeresis`](@ref XKB_KEY_Ydiaeresis) | ||||
| Currency | `0x20` | [`EuroSign`](@ref XKB_KEY_EuroSign) | |||||
| @ref function-keysyms | IBM 3270 terminals | `0` | `0` | `0xfd` | `0x00` – `0xff` | [`3270_Duplicate`](@ref XKB_KEY_3270_Duplicate) | [`3270_Enter`](@ref XKB_KEY_3270_Enter) |
| Keyboard (XKB) Extension | `0xfe` | [`ISO_Lock`](@ref XKB_KEY_ISO_Lock) | [`Pointer_Drag5`](@ref XKB_KEY_Pointer_Drag5) | ||||
| Keyboard | `0xff` | [`BackSpace`](@ref XKB_KEY_BackSpace) | [`Delete`](@ref XKB_KEY_Delete) | ||||
| @ref special-keysyms | `0` | `0xff` | `0xff` | `0xff` | [`VoidSymbol`][VoidSymbol] | ||
| @ref unicode-keysyms | `0x01` | `0x00` – `0x10` | `0x00` – `0xff` | `0x00` – `0xff` | `0x01000100` | `0x0110ffff` | |
| @ref vendor-keysyms | DEC, HP, misc. | `0x10` | `0x00` | `0x00` – `0xff` | `0x00` – `0xff` | `0x10000000` | `0x1000ffff` |
| `0x10` | `0x01` – `0x03` | `0x10010000` | `0x1003ffff` | ||||
| OSF | `0x10` | `0x04` | `0x10040000` | `0x1004ffff` | |||
| Sun | `0x10` | `0x05` | `0x10050000` | `0x1005ffff` | |||
| `0x10` | `0x06` – `0x07` | `0x10060000` | `0x1007ffff` | ||||
| XFree86 | `0x10` | `0x08` | `0x10080000` | `0x1008ffff` | |||
| `0x10` – `0x1f` | `0x09` – `0xff` | `0x10090000` | `0x1fffffff` | ||||
There are 2 special values: [NoSymbol][NoSymbol] and [VoidSymbol][VoidSymbol].
They are used to indicate the absence of symbols.
Byte 1 | Byte 2 | Byte 3 | Byte 4 | Hex. value | Name
------ | ------ | ------ | -- --- | ------------ | -----
0 | 0 | 0 | 0 | 0x00000000 | [NoSymbol][NoSymbol]
0 | 255 | 255 | 255 | 0x00ffffff | [VoidSymbol][VoidSymbol]
@sa Appendix A “Special keysyms” of the X Window System Protocol.
[NoSymbol]: @ref XKB_KEY_NoSymbol [VoidSymbol]: @ref XKB_KEY_VoidSymbol
The Latin-1 keysyms occupy the range 0x0020 – 0x007E and 0x00a0 – 0x00ff and represent
the ISO 10646 / Unicode characters U+0020 – U+007E and U+00A0 – U+00FF, respectively.
@sa ISO/IEC 8859-1 character encoding @sa Appendix A “Latin-1 keysyms” of the X Window System Protocol.
Legacy keysyms date from the time before ISO 10646 / Unicode was available. They represent characters from a number of different older 8-bit coded character sets and have zero values for bytes 1 and 2. Byte 3 indicates a coded character set and byte 4 is the 8-bit value of the particular character within that set.
| Byte 3 | ||
|---|---|---|
| Value | Character set | Comment |
| 1 | [Latin-2] | |
| 2 | [Latin-3] | |
| 3 | [Latin-4] | |
| 4 | Kana | |
| 5 | Arabic | |
| 6 | Cyrillic | |
| 7 | Greek | |
| 8 | Technical | Based on [DEC Technical]: add `0x880` to the original code point |
| 9 | Special | Based on [DEC Special Graphics]: add `0x980` to the original code point |
| 10 | Publishing | |
| 11 | APL | |
| 12 | Hebrew | |
| 13 | Thai | |
| 14 | Korean | |
| 15 | [Latin-5] | |
| 16 | [Latin-6] | |
| 17 | [Latin-7] | |
| 18 | [Latin-8] | |
| 19 | [Latin-9] | |
| 32 | Currency | |
Each character set contains gaps where codes have been removed that were duplicates with codes in previous character sets (that is, character sets with lesser byte 3 value).
@todo Legacy keysyms
@sa @ref latin-1-keysyms @sa Appendix A “Legacy keysyms” of the X Window System Protocol.
Function keysyms represent keycap symbols that do not directly represent elements of a coded character set. Instead, they typically identify a software function, mode, or operation (e.g., cursor up, caps lock, insert) that can be activated using a dedicated key. Function keysyms have zero values for bytes 1 and 2. Byte 3 distinguishes between several 8-bit sets within which byte 4 identifies the individual function key.
| Byte 1 | Byte 2 | Byte 3 | Byte 4 | |
|---|---|---|---|---|
| Value | Value | Value | Function set | Value |
| 0 | 0 | 253 | IBM 3270 terminals | (individual function key) |
| 254 | Keyboard (XKB) Extension | |||
| 255 | Keyboard | |||
@todo Function keysyms
@sa Appendix A “Function keysyms” of the X Window System Protocol. @sa Appendix C “New keysyms” of the XKB Protocol Specification.
The Unicode keysyms occupy the range 0x01000100 – 0x0110FFFF and represent the
ISO 10646 / Unicode characters U+0100 – U+10FFFF, respectively.
The numeric value of a Unicode keysym is the Unicode code point of the corresponding character plus
0x01000000. In the interest of backwards compatibility, clients should be able to process both the
Unicode keysym and the legacy keysym for those characters where both exist.
@note Dead keys, which place an accent on the next character entered, shall be encoded as function keysyms, and not as the Unicode keysym corresponding to an equivalent combining character.
@note Where a keycap indicates a specific function with a graphical symbol that is also available in Unicode (e.g., an upwards arrow for the cursor up function), the appropriate function keysym should be used, and not the Unicode keysym corresponding to the depicted symbol.
@sa Appendix A “Unicode keysyms” of the X Window System Protocol. @sa Unicode technical website.
Vendor keysyms are vendor-specific extentions in the range 0x10000000 – 0x1fffffff.
Among these, the range 0x11000000 – 0x1100ffff is designated for keypad keysyms.
@sa Appendix A “Vendor keysyms” of the X Window System Protocol.
@ingroup keysyms