gii_key_event(3) LibGII key events


#include <ggi/events.h>
typedef struct gii_key_event {

uint32_t modifiers;
uint32_t sym;
uint32_t label;
uint32_t button;
} gii_key_event;


The gii_key_event structure represents key/button events from keyboards and other devices.


The key specified in the structure is pressed. Not repeatedly produced while holding down the key.

A key specified in the structure is released.

Makes sense when dealing with character input. A key is being held down and the character should be processed at intervals when the key is held down.

The key repeat rate and the delay before repeat is unspecified and depends on the user's environment.


Result of bitwise-or of the following flags, indicating certain shift states:

The symbol of the key, which is the resultant character produced by the key. This is roughly a transformation of the label with the current modifiers. It also depends on the user's key configuration.

The actual label visible on the key in question. This is either the symbol produced when there are no modifiers or it is the most prominent symbol on that key. For example:
  • The numeric keys on top of the letter keys on a standard PC keyboard have label values which are the digit characters in ASCII.
  • The English letter keys on a keyboard are represented by A through Z in label. Although in their unshifted state these keys produce lowercase letters, the keycaps are printed with uppercase by convention, so this is what LibGII returns.

label can be used as a generalized, portable keycode or scancode of the key (That is, if the documentation for an applications says that something is is mapped to key y, it is, even for German keyboard, where y and z are swapped)

The button number distinguishing between the different buttons on the device. For example, on a keyboard it is a number from 0 to 127 (i.e. a scancode), on a joystick it might be 1 to 4, and on a spaceorb it will be 1 to 8.

If an application is interested in what physical keys are pressed and released (most games for example), read the label field. Usually the modifiers in effect are irrelevant for these applications (however, for non-alphanumeric symbols like + and -, it is wise to check the sym field instead of label as they are accessed using shifts on some keyboard configurations).

If an application wants a stream of characters (for text input), it should read the sym field.


In GGI, key values are defined in ggi/keyboard.h. They are basically Unicode characters with some extensions:

Keys which are not represented by codepoints in the Unicode standard (such as the numeric keypad keys) are assigned codepoints in the private range. Applications should use the GIIK_ #defines for representing these keys. These codepoints are used in label, but they can also occur in sym when the symbol is not any character (e.g. arrow keys, function keys).

The GIIUC_ #defines represent normal Unicode characters. The #defines are interchangeable with their corresponding codepoint scalars and their use is optional. However, it is recommended to use them for the symbols GIIUC_BackSpace, GIIUC_Return, GIIUC_Escape and GIIUC_Delete.

Important: In the LibGII system, no key is guaranteed to exist; the key values are for identification only. Particularly, applications should not rely on their presence. Also, because not all keyboards are configured in the same way, applications are encouraged to allow user configuration of the keys used and not hard-code their values.