2 Copyright 1985, 1987, 1990, 1998 The Open Group
3 Copyright 2008 Dan Nicholson
5 Permission is hereby granted, free of charge, to any person obtaining a
6 copy of this software and associated documentation files (the "Software"),
7 to deal in the Software without restriction, including without limitation
8 the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 and/or sell copies of the Software, and to permit persons to whom the
10 Software is furnished to do so, subject to the following conditions:
12 The above copyright notice and this permission notice shall be included in
13 all copies or substantial portions of the Software.
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
19 ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 Except as contained in this notice, the names of the authors or their
23 institutions shall not be used in advertising or otherwise to promote the
24 sale, use or other dealings in this Software without prior written
25 authorization from the authors.
28 /************************************************************
29 Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
31 Permission to use, copy, modify, and distribute this
32 software and its documentation for any purpose and without
33 fee is hereby granted, provided that the above copyright
34 notice appear in all copies and that both that copyright
35 notice and this permission notice appear in supporting
36 documentation, and that the name of Silicon Graphics not be
37 used in advertising or publicity pertaining to distribution
38 of the software without specific prior written permission.
39 Silicon Graphics makes no representation about the suitability
40 of this software for any purpose. It is provided "as is"
41 without any express or implied warranty.
43 SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
44 SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
45 AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
46 GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
47 DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
48 DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
49 OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
50 THE USE OR PERFORMANCE OF THIS SOFTWARE.
52 ********************************************************/
55 * Copyright © 2012 Intel Corporation
57 * Permission is hereby granted, free of charge, to any person obtaining a
58 * copy of this software and associated documentation files (the "Software"),
59 * to deal in the Software without restriction, including without limitation
60 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
61 * and/or sell copies of the Software, and to permit persons to whom the
62 * Software is furnished to do so, subject to the following conditions:
64 * The above copyright notice and this permission notice (including the next
65 * paragraph) shall be included in all copies or substantial portions of the
68 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
69 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
70 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
71 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
72 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
73 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
74 * DEALINGS IN THE SOFTWARE.
76 * Author: Daniel Stone <daniel@fooishbar.org>
85 #include <X11/extensions/XKB.h>
88 #include "xkbcommon/xkbcommon.h"
93 /* The top level file which includes the other component files. */
94 FILE_TYPE_KEYMAP = (1 << 0),
96 /* Component files. */
97 FILE_TYPE_TYPES = (1 << 1),
98 FILE_TYPE_COMPAT = (1 << 2),
99 FILE_TYPE_SYMBOLS = (1 << 3),
100 FILE_TYPE_KEYCODES = (1 << 4),
101 FILE_TYPE_GEOMETRY = (1 << 5),
103 /* This one doesn't mix with the others, but useful here as well. */
104 FILE_TYPE_RULES = (1 << 6),
107 /* Files needed for a complete keymap. */
108 #define REQUIRED_FILE_TYPES (FILE_TYPE_TYPES | FILE_TYPE_COMPAT | FILE_TYPE_SYMBOLS | FILE_TYPE_KEYCODES)
109 #define LEGAL_FILE_TYPES (FILE_TYPE_GEOMETRY | REQUIRED_FILE_TYPES)
112 * Legacy names for the components of an XKB keymap, also known as KcCGST.
114 struct xkb_component_names {
121 struct xkb_any_action {
126 struct xkb_mod_action {
134 struct xkb_group_action {
140 struct xkb_iso_action {
150 struct xkb_controls_action {
156 struct xkb_device_button_action {
164 struct xkb_device_valuator_action {
175 struct xkb_pointer_default_action {
182 struct xkb_switch_screen_action {
188 struct xkb_redirect_key_action {
190 xkb_keycode_t new_key;
197 struct xkb_pointer_action {
204 struct xkb_message_action {
210 struct xkb_pointer_button_action {
218 struct xkb_any_action any;
219 struct xkb_mod_action mods;
220 struct xkb_group_action group;
221 struct xkb_iso_action iso;
222 struct xkb_controls_action ctrls;
223 struct xkb_device_button_action devbtn;
224 struct xkb_device_valuator_action devval;
225 struct xkb_pointer_default_action dflt;
226 struct xkb_switch_screen_action screen;
227 struct xkb_redirect_key_action redirect; /* XXX wholly unnecessary? */
228 struct xkb_pointer_action ptr; /* XXX delete for DeviceValuator */
229 struct xkb_pointer_button_action btn; /* XXX delete for DeviceBtn */
230 struct xkb_message_action msg; /* XXX just delete */
235 uint32_t mask; /* effective mods */
240 struct xkb_kt_map_entry {
243 struct xkb_mods mods;
246 struct xkb_key_type {
247 struct xkb_mods mods;
249 darray(struct xkb_kt_map_entry) map;
250 struct xkb_mods * preserve;
255 struct xkb_sym_interpret {
260 uint32_t virtual_mod;
261 union xkb_action act;
264 struct xkb_compat_map {
265 darray(struct xkb_sym_interpret) sym_interpret;
266 struct xkb_mods groups[XkbNumKbdGroups];
270 unsigned char kt_index[XkbNumKbdGroups];
271 unsigned char group_info;
273 int *sym_index; /* per level/group index into 'syms' */
274 unsigned int *num_syms; /* per level/group */
275 darray(xkb_keysym_t) syms;
278 struct xkb_client_map {
279 darray(struct xkb_key_type) types;
280 darray(struct xkb_sym_map) key_sym_map;
281 unsigned char *modmap;
284 struct xkb_behavior {
289 struct xkb_server_map {
290 unsigned char * explicit;
292 darray(union xkb_action) acts;
293 darray(size_t ) key_acts; /* acts[key_acts[keycode]] */
294 struct xkb_behavior *behaviors;
295 uint32_t vmods[XkbNumVirtualMods]; /* vmod -> mod mapping */
296 uint32_t *vmodmap; /* key -> vmod mapping */
300 struct xkb_indicator_map {
302 unsigned char which_groups;
303 unsigned char groups;
304 unsigned char which_mods;
305 struct xkb_mods mods;
309 struct xkb_indicator {
310 struct xkb_indicator_map maps[XkbNumIndicators];
313 struct xkb_key_name {
314 char name[XkbKeyNameLength];
317 struct xkb_key_alias {
318 char real[XkbKeyNameLength];
319 char alias[XkbKeyNameLength];
323 char *vmods[XkbNumVirtualMods];
324 char *indicators[XkbNumIndicators];
325 char *groups[XkbNumKbdGroups];
327 darray(struct xkb_key_name) keys;
328 darray(struct xkb_key_alias) key_aliases;
331 struct xkb_controls {
332 unsigned char num_groups;
333 /* unsigned char groups_wrap; */
334 /* struct xkb_mods internal; */
335 /* struct xkb_mods ignore_lock; */
336 unsigned int enabled_ctrls;
337 /* unsigned short repeat_delay; */
338 /* unsigned short repeat_interval; */
339 /* unsigned short slow_keys_delay; */
340 /* unsigned short debounce_delay; */
341 /* unsigned short ax_options; */
342 /* unsigned short ax_timeout; */
343 /* unsigned short axt_opts_mask; */
344 /* unsigned short axt_opts_values; */
345 /* unsigned int axt_ctrls_mask; */
346 /* unsigned int axt_ctrls_values; */
347 unsigned char *per_key_repeat;
350 /* Common keyboard description structure */
352 struct xkb_context *ctx;
355 unsigned short flags;
356 xkb_keycode_t min_key_code;
357 xkb_keycode_t max_key_code;
359 struct xkb_controls * ctrls;
360 struct xkb_server_map * server;
361 struct xkb_client_map * map;
362 struct xkb_indicator * indicators;
363 struct xkb_names * names;
364 struct xkb_compat_map * compat;
367 #define XkbNumGroups(g) ((g) & 0x0f)
368 #define XkbOutOfRangeGroupInfo(g) ((g) & 0xf0)
369 #define XkbOutOfRangeGroupAction(g) ((g) & 0xc0)
370 #define XkbOutOfRangeGroupNumber(g) (((g) & 0x30) >> 4)
371 #define XkbSetGroupInfo(g, w, n) (((w) & 0xc0) | (((n) & 3) << 4) | ((g) & 0x0f))
372 #define XkbSetNumGroups(g, n) (((g) & 0xf0) | ((n) & 0x0f))
374 #define XkbKeyGroupInfo(d, k) \
375 (darray_item((d)->map->key_sym_map, k).group_info)
376 #define XkbKeyNumGroups(d, k) \
377 (XkbNumGroups(darray_item((d)->map->key_sym_map, k).group_info))
378 #define XkbKeyGroupWidth(d, k, g) \
379 (XkbKeyType(d, k, g)->num_levels)
380 #define XkbKeyGroupsWidth(d, k) \
381 (darray_item((d)->map->key_sym_map, k).width)
382 #define XkbKeyTypeIndex(d, k, g) \
383 (darray_item((d)->map->key_sym_map, k).kt_index[g & 0x3])
384 #define XkbKeyType(d, k, g) \
385 (&darray_item((d)->map->types, XkbKeyTypeIndex(d, k, g)))
386 #define XkbKeyNumSyms(d, k, g, sl) \
387 (darray_item((d)->map->key_sym_map, k).num_syms[(g * XkbKeyGroupsWidth(d, k)) + sl])
388 #define XkbKeySym(d, k, n) \
389 (&darray_item(darray_item((d)->map->key_sym_map, k).syms, n))
390 #define XkbKeySymOffset(d, k, g, sl) \
391 (darray_item((d)->map->key_sym_map, k).sym_index[(g * XkbKeyGroupsWidth(d, k)) + sl])
392 #define XkbKeySymEntry(d, k, g, sl) \
393 (XkbKeySym(d, k, XkbKeySymOffset(d, k, g, sl)))
394 #define XkbKeyHasActions(d, k) \
395 (darray_item((d)->server->key_acts, k) != 0)
396 #define XkbKeyNumActions(d, k) \
397 (XkbKeyHasActions(d, k) ? \
398 (XkbKeyGroupsWidth(d, k) * XkbKeyNumGroups(d, k)) : \
400 #define XkbKeyActionsPtr(d, k) \
401 (darray_mem((d)->server->acts, darray_item((d)->server->key_acts, k)))
402 #define XkbKeyAction(d, k, n) \
403 (XkbKeyHasActions(d, k) ? &XkbKeyActionsPtr(d, k)[n] : NULL)
404 #define XkbKeyActionEntry(d, k, sl, g) \
405 (XkbKeyHasActions(d, k) ? \
406 XkbKeyAction(d, k, ((XkbKeyGroupsWidth(d, k) * (g)) + (sl))) : \
409 #define XkbKeycodeInRange(d, k) \
410 (((k) >= (d)->min_key_code) && ((k) <= (d)->max_key_code))
414 typedef uint32_t xkb_atom_t;
416 #define XKB_ATOM_NONE 0
419 xkb_atom_intern(struct xkb_context *ctx, const char *string);
422 xkb_atom_strdup(struct xkb_context *ctx, xkb_atom_t atom);
425 xkb_atom_text(struct xkb_context *ctx, xkb_atom_t atom);
428 xkb_key_get_group(struct xkb_state *state, xkb_keycode_t key);
431 xkb_key_get_level(struct xkb_state *state, xkb_keycode_t key,
435 xkb_key_get_syms_by_level(struct xkb_keymap *keymap, xkb_keycode_t key,
436 unsigned int group, unsigned int level,
437 const xkb_keysym_t **syms_out);
440 * Canonicalises component names by prepending the relevant component from
441 * 'old' to the one in 'names' when the latter has a leading '+' or '|', and
442 * by replacing a '%' with the relevant component, e.g.:
445 * ------------------------------------------
448 * foo+%|baz bar foo+bar|baz
450 * If a component in names needs to be modified, the existing value will be
451 * free()d, and a new one allocated with malloc().
454 xkb_canonicalise_components(struct xkb_component_names *names,
455 const struct xkb_component_names *old);
458 * Deprecated entrypoint for legacy users who need to be able to compile
459 * XKB keymaps by KcCGST (Keycodes + Compat + Geometry + Symbols + Types)
462 * You should not use this unless you are the X server. This entrypoint
463 * may well disappear in future releases. Please, please, don't use it.
465 * Geometry will be ignored since xkbcommon does not support it in any way.
468 xkb_map_new_from_kccgst(struct xkb_context *ctx,
469 const struct xkb_component_names *kccgst,
470 enum xkb_map_compile_flags flags);
473 xkb_context_take_file_id(struct xkb_context *ctx);
476 XkbcComputeEffectiveMap(struct xkb_keymap *keymap, struct xkb_key_type *type,
477 unsigned char *map_rtrn);
480 XkbcInitCanonicalKeyTypes(struct xkb_keymap *keymap, unsigned which,
484 _XkbcKSCheckCase(xkb_keysym_t sym);
487 XkbcFindKeycodeByName(struct xkb_keymap *keymap, const char *name,
490 #define _XkbKSLower (1 << 0)
491 #define _XkbKSUpper (1 << 1)
493 #define XkbcKSIsLower(k) (_XkbcKSCheckCase(k) & _XkbKSLower)
494 #define XkbcKSIsUpper(k) (_XkbcKSCheckCase(k) & _XkbKSUpper)
496 #define XkbKSIsKeypad(k) (((k) >= XKB_KEY_KP_Space) && ((k) <= XKB_KEY_KP_Equal))
498 #endif /* XKB_PRIV_H */