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"
92 #define XkmKeymapFile 22
93 #define XkmRulesFile 24
95 #define XkmTypesIndex 0
96 #define XkmCompatMapIndex 1
97 #define XkmSymbolsIndex 2
98 #define XkmKeyNamesIndex 4
99 #define XkmGeometryIndex 5
101 #define XkmTypesMask (1<<0)
102 #define XkmCompatMapMask (1<<1)
103 #define XkmSymbolsMask (1<<2)
104 #define XkmKeyNamesMask (1<<4)
105 #define XkmGeometryMask (1<<5)
107 #define XkmKeymapRequired (XkmCompatMapMask|XkmKeyNamesMask|XkmSymbolsMask|XkmTypesMask)
108 #define XkmKeymapOptional ((XkmTypesMask|XkmGeometryMask)&(~XkmKeymapRequired))
109 #define XkmKeymapLegal (XkmKeymapRequired|XkmKeymapOptional)
111 struct xkb_any_action {
116 struct xkb_mod_action {
124 struct xkb_group_action {
130 struct xkb_iso_action {
140 struct xkb_controls_action {
146 struct xkb_device_button_action {
154 struct xkb_device_valuator_action {
165 struct xkb_pointer_default_action {
172 struct xkb_switch_screen_action {
178 struct xkb_redirect_key_action {
180 xkb_keycode_t new_key;
187 struct xkb_pointer_action {
194 struct xkb_message_action {
200 struct xkb_pointer_button_action {
208 struct xkb_any_action any;
209 struct xkb_mod_action mods;
210 struct xkb_group_action group;
211 struct xkb_iso_action iso;
212 struct xkb_controls_action ctrls;
213 struct xkb_device_button_action devbtn;
214 struct xkb_device_valuator_action devval;
215 struct xkb_pointer_default_action dflt;
216 struct xkb_switch_screen_action screen;
217 struct xkb_redirect_key_action redirect; /* XXX wholly unnecessary? */
218 struct xkb_pointer_action ptr; /* XXX delete for DeviceValuator */
219 struct xkb_pointer_button_action btn; /* XXX delete for DeviceBtn */
220 struct xkb_message_action msg; /* XXX just delete */
225 uint32_t mask; /* effective mods */
230 struct xkb_kt_map_entry {
233 struct xkb_mods mods;
236 struct xkb_key_type {
237 struct xkb_mods mods;
239 unsigned char map_count;
240 struct xkb_kt_map_entry * map;
241 struct xkb_mods * preserve;
243 const char **level_names;
246 struct xkb_sym_interpret {
251 uint32_t virtual_mod;
252 union xkb_action act;
255 struct xkb_compat_map {
256 struct xkb_sym_interpret * sym_interpret;
257 struct xkb_mods groups[XkbNumKbdGroups];
258 unsigned short num_si;
259 unsigned short size_si;
263 unsigned char kt_index[XkbNumKbdGroups];
264 unsigned char group_info;
266 int *sym_index; /* per level/group index into 'syms' */
267 unsigned int *num_syms; /* per level/group */
269 unsigned int size_syms; /* size of 'syms' */
272 struct xkb_client_map {
273 unsigned char size_types;
274 unsigned char num_types;
275 struct xkb_key_type * types;
276 struct xkb_sym_map * key_sym_map;
277 unsigned char *modmap;
280 struct xkb_behavior {
285 struct xkb_server_map {
286 unsigned short num_acts;
287 unsigned short size_acts;
289 unsigned char * explicit;
291 union xkb_action *acts;
292 struct xkb_behavior *behaviors;
293 unsigned short *key_acts;
294 uint32_t vmods[XkbNumVirtualMods]; /* vmod -> mod mapping */
295 uint32_t *vmodmap; /* key -> vmod mapping */
299 struct xkb_indicator_map {
301 unsigned char which_groups;
302 unsigned char groups;
303 unsigned char which_mods;
304 struct xkb_mods mods;
308 struct xkb_indicator {
309 struct xkb_indicator_map maps[XkbNumIndicators];
312 struct xkb_key_name {
313 char name[XkbKeyNameLength];
316 struct xkb_key_alias {
317 char real[XkbKeyNameLength];
318 char alias[XkbKeyNameLength];
322 const char *vmods[XkbNumVirtualMods];
323 const char *indicators[XkbNumIndicators];
324 const char *groups[XkbNumKbdGroups];
325 struct xkb_key_name * keys;
326 struct xkb_key_alias * key_aliases;
328 xkb_keycode_t num_keys;
329 xkb_keycode_t num_key_aliases;
332 struct xkb_controls {
333 unsigned char num_groups;
334 unsigned char groups_wrap;
335 struct xkb_mods internal;
336 struct xkb_mods ignore_lock;
337 unsigned int enabled_ctrls;
338 unsigned short repeat_delay;
339 unsigned short repeat_interval;
340 unsigned short slow_keys_delay;
341 unsigned short debounce_delay;
342 unsigned short ax_options;
343 unsigned short ax_timeout;
344 unsigned short axt_opts_mask;
345 unsigned short axt_opts_values;
346 unsigned int axt_ctrls_mask;
347 unsigned int axt_ctrls_values;
348 unsigned char *per_key_repeat;
351 /* Common keyboard description structure */
356 unsigned short flags;
357 xkb_keycode_t min_key_code;
358 xkb_keycode_t max_key_code;
360 struct xkb_controls * ctrls;
361 struct xkb_server_map * server;
362 struct xkb_client_map * map;
363 struct xkb_indicator * indicators;
364 struct xkb_names * names;
365 struct xkb_compat_map * compat;
368 #define XkbNumGroups(g) ((g)&0x0f)
369 #define XkbOutOfRangeGroupInfo(g) ((g)&0xf0)
370 #define XkbOutOfRangeGroupAction(g) ((g)&0xc0)
371 #define XkbOutOfRangeGroupNumber(g) (((g)&0x30)>>4)
372 #define XkbSetGroupInfo(g,w,n) (((w)&0xc0)|(((n)&3)<<4)|((g)&0x0f))
373 #define XkbSetNumGroups(g,n) (((g)&0xf0)|((n)&0x0f))
375 #define XkbKeyGroupInfo(d,k) ((d)->map->key_sym_map[k].group_info)
376 #define XkbKeyNumGroups(d,k) (XkbNumGroups((d)->map->key_sym_map[k].group_info))
377 #define XkbKeyGroupWidth(d,k,g) (XkbKeyType(d,k,g)->num_levels)
378 #define XkbKeyGroupsWidth(d,k) ((d)->map->key_sym_map[k].width)
379 #define XkbKeyTypeIndex(d,k,g) ((d)->map->key_sym_map[k].kt_index[g&0x3])
380 #define XkbKeyType(d,k,g) (&(d)->map->types[XkbKeyTypeIndex(d,k,g)])
381 #define XkbKeyNumSyms(d,k,g,sl) \
382 ((d)->map->key_sym_map[k].num_syms[(g*XkbKeyGroupsWidth(d,k))+sl])
383 #define XkbKeySym(d,k,n) (&(d)->map->key_sym_map[k].syms[n])
384 #define XkbKeySymOffset(d,k,g,sl) \
385 ((d)->map->key_sym_map[k].sym_index[(g*XkbKeyGroupsWidth(d,k))+sl])
386 #define XkbKeySymEntry(d,k,g,sl) \
387 (XkbKeySym(d,k,XkbKeySymOffset(d,k,g,sl)))
388 #define XkbKeyHasActions(d,k) ((d)->server->key_acts[k]!=0)
389 #define XkbKeyNumActions(d,k) \
390 (XkbKeyHasActions(d,k)?(XkbKeyGroupsWidth(d,k)*XkbKeyNumGroups(d,k)):1)
391 #define XkbKeyActionsPtr(d,k) (&(d)->server->acts[(d)->server->key_acts[k]])
392 #define XkbKeyAction(d,k,n) \
393 (XkbKeyHasActions(d,k)?&XkbKeyActionsPtr(d,k)[n]:NULL)
394 #define XkbKeyActionEntry(d,k,sl,g) \
395 (XkbKeyHasActions(d,k)?\
396 XkbKeyAction(d,k,((XkbKeyGroupsWidth(d,k)*(g))+(sl))):NULL)
398 #define XkbKeycodeInRange(d,k) (((k)>=(d)->min_key_code)&&\
399 ((k)<=(d)->max_key_code))
400 #define XkbNumKeys(d) ((d)->max_key_code-(d)->min_key_code+1)
403 xkb_group_index_t base_group; /**< depressed */
404 xkb_group_index_t latched_group;
405 xkb_group_index_t locked_group;
406 xkb_group_index_t group; /**< effective */
408 xkb_mod_mask_t base_mods; /**< depressed */
409 xkb_mod_mask_t latched_mods;
410 xkb_mod_mask_t locked_mods;
411 xkb_mod_mask_t mods; /**< effective */
418 struct xkb_keymap *keymap;
421 typedef uint32_t xkb_atom_t;
423 #define XKB_ATOM_NONE 0
426 xkb_atom_intern(struct xkb_ctx *ctx, const char *string);
429 xkb_atom_strdup(struct xkb_ctx *ctx, xkb_atom_t atom);
432 xkb_atom_text(struct xkb_ctx *ctx, xkb_atom_t atom);
435 xkb_key_get_group(struct xkb_state *state, xkb_keycode_t key);
438 xkb_key_get_level(struct xkb_state *state, xkb_keycode_t key,
442 xkb_key_get_syms_by_level(struct xkb_keymap *keymap, xkb_keycode_t key,
443 unsigned int group, unsigned int level,
444 const xkb_keysym_t **syms_out);
447 xkb_ctx_take_file_id(struct xkb_ctx *ctx);
450 XkbcComputeEffectiveMap(struct xkb_keymap *keymap, struct xkb_key_type *type,
451 unsigned char *map_rtrn);
454 XkbcInitCanonicalKeyTypes(struct xkb_keymap *keymap, unsigned which,
458 _XkbcKSCheckCase(xkb_keysym_t sym);
460 #define _XkbKSLower (1 << 0)
461 #define _XkbKSUpper (1 << 1)
463 #define XkbcKSIsLower(k) (_XkbcKSCheckCase(k) & _XkbKSLower)
464 #define XkbcKSIsUpper(k) (_XkbcKSCheckCase(k) & _XkbKSUpper)
466 #define XkbKSIsKeypad(k) (((k) >= XK_KP_Space) && ((k) <= XK_KP_Equal))
468 #endif /* XKB_PRIV_H */