/*!
\page keyboard Keyboard
This page details how Haiku reads keys from the keyboard including modifier
key and special characters, and how you can read and process these encoded
characters in your application.
\section unicode Haiku and UTF-8
Haiku encodes all characters using UTF-8. UTF-8 allows Haiku to represent
characters from all over the world while still maintaining backwards
compatibility with 7-bit ASCII codes. This means that the most commonly
used characters are encoded in just one byte while less common characters
can be encoded by extending the character encoding to use two, three, or,
rarely, four bytes.
\section keycodes Key Codes
Each key on the keyboard is assigned a numeric code to identify it to the
operating system. Most of the time you should not have to access these
codes directly, instead use one of the constants defined in InterfaceDefs.h
such \c B_BACKSPACE or \c B_ENTER or read the character from the \c key_map
struct.
The following diagram shows the key codes as they appear on a US 104-key
keyboard.
\image html US_PC_keyboard_keycodes.png
International keyboards each differ a bit but generally share an extra key
located in-between the left shift key and Z with the key code 0x69.
Mac keyboards have an equal sign in the keypad with key code 0x6a and some
other differences. Often times the keys produce the same key code but appear in
different locations.
\section modifiers Modifier Keys
Modifier keys are keys that have no effect on their own but when combined with
another key they modify the usual behavior of that key.
The following modifier keys are defined in InterfaceDefs.h
\c B_SHIFT_KEY |
Transforms lowercase case characters into uppercase characters
or chooses an alternative punctuation character. The shift key
is also used in combination with \c B_COMMAND_KEY to produce
keyboard shortcuts.
|
\c B_COMMAND_KEY |
Produces keyboard shortcuts for common operations such as
cut, copy, paste, print, and find.
|
\c B_CONTROL_KEY |
Outputs control characters in terminal. The control key is
sometimes also used as an alternative to \c B_COMMAND_KEY
to produce keyboard shortcuts in applications.
|
\c B_OPTION_KEY |
Used to in combination with other keys to output special
characters such as accented letters and symbols. Because
\c B_OPTION_KEY is not found on all keyboards it should not
be used for essential functions.
|
\c B_MENU_KEY |
The Menu key is used to produce contextual menus. Like
\c B_OPTION_KEY, the Menu key should not be used for essential
functions since it is not available on all keyboards.
|
In addition you can access the left and right modifier keys individually with
the following constants:
\c B_LEFT_SHIFT_KEY |
\c B_RIGHT_SHIFT_KEY |
\c B_LEFT_COMMAND_KEY |
\c B_RIGHT_COMMAND_KEY |
\c B_LEFT_CONTROL_KEY |
\c B_RIGHT_CONTROL_KEY |
\c B_LEFT_OPTION_KEY |
\c B_RIGHT_OPTION_KEY |
Scroll lock, num lock, and caps lock alter other keys pressed after they are
released. They are defined by the following constants:
\c B_CAPS_LOCK |
Produces uppercase characters. Reverses the effect of
\c B_SHIFT_KEY for letters.
|
\c B_SCROLL_LOCK |
Prevents the terminal from scrolling.
|
\c B_NUM_LOCK |
Informs the numeric keypad to output numbers when on. Reverses
the function of \c B_SHIFT_KEY for keys on the numeric keypad.
|
To get the currently active modifiers use the modifiers() function defined
in InterfaceDefs.h. This function returns a bitmap containing the currently
active modifier keys. You can create a bit mask of the above constants to
determine if the keys you are interested in are active.
\section other_constants Other Constants
The Interface Kit also defines constants for keys that are aren't represented by
a symbol, these include:
\c B_BACKSPACE |
\c B_RETURN |
\c B_ENTER |
\c B_SPACE |
\c B_TAB |
\c B_ESCAPE |
\c B_SUBSTITUTE |
\c B_LEFT_ARROW |
\c B_RIGHT_ARROW |
\c B_UP_ARROW |
\c B_DOWN_ARROW |
\c B_INSERT |
\c B_DELETE |
\c B_HOME |
\c B_END |
\c B_PAGE_UP |
\c B_PAGE_DOWN |
\c B_FUNCTION_KEY |
The \c B_FUNCTION_KEY constant can further be broken down into the following
constants:
\c B_F1_KEY |
\c B_F4_KEY |
\c B_F7_KEY |
\c B_F10_KEY |
\c B_PRINT_KEY (Print Screen) |
\c B_F2_KEY |
\c B_F5_KEY |
\c B_F8_KEY |
\c B_F11_KEY |
\c B_SCROLL_KEY (Scroll Lock) |
\c B_F3_KEY |
\c B_F6_KEY |
\c B_F9_KEY |
\c B_F12_KEY |
\c B_PAUSE_KEY (Pause/Break) |
For Japanese keyboard two more constants are defined:
- \c B_KATAKANA_HIRAGANA
- \c B_HANKAKU_ZENKAKU
\section keymap The Keymap
The characters produced by each of the key codes is determined by the keymap.
The usual way to for the user to choose and modify their keymap is the
Keymap preference application. A number of alternative keymaps such as dvorak
as well as keymaps for different locales are available.
\image html keymap.png
A full description of the Keymap preflet can be found in the
User Guide.
The keymap is a map of the characters produced by each key on the keyboard
including the characters produced when combined with the modifier constants
described above. The keymap also contains the codes of the modifier keys
and tables for dead keys.
To get the current system keymap create a pointer to a \c key_map struct and
\c char array and pass their addresses to the get_key_map() function. The
\c key_map struct will be filled out with the current system keymap and the
\c char array will be filled out with the UTF-8 character encodings.
The \c key_map struct contains a number of fields. These fields are described
in several sections below.
The first section contains a version number and the codes assigned to each of
the modifier keys.
\c version |
The version number of the keymap |
\c caps_key
\c scroll_key
\c num_key
|
Lock key codes |
\c left_shift_key
\c right_shift_key
|
Left and right shift key codes |
\c left_command_key
\c right_command_key
|
Left and right command key codes |
\c left_control_key
\c right_control_key
|
Left and right control key codes |
\c left_option_key
\c right_option_key
|
Left and right option key codes |
\c menu_key |
Menu key code |
\c lock_settings |
A bitmap containing the default state of the lock keys |
To programmatically set a modifier key in the system keymap use the
set_modifier_key() function. You can also programmatically set the
state of the num lock, caps lock, and scroll lock keys by calling the
set_keyboard_locks() function.
\section character_maps Character Maps
The next section of the \c key_map struct contains maps of offsets
into the array of UTF-8 character encodings filled out in the second
parameter by get_key_map(). Since the character maps are filled with UTF-8
characters they may be 1, 2, 3, or rarely 4 bytes long. The characters are
contained in non-\c NUL terminated Pascal strings. The first byte of the
string indicates how many bytes the character is made up of. For example the
string for a horizontal ellipses (...) character looks like this:
\code
x03xE2x80xA6
\endcode
The first byte is 03 meaning that the character is 3 bytes long. The bytes
E2 80 A6 is the UTF-8 byte representation of the horizontal ellipses character.
Recall that there is no terminating \c NUL character for these strings.
Not every key is mapped to a character. If a key is unmapped the character
array contains a 0-byte string. Unmapped keys do not produce \c B_KEY_DOWN
messages. Modifier keys should not be mapped into the character array.
The following character maps are defined:
\c control_map |
Map of characters when the control key is pressed |
\c option_caps_shift_map |
Map of characters when caps lock is turned on and both the
option key and shift keys are pressed.
|
\c option_caps_map |
Map of characters when caps lock is turned on and the option key
is pressed
|
\c option_shift_map |
Map of characters when both shift and option keys are pressed |
\c option_map |
Map of characters when the option key is pressed |
\c caps_shift_map |
Map of characters when caps lock is on and the shift key is
pressed
|
\c caps_map |
Map of characters when caps lock is turned on |
\c shift_map |
Map of characters when shift is pressed |
\c normal_map |
Map of characters when no modifiers keys are pressed |
\section dead_keys Dead Keys
Dead keys are keys that do not produce a character until they are combined
with another key. Because the key does not produce a character on their own
they are considered "dead" until they are brought to life by being combined
with another key. These dead keys are generally used to produce accented
characters.
Each of the fields below is a 32-byte array of dead key characters. The dead
keys are organized into pairs in the array so each dead key array can contain
up to 16 pairs of dead key characters. The first pair in the array should
contain \c B_SPACE followed by and the accent character in the second offset.
This serves to identify what accent character is contained in the array
and serves to define a space followed by accent pair to represent the unadorned
accent character.
The rest of the array is filled with pairs containing an unaccented character
followed by the accent character.
\c acute_dead_key |
Acute dead keys array |
\c grave_dead_key |
Grave dead keys array |
\c circumflex_dead_key |
Circumflex dead keys array |
\c dieresis_dead_key |
Dieresis dead keys array |
\c tilde_dead_key |
Tilde dead keys array |
The final section contains a bitmap that indicate which character table is
used for each of the above dead keys. The bitmap can contain any of the
following constants:
- \c B_CONTROL_TABLE
- \c B_CAPS_SHIFT_TABLE
- \c B_OPTION_CAPS_SHIFT_TABLE
- \c B_CAPS_TABLE
- \c B_OPTION_CAPS_TABLE
- \c B_SHIFT_TABLE
- \c B_OPTION_SHIFT_TABLE
- \c B_NORMAL_TABLE
- \c B_OPTION_TABLE
The bitmap often contains \c B_OPTION_TABLE because accent characters are
typically produced in combination with the \c B_OPTION_KEY.
\c acute_tables |
Acute dead keys array |
\c grave_tables |
Grave dead keys array |
\c circumflex_tables |
Circumflex dead keys array |
\c dieresis_tables |
Deeresis dead keys array |
\c tilde_tables |
Tilde dead keys array |
*/