Imported Debian patch 2:1.15.1-0ubuntu2.6
[deb_xorg-server.git] / xkb / XKM_file_format.txt
diff --git a/xkb/XKM_file_format.txt b/xkb/XKM_file_format.txt
new file mode 100644 (file)
index 0000000..0ba28ee
--- /dev/null
@@ -0,0 +1,684 @@
+                        XKM File Format Description
+                                Version 15
+
+1. Introduction
+
+The XKM file format is the exchange format for XKB keyboard descriptions
+between the server and xkbcomp. Usually, the server forks off xkbcomp,
+xkbcomp compiles the XKM format from the given parameters.
+The resulting XKM file is put into a directory readable by the server and
+then parsed.
+
+The XKM format is little more than a binary dump of various XKB-specific
+structures and hence tied to the ABI of the server.
+
+                              ❧❧❧❧❧❧❧❧❧❧❧
+
+1.1 About this file format description
+
+This description was produced by analyzing the XKM parsing code. Parts of
+the file description present in the original format specification may be
+missing. This description thus cannot be a reference document for XKM
+implementations.
+
+No description of the meaning of the various fields is given here. Refer to
+the XKB protocol specification for more details.
+                              ❧❧❧❧❧❧❧❧❧❧❧
+
+2. Notations used in this document
+
+Notation for structures:
+
+┌───
+  Name of struct
+       name of field:          type or fixed value of field
+       name of field:          type or fixed value of field
+└───
+
+Data types are identical to those used in the X Protocol specification
+except where noted otherwise. Structs specific to XKM are prefixed with XKM,
+defines specific to the XKB protocol specification are prefixed with Xkb and
+their value is equivalent to that in the protocol specification.
+
+Multiple instances of a given type are denoted in the following form:
+       name of field:          LISTofFIELDTYPE
+
+Length specifiers for such fields are usually prefixed with num_. For
+example, a struct containing a num_foo of 8 and a 'foo' field contains 8
+structures of type 'foo'.
+
+Variable length padding is specified as pad(x), where x is the length of the
+data to be padded out to a multiple of 4 bytes. For example, given an x of
+10, pad(x) would be the remaining 2 bytes to pad the whole struct to 12
+bytes.
+
+A special notation is a variable content struct. In this case, the contents
+of the struct depend on the value of one or more specific fields.
+┌───
+  Name of struct
+       field:                  type or fixed value of field
+       field:                  type or fixed value of field
+       ───
+       field ⇒ value 1
+       ⇒
+               specific field:         type
+               specific field:         type
+       ───
+        field ⇒ value 2
+       ⇒
+               specific field:         type
+               specific field:         type
+└───
+This notation denotes that if field is of value 1, this struct contains the
+specific fields listed underneath value 1.
+
+                              ❧❧❧❧❧❧❧❧❧❧❧
+
+3. XKM Format
+
+The XKM format is a binary format with structs usually being padded to a
+multiple of 4 bytes. No provisions for endianess are provided, the parser is
+left to guess the endianess of the XKM file.
+
+                              ❧❧❧❧❧❧❧❧❧❧❧
+3.1 Common data types
+
+┌───
+  XKMCountedString
+       count:                  CARD16
+       string:                 count * CHAR
+       pad:                    pad(count + 2)
+└───
+
+XKMCountedString is used for user-readable identifiers. Prime example are
+the level names and the section names ("complete", "evdev(inet)", etc.)
+
+┌───
+  XKMGroupBits:                CARD8
+       group1                  0x1
+       group2                  0x2
+       group3                  0x4
+       group4                  0x8
+└───
+
+                              ❧❧❧❧❧❧❧❧❧❧❧
+
+3.2 Header and Table of Contents
+
+┌───
+  XKMHeader
+       version:                CARD8
+       identifier1:            'm'
+       identifier2:            'k'
+       idenfifier3:            'x'
+└───
+
+The XKM file format has a 4 byte header identifying the file and the XKM
+version. The header is followed by the table of contents indicating the
+sections present in this file.
+
+┌───
+  XKMFileInfo
+       type:                   CARD8
+       min_keycode:            CARD8
+       max_keycode:            CARD8
+       num_sectioninfo:        CARD8
+       present:                CARD16
+       pad:                    CARD16
+       sectioninfo:            LISTofXKMSectionInfo
+└───
+
+min_keycode and max_keycode specify the keycode range for this keyboard
+descriptions. The core protocol requires min_keycode always be equal to or
+greater than 8.
+
+┌───
+  XKMSectionInfo
+       type:                   CARD16
+               XkmTypesIndex           0
+               XkmCompatMapIndex       1
+               XkmSymbolsIndex         2
+               XkmIndicatorsIndex      3
+               XkmKeyNamesIndex        4
+               XkmGeometryIndex        5
+               XkmVirtualModsIndex     6
+       format:                 CARD16
+       size:                   CARD16
+       offset:                 CARD16
+└───
+
+Describes the section found in a chunk of a file. This struct is found
+_twice_ in the file per section, once as part of the XKMFileInfo, once at
+the beginning of the actual section (see offset).
+The type specifies the type of the section, the section is to be parsed
+according to this type.
+Size and offset specify the size in bytes and the offset into the file in
+bytes, respectively.
+
+3.3 Sections
+
+Each section resides at the offset specified in the XKMFileInfo sectioninfo.
+
+                              ❧❧❧❧❧❧❧❧❧❧❧
+
+3.3.1 XKMTypes
+
+An XKMTypes section describes the key types defined in a layout. Roughly
+speaking, a key type defines how many levels a given key has and which
+modifiers change to a particular level.
+
+┌───
+  XKMTypesSection
+       section_info:           XKMSectionInfo
+       name:                   XKMCountedString
+       num_types:              CARD16
+       pad:                    CARD16
+       types:                  LISTofXKMKeyType
+└───
+
+┌───
+  XKMKeyType
+       real_mods:              CARD8
+       num_levels:             CARD8
+       virt_mods:              CARD16
+       num_map_entries:        CARD8
+       num_level_names:        CARD8
+       perserve:               CARD8
+       pad:                    CARD8
+       map_entries:            LISTofXKMKTMapEntry
+       name:                   XKMCountedString
+       mods:                   LISTofXKMModsDesc
+       level_names:            LISXTofXKMCountedString
+└───
+
+The num_map_entries specifies the number of structs in both map_entries and mods. mods is only present if preserve is TRUE.
+
+┌───
+  XKMKTMapEntry
+       level:                  CARD8
+       real_mods:              CARD8
+       virt_mods:              CARD16
+└───
+
+┌───
+  XKMModsDesc
+       real_mods:              CARD8
+       pad:                    CARD8
+       virt_mods:              CARD16
+└───
+
+                              ❧❧❧❧❧❧❧❧❧❧❧
+3.3.2 XKMCompatMap
+
+An XKMCompatMap section describes the actions a keyboard may trigger. This
+ranges from the TerminateServer action to simple modifier bits.
+
+┌───
+  XKMCompatMap
+       section_info:           XKMSectionInfo
+       name:                   XKMCountedString
+       num_si:                 CARD16
+       group_mask:             XKMGroupBits
+       pad:                    CARD8
+       si:                     LISTofXKMSymInterpreterDesc
+       groups:                 LISTofXKMModsDesc
+└───
+
+One XKMModsDesc is present for each bit set in group_mask.
+
+┌───
+  XKMSymInterpretDesc
+       sym:                    CARD32
+       mods:                   CARD8
+       match:                  CARD8
+       virtual_mod:            CARD8
+       flags:                  CARD8
+       action_type:            CARD8
+       action_data:            XKMActionData
+└───
+
+Where the action is 7 bytes of CARD8 whose content is determined by
+action_type.
+
+┌───
+  XKMActionData:
+       pad0:                   CARD8
+       pad1:                   CARD16
+       pad2:                   CARD32
+       ───
+        action_type ⇒ XkbSA_SetMods ||
+        action_type ⇒ XkbSA_LatchMods ||
+        action_type ⇒ XkbSA_LockMods
+       ⇒
+               flags:                  CARD8
+               mask:                   CARD8
+               real_mods:              CARD8
+               vmods1:                 CARD8
+               vmods2:                 CARD8
+               pad:                    CARD16
+       ───
+        action_type ⇒ XkbSA_SetGroup ||
+        action_type ⇒ XkbSA_LatchGroup ||
+        action_type ⇒ XkbSA_LockGroup
+       ⇒
+               flags:                  CARD8
+               group_XXX:              CARD8
+               pad0:                   CARD8
+               pad1:                   CARD32
+       ───
+        action_type ⇒ XkbSA_MovePtr
+       ⇒
+               flags:                  CARD8
+               high_XXX:               CARD8
+               low_XXX:                CARD8
+               high_YYY:               CARD8
+               low_YYY:                CARD8
+               pad:                    CARD16
+       ───
+        action_type ⇒ XkbSA_PtrBtn ||
+        action_type ⇒ XkbSA_LockPtrBtn
+       ⇒
+               flags:                  CARD8
+               count:                  CARD8
+               button:                 CARD8
+               pad:                    CARD32
+       ───
+        action_type ⇒ XkbSA_DeviceBtn ||
+        action_type ⇒ XkbSA_LockLockPtrBtn
+       ⇒
+               flags:                  CARD8
+               count:                  CARD8
+               button:                 CARD8
+               device:                 CARD8
+               pad0:                   CARD8
+               pad1:                   CARD16
+       ───
+        action_type ⇒ XkbSA_SetPtrDflt
+       ⇒
+               flags:                  CARD8
+               affect:                 CARD8
+               valueXXX:               CARD8
+               pad0:                   CARD32
+       ───
+        action_type ⇒ XkbSA_ISOLock
+       ⇒
+               flags:                  CARD8
+               mask:                   CARD8
+               real_mods:              CARD8
+               group_XXX:              CARD8
+               affect:                 CARD8
+               vmods1:                 CARD8
+               vmods1:                 CARD8
+       ───
+        action_type ⇒ XkbSA_SwitchScreen
+       ⇒
+               flags:                  CARD8
+               screenXXX:              CARD8
+               pad0:                   CARD8
+               pad1:                   CARD32
+       ───
+        action_type ⇒ XkbSA_SetControls ||
+        action_type ⇒ XkbSA_LockControls
+       ⇒
+               flags:                  CARD8
+               ctrls3:                 CARD8
+               ctrls2:                 CARD8
+               ctrls1:                 CARD8
+               ctrls0:                 CARD8
+               pad:                    CARD16
+       ───
+        action_type ⇒ XkbSA_RedirectKey
+       ⇒
+               new_key:                CARD8
+               mods_mask:              CARD8
+               mods:                   CARD8
+               vmods_mask0:            CARD8
+               vmods_mask1:            CARD8
+               vmods0:                 CARD8
+               vmods1:                 CARD8
+       ───
+        action_type ⇒ XkbSA_DeviceValuator
+       ⇒
+               device:         CARD8
+               v1_what:                CARD8
+               v1_idx:                 CARD8
+               v1_value:               CARD8
+               v2_what:                CARD8
+               v2_idx:                 CARD8
+               v2_value:               CARD8
+               pad:                    CARD8
+       ───
+        action_type ⇒ XkbSA_XFree86Private ||
+        action_type ⇒ XkbSA_Terminate
+       ⇒
+               pad0:                   CARD8
+               pad1:                   CARD16
+               pad2:                   CARD32
+       ───
+        action_type ⇒ XkbSA_ActionMessage
+       ⇒
+               press_msg:              BOOL
+               release_msg:            BOOL
+               gen_event:              BOOL
+               message:                4 * CHAR
+└───
+
+Note: XkbSA_ActionMessage is currently unsupported and the contents are
+ignored.
+
+                              ❧❧❧❧❧❧❧❧❧❧❧
+3.3.3 XkmSymbols
+
+The symbols in a keymap define the actual keysyms each key may produce.
+
+┌───
+  XKMSymbols
+       section_info:           XKMSectionInfo
+       name:                   XKMCountedString
+       min_keycode:            CARD8
+       max_keycode:            CARD8
+       group_names_mask:       XKMGroupBits
+       num_vmod_maps:          CARD8
+       group_names:            LISTofXKMCountedString
+       keysyms:                XKMKeysymMapDesc
+       vmod_maps:              XKMVModMapDesc
+└───
+One group_name is present for each bit set in group_names_mask.
+The number of keysyms present is max_keycode - min_keycode + 1.
+
+┌───
+  XKMKeysymMapDesc
+       width:                  CARD8
+       num_groups:             CARD8
+       modifier_map:           CARD8
+       flags:                  CARD8
+       names:                  LISTofXKMCountedString
+       syms:                   LISTofCARD32
+       behavior:               XKMBehaviorDesc
+└───
+
+Presence of names is conditional on the XkmKeyHasTypes flag. The number of
+strings is equal to the number of group bits in group_names_mask in the
+preceeding XKMSymbols section.
+The number of elements in syms is equal to width * num_groups.
+Presence of behavior is conditional on the XkmKeyHasBehavior flag.
+
+┌───
+  XKMKeyBehaviorDesc
+       type:                   CARD8
+       data:                   CARD8
+       pad:                    CARD16
+└───
+
+┌───
+  XKMVModMapDesc
+       key:                    CARD8
+       pad:                    CARD8
+       vmods:                  CARD16
+└───
+
+                              ❧❧❧❧❧❧❧❧❧❧❧
+
+3.3.4 XKMIndicators
+
+┌───
+  XKMIndicators
+       section_info:           XKMSectionInfo
+       name:                   XKMCountedString
+       num_indicators:         CARD8
+       pad0:                   CARD8
+       pad1:                   CARD16
+       indicators:             LISTofXKMIndicatorMapDesc
+└───
+
+┌───
+  XKMIndicatorMapDesc
+       name:                   XKMCountedString
+       indicator:              CARD8
+       flags:                  CARD8
+       which_mods:             CARD8
+       real_mods:              CARD8
+       vmods:                  CARD16
+       which_groups:           CARD8
+       groups:                 CARD8
+       ctrls:                  CARD32
+└───
+                              ❧❧❧❧❧❧❧❧❧❧❧
+
+3.3.5 XKMKeyNames
+
+┌───
+  XKMKeyNames
+       section_info:           XKMSectionInfo
+       name:                   XKMCountedString
+       min_keycode:            CARD8
+       max_keycode:            CARD8
+       num_aliases:            CARD8
+       pad:                    CARD8
+       keynames:               LISTofXKMKeyname
+       aliases:                LISTofXKMKeyAlias
+└───
+
+keynames contains max_keycode - min_keycode + 1 entries.
+
+┌───
+  XkmKeyname
+       name:                   4 * CHAR8
+└───
+
+┌───
+  XkmKeyAlias
+       real:                   XkmKeyname
+       alias:                  XkmKeyname
+└───
+
+                              ❧❧❧❧❧❧❧❧❧❧❧
+
+3.3.5 XKMGeometry
+
+┌───
+  XKMGeometry
+       section_info:           XKMSectionInfo
+       name:                   XKMCountedString
+       width_mm:               CARD16
+       height_mm:              CARD16
+       base_color_ndx:         CARD8
+       label_color_ndx:        CARD8
+       num_properties:         CARD16
+       num_colors:             CARD16
+       num_shapes:             CARD16
+       num_sections:           CARD16
+       num_doodads:            CARD16
+       num_key_aliases:        CARD16
+       pad:                    CARD16
+       label_font:             XKMCountedString
+       properties:             LISTofXKMGeomProperty
+       colors:                 LISTofXKMCountedString
+       shapes:                 LISTofXKMGeomShape
+       sections:               LISTofXKMGeomSection
+       doodads:                LISTofXKMGeomDoodad
+       key_aliases:            LISTofXKMKeyAlias
+└───
+
+┌───
+  XKMGeomProperty
+       name:                   XKMCountedString
+       value:                  XKMCountedString
+
+└───
+
+┌───
+  XKMGeomShape
+       name:                   XKMCountedString
+       num_outlines:           CARD8
+       primary_idx:            CARD8
+       approx_idx:             CARD8
+       pad:                    CARD8
+       outlines:               LISTofXKMOutlineDesc
+└───
+
+┌───
+  XKMOutlineDesc
+       num_points:             CARD8
+       corner_radius:          CARD8
+       pad:                    CARD16
+       points:                 LISTofXKMPointDesc
+└───
+
+┌───
+  XKMPointDesc
+       x:                      INT16
+       y:                      INT16
+└───
+
+┌───
+  XKMGeomSection
+       name:                   XKMCountedString
+       top:                    INT16
+       left:                   INT16
+       width:                  CARD16
+       height:                 CARD16
+       angle:                  INT16
+       priority:               CARD8
+       num_rows:               CARD8
+       num_doodads:            CARD8
+       num_overlays:           CARD8
+       pad:                    CARD16
+       rows:                   LISTofXKMRowDesc
+       doodads:                LISTofXKMGeomDoodad
+       overlays:               LISTofXKMGeomOverlay
+└───
+
+┌───
+  XKMRowDesc
+       top:                    INT16
+       left:                   INT16
+       num_keys:               CARD8
+       vertical:               BOOL
+       pad:                    CARD16
+       keys:                   XKMKeyDesc
+└───
+
+┌───
+  XKMKeyDesc
+       name:                   XKMKeyname
+       gap:                    INT16
+       shape_idx:              CARD8
+       color_idx:              CARD8
+└───
+
+┌───
+  XKMGeomDoodad
+       name:                   XKMCountedString
+       type:                   CARD8
+       priority:               CARD8
+       top:                    INT16
+       left:                   INT16
+       pad1:                   CARD16
+       pad2:                   CARD32
+       pad3:                   CARD32
+       ───
+        type ⇒ XkbOutlineDoodad ||
+        type ⇒ XkbSolideDoodad
+       ⇒
+               type:                   CARD8
+               priority:               CARD8
+               top:                    INT16
+               left:                   INT16
+               angle:                  INT16
+               color_idx:              CARD8
+               shape_idx:              CARD8
+               pad0:                   CARD16
+               pad1:                   CARD32
+       ───
+        type ⇒ XkbTextDoodad
+       ⇒
+               type:                   CARD8
+               priority:               CARD8
+               top:                    INT16
+               left:                   INT16
+               angle:                  INT16
+               width:                  CARD16
+               height:                 CARD16
+               color_idx:              CARD8
+               pad0:                   CARD8
+               pad1:                   CARD16
+               text:                   XKMCountedString
+               font:                   XKMCountedString
+       ───
+        type ⇒ XkbIndicatorDoodad
+       ⇒
+               type:                   CARD8
+               priority:               CARD8
+               top:                    INT16
+               left:                   INT16
+               shape_idx:              CARD8
+               on_color_idx:           CARD8
+               off_color_idx:          CARD8
+               pad0:                   CARD8
+               pad1:                   CARD16
+               pad2:                   CARD32
+       ───
+        type ⇒ XkbLogoDoodad
+       ⇒
+               type:                   CARD8
+               priority:               CARD8
+               top:                    INT16
+               left:                   INT16
+               angle:                  INT16
+               color_idx:              CARD8
+               shape_idx:              CARD8
+               pad0:                   CARD16
+               pad1:                   CARD32
+               logo_name:              XKMCountedString
+└───
+
+WARNING: XKMGeomDoodad has variable length depending on the type.
+NOTE: The current server implementation does not use all fields of all
+structures.
+
+┌───
+  XKMOverlayDesc
+       name:                   XKMCountedString
+       num_rows:               CARD8
+       pad0:                   CARD8
+       pad1:                   CARD16
+       rows:                   LISTofXKMOverlayRowDesc
+└───
+
+┌───
+  XKMOverlayRowDesc
+       name:                   XKMCountedString
+       row_under:              CARD8
+       num_keys:               CARD8
+       pad:                    CARD16
+       keys:                   LISTofXKMOverlayKeyDesc
+└───
+
+┌───
+  XKMOverlayKeyDesc
+       over:                   XKMKeyname
+       under:                  XKMKeyname
+└───
+
+                              ❧❧❧❧❧❧❧❧❧❧❧
+
+3.3.6 XKMVirtualMods
+
+┌───
+  XKMOverlayRowDesc
+       section_info:           XKMSectionInfo
+       name:                   XKMCountedString
+       bound_mask:             SETofVMODBITS
+       named_mask:             SETofVMODBITS
+       vmods:                  LISTofCARD8
+       pad:                    pad(vmods)
+       names:                  LISTofXKMCountedString
+└───
+
+       VMODBITS:               CARD16
+
+Number of elements in vmods is equal to the number of bits set in
+bound_mask. The padding completes vmods to a multiple of 4 byte units.
+Number of elements in names is equal to the number of bits set in
+named_mask.