********************************************************/
+/*
+ * Copyright © 2009 Daniel Stone
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Daniel Stone <daniel@fooishbar.org>
+ */
+
#ifndef _XKBCOMMON_H_
#define _XKBCOMMON_H_
xkb_keycode_is_legal_ext(xkb->max_key_code))
+/**
+ * Names to compile a keymap with, also known as RMLVO. These names together
+ * should be the primary identifier for a keymap.
+ */
struct xkb_rule_names {
- const char * rules;
- const char * model;
- const char * layout;
- const char * variant;
- const char * options;
-};
-
-struct xkb_any_action {
- uint8_t type;
- uint8_t data[7];
-};
-
-struct xkb_mod_action {
- uint8_t type;
- uint8_t flags;
- uint8_t mask;
- uint8_t real_mods;
- uint16_t vmods;
-};
-
-struct xkb_group_action {
- uint8_t type;
- uint8_t flags;
- int16_t group;
-};
-
-struct xkb_iso_action {
- uint8_t type;
- uint8_t flags;
- uint8_t mask;
- uint8_t real_mods;
- uint8_t group;
- uint8_t affect;
- uint16_t vmods;
-};
-
-struct xkb_controls_action {
- uint8_t type;
- uint8_t flags;
- uint32_t ctrls;
-};
-
-struct xkb_device_button_action {
- uint8_t type;
- uint8_t flags;
- uint8_t count;
- uint8_t button;
- uint8_t device;
-};
-
-struct xkb_device_valuator_action {
- uint8_t type;
- uint8_t device;
- uint8_t v1_what;
- uint8_t v1_index;
- uint8_t v1_value;
- uint8_t v2_what;
- uint8_t v2_index;
- uint8_t v2_value;
-};
-
-struct xkb_pointer_default_action {
- uint8_t type;
- uint8_t flags;
- uint8_t affect;
- uint8_t value;
-};
-
-struct xkb_switch_screen_action {
- uint8_t type;
- uint8_t flags;
- uint8_t screen;
-};
-
-struct xkb_redirect_key_action {
- uint8_t type;
- xkb_keycode_t new_key;
- uint8_t mods_mask;
- uint8_t mods;
- uint16_t vmods_mask;
- uint16_t vmods;
-};
-
-struct xkb_pointer_action {
- uint8_t type;
- uint8_t flags;
- uint16_t x;
- uint16_t y;
-};
-
-struct xkb_message_action {
- uint8_t type;
- uint8_t flags;
- uint8_t message[6];
+ const char *rules;
+ const char *model;
+ const char *layout;
+ const char *variant;
+ const char *options;
};
-struct xkb_pointer_button_action {
- uint8_t type;
- uint8_t flags;
- uint8_t count;
- uint8_t button;
-};
-
-union xkb_action {
- struct xkb_any_action any;
- struct xkb_mod_action mods;
- struct xkb_group_action group;
- struct xkb_iso_action iso;
- struct xkb_controls_action ctrls;
- struct xkb_device_button_action devbtn;
- struct xkb_device_valuator_action devval;
- struct xkb_pointer_default_action dflt;
- struct xkb_switch_screen_action screen;
- struct xkb_redirect_key_action redirect; /* XXX wholly unnecessary? */
- struct xkb_pointer_action ptr; /* XXX delete for DeviceValuator */
- struct xkb_pointer_button_action btn; /* XXX delete for DeviceBtn */
- struct xkb_message_action msg; /* XXX just delete */
- unsigned char type;
-};
-
-struct xkb_mods {
- uint32_t mask; /* effective mods */
- uint32_t vmods;
- uint8_t real_mods;
-};
-
-struct xkb_kt_map_entry {
- int active;
- uint16_t level;
- struct xkb_mods mods;
-};
-
-struct xkb_key_type {
- struct xkb_mods mods;
- uint16_t num_levels;
- unsigned char map_count;
- struct xkb_kt_map_entry * map;
- struct xkb_mods * preserve;
- const char *name;
- const char **level_names;
-};
-
-struct xkb_sym_interpret {
- xkb_keysym_t sym;
- unsigned char flags;
- unsigned char match;
- uint8_t mods;
- uint32_t virtual_mod;
- union xkb_action act;
-};
-
-struct xkb_compat_map {
- struct xkb_sym_interpret * sym_interpret;
- struct xkb_mods groups[XkbNumKbdGroups];
- unsigned short num_si;
- unsigned short size_si;
-};
-
-struct xkb_sym_map {
- unsigned char kt_index[XkbNumKbdGroups];
- unsigned char group_info;
- unsigned char width;
- unsigned short offset;
-};
-
-#define XkbNumGroups(g) ((g)&0x0f)
-#define XkbOutOfRangeGroupInfo(g) ((g)&0xf0)
-#define XkbOutOfRangeGroupAction(g) ((g)&0xc0)
-#define XkbOutOfRangeGroupNumber(g) (((g)&0x30)>>4)
-#define XkbSetGroupInfo(g,w,n) (((w)&0xc0)|(((n)&3)<<4)|((g)&0x0f))
-#define XkbSetNumGroups(g,n) (((g)&0xf0)|((n)&0x0f))
-
-struct xkb_client_map {
- unsigned char size_types;
- unsigned char num_types;
- struct xkb_key_type * types;
-
- uint32_t size_syms;
- uint32_t num_syms;
- xkb_keysym_t *syms;
- struct xkb_sym_map * key_sym_map;
-
- unsigned char *modmap;
-};
-
-struct xkb_behavior {
- unsigned char type;
- unsigned char data;
-};
-
-struct xkb_server_map {
- unsigned short num_acts;
- unsigned short size_acts;
-
-#if defined(__cplusplus) || defined(c_plusplus)
- /* explicit is a C++ reserved word */
- unsigned char * c_explicit;
-#else
- unsigned char * explicit;
-#endif
-
- union xkb_action *acts;
- struct xkb_behavior *behaviors;
- unsigned short *key_acts;
- unsigned char *explicits;
- uint32_t vmods[XkbNumVirtualMods]; /* vmod -> mod mapping */
- uint32_t *vmodmap; /* key -> vmod mapping */
-};
-
-
-struct xkb_indicator_map {
- unsigned char flags;
- unsigned char which_groups;
- unsigned char groups;
- unsigned char which_mods;
- struct xkb_mods mods;
- unsigned int ctrls;
-};
-
-struct xkb_indicator {
- unsigned long phys_indicators;
- struct xkb_indicator_map maps[XkbNumIndicators];
-};
-
-struct xkb_key_name {
- char name[XkbKeyNameLength];
-};
-
-struct xkb_key_alias {
- char real[XkbKeyNameLength];
- char alias[XkbKeyNameLength];
-};
-
-struct xkb_names {
- const char *vmods[XkbNumVirtualMods];
- const char *indicators[XkbNumIndicators];
- const char *groups[XkbNumKbdGroups];
- struct xkb_key_name * keys;
- struct xkb_key_alias * key_aliases;
-
- xkb_keycode_t num_keys;
- xkb_keycode_t num_key_aliases;
-};
-
-struct xkb_controls {
- unsigned char num_groups;
- unsigned char groups_wrap;
- struct xkb_mods internal;
- struct xkb_mods ignore_lock;
- unsigned int enabled_ctrls;
- unsigned short repeat_delay;
- unsigned short repeat_interval;
- unsigned short slow_keys_delay;
- unsigned short debounce_delay;
- unsigned short ax_options;
- unsigned short ax_timeout;
- unsigned short axt_opts_mask;
- unsigned short axt_opts_values;
- unsigned int axt_ctrls_mask;
- unsigned int axt_ctrls_values;
- unsigned char *per_key_repeat;
-};
-
-/* Common keyboard description structure */
-struct xkb_desc {
- unsigned int refcnt;
- unsigned int defined;
- unsigned short flags;
- unsigned short device_spec;
- xkb_keycode_t min_key_code;
- xkb_keycode_t max_key_code;
-
- struct xkb_controls * ctrls;
- struct xkb_server_map * server;
- struct xkb_client_map * map;
- struct xkb_indicator * indicators;
- struct xkb_names * names;
- struct xkb_compat_map * compat;
-};
-
-#define XkbKeyGroupInfo(d,k) ((d)->map->key_sym_map[k].group_info)
-#define XkbKeyNumGroups(d,k) (XkbNumGroups((d)->map->key_sym_map[k].group_info))
-#define XkbKeyGroupWidth(d,k,g) (XkbKeyType(d,k,g)->num_levels)
-#define XkbKeyGroupsWidth(d,k) ((d)->map->key_sym_map[k].width)
-#define XkbKeyTypeIndex(d,k,g) ((d)->map->key_sym_map[k].kt_index[g&0x3])
-#define XkbKeyType(d,k,g) (&(d)->map->types[XkbKeyTypeIndex(d,k,g)])
-#define XkbKeyNumSyms(d,k) (XkbKeyGroupsWidth(d,k)*XkbKeyNumGroups(d,k))
-#define XkbKeySymsOffset(d,k) ((d)->map->key_sym_map[k].offset)
-#define XkbKeySymsPtr(d,k) (&(d)->map->syms[XkbKeySymsOffset(d,k)])
-#define XkbKeySym(d,k,n) (XkbKeySymsPtr(d,k)[n])
-#define XkbKeySymEntry(d,k,sl,g) \
- (XkbKeySym(d,k,((XkbKeyGroupsWidth(d,k)*(g))+(sl))))
-#define XkbKeyHasActions(d,k) ((d)->server->key_acts[k]!=0)
-#define XkbKeyNumActions(d,k) (XkbKeyHasActions(d,k)?XkbKeyNumSyms(d,k):1)
-#define XkbKeyActionsPtr(d,k) (&(d)->server->acts[(d)->server->key_acts[k]])
-#define XkbKeyAction(d,k,n) \
- (XkbKeyHasActions(d,k)?&XkbKeyActionsPtr(d,k)[n]:NULL)
-#define XkbKeyActionEntry(d,k,sl,g) \
- (XkbKeyHasActions(d,k)?\
- XkbKeyAction(d,k,((XkbKeyGroupsWidth(d,k)*(g))+(sl))):NULL)
-
-#define XkbKeycodeInRange(d,k) (((k)>=(d)->min_key_code)&&\
- ((k)<=(d)->max_key_code))
-#define XkbNumKeys(d) ((d)->max_key_code-(d)->min_key_code+1)
-
+/**
+ * Legacy names for the components of an XKB keymap, also known as KcCGST.
+ * This is only used in deprecated entrypoints which might be removed or
+ * shuffled off to a support library.
+ */
struct xkb_component_names {
- char * keymap;
- char * keycodes;
- char * types;
- char * compat;
- char * symbols;
+ char *keymap;
+ char *keycodes;
+ char *types;
+ char *compat;
+ char *symbols;
};
-struct xkb_component_name {
- unsigned short flags;
- char * name;
-};
-
-struct xkb_state {
- xkb_group_index_t base_group; /**< depressed */
- xkb_group_index_t latched_group;
- xkb_group_index_t locked_group;
- xkb_group_index_t group; /**< effective */
-
- xkb_mod_mask_t base_mods; /**< depressed */
- xkb_mod_mask_t latched_mods;
- xkb_mod_mask_t locked_mods;
- xkb_mod_mask_t mods; /**< effective */
-
- uint32_t leds;
-
- int refcnt;
- void *filters;
- int num_filters;
- struct xkb_desc *xkb;
-};
-
-#define XkbStateFieldFromRec(s) XkbBuildCoreState((s)->lookup_mods,(s)->group)
-#define XkbGrabStateFromRec(s) XkbBuildCoreState((s)->grab_mods,(s)->group)
-
-#define XkbNumGroups(g) ((g)&0x0f)
-#define XkbOutOfRangeGroupInfo(g) ((g)&0xf0)
-#define XkbOutOfRangeGroupAction(g) ((g)&0xc0)
-#define XkbOutOfRangeGroupNumber(g) (((g)&0x30)>>4)
-#define XkbSetNumGroups(g,n) (((g)&0xf0)|((n)&0x0f))
+/**
+ * Opaque state object, may only be created, accessed, manipulated and
+ * destroyed through the xkb_state_*() API.
+ */
+struct xkb_state;
_XFUNCPROTOBEGIN
* free()d, and a new one allocated with malloc().
*/
_X_EXPORT extern void
-xkb_canonicalise_components(struct xkb_component_names * names,
- const struct xkb_component_names * old);
+xkb_canonicalise_components(struct xkb_component_names *names,
+ const struct xkb_component_names *old);
/*
* Converts a keysym to a string; will return unknown Unicode codepoints
/*
+Copyright 1985, 1987, 1990, 1998 The Open Group
Copyright 2008 Dan Nicholson
Permission is hereby granted, free of charge, to any person obtaining a
authorization from the authors.
*/
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+Permission to use, copy, modify, and distribute this
+software and its documentation for any purpose and without
+fee is hereby granted, provided that the above copyright
+notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting
+documentation, and that the name of Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+********************************************************/
+
+/*
+ * Copyright © 2012 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Daniel Stone <daniel@fooishbar.org>
+ */
+
#ifndef _XKBCOMMONINT_H_
#define _XKBCOMMONINT_H_
xkb_keycode_t key,
unsigned int group);
+struct xkb_any_action {
+ uint8_t type;
+ uint8_t data[7];
+};
+
+struct xkb_mod_action {
+ uint8_t type;
+ uint8_t flags;
+ uint8_t mask;
+ uint8_t real_mods;
+ uint16_t vmods;
+};
+
+struct xkb_group_action {
+ uint8_t type;
+ uint8_t flags;
+ int16_t group;
+};
+
+struct xkb_iso_action {
+ uint8_t type;
+ uint8_t flags;
+ uint8_t mask;
+ uint8_t real_mods;
+ uint8_t group;
+ uint8_t affect;
+ uint16_t vmods;
+};
+
+struct xkb_controls_action {
+ uint8_t type;
+ uint8_t flags;
+ uint32_t ctrls;
+};
+
+struct xkb_device_button_action {
+ uint8_t type;
+ uint8_t flags;
+ uint8_t count;
+ uint8_t button;
+ uint8_t device;
+};
+
+struct xkb_device_valuator_action {
+ uint8_t type;
+ uint8_t device;
+ uint8_t v1_what;
+ uint8_t v1_index;
+ uint8_t v1_value;
+ uint8_t v2_what;
+ uint8_t v2_index;
+ uint8_t v2_value;
+};
+
+struct xkb_pointer_default_action {
+ uint8_t type;
+ uint8_t flags;
+ uint8_t affect;
+ uint8_t value;
+};
+
+struct xkb_switch_screen_action {
+ uint8_t type;
+ uint8_t flags;
+ uint8_t screen;
+};
+
+struct xkb_redirect_key_action {
+ uint8_t type;
+ xkb_keycode_t new_key;
+ uint8_t mods_mask;
+ uint8_t mods;
+ uint16_t vmods_mask;
+ uint16_t vmods;
+};
+
+struct xkb_pointer_action {
+ uint8_t type;
+ uint8_t flags;
+ uint16_t x;
+ uint16_t y;
+};
+
+struct xkb_message_action {
+ uint8_t type;
+ uint8_t flags;
+ uint8_t message[6];
+};
+
+struct xkb_pointer_button_action {
+ uint8_t type;
+ uint8_t flags;
+ uint8_t count;
+ uint8_t button;
+};
+
+union xkb_action {
+ struct xkb_any_action any;
+ struct xkb_mod_action mods;
+ struct xkb_group_action group;
+ struct xkb_iso_action iso;
+ struct xkb_controls_action ctrls;
+ struct xkb_device_button_action devbtn;
+ struct xkb_device_valuator_action devval;
+ struct xkb_pointer_default_action dflt;
+ struct xkb_switch_screen_action screen;
+ struct xkb_redirect_key_action redirect; /* XXX wholly unnecessary? */
+ struct xkb_pointer_action ptr; /* XXX delete for DeviceValuator */
+ struct xkb_pointer_button_action btn; /* XXX delete for DeviceBtn */
+ struct xkb_message_action msg; /* XXX just delete */
+ unsigned char type;
+};
+
+struct xkb_mods {
+ uint32_t mask; /* effective mods */
+ uint32_t vmods;
+ uint8_t real_mods;
+};
+
+struct xkb_kt_map_entry {
+ int active;
+ uint16_t level;
+ struct xkb_mods mods;
+};
+
+struct xkb_key_type {
+ struct xkb_mods mods;
+ uint16_t num_levels;
+ unsigned char map_count;
+ struct xkb_kt_map_entry * map;
+ struct xkb_mods * preserve;
+ const char *name;
+ const char **level_names;
+};
+
+struct xkb_sym_interpret {
+ xkb_keysym_t sym;
+ unsigned char flags;
+ unsigned char match;
+ uint8_t mods;
+ uint32_t virtual_mod;
+ union xkb_action act;
+};
+
+struct xkb_compat_map {
+ struct xkb_sym_interpret * sym_interpret;
+ struct xkb_mods groups[XkbNumKbdGroups];
+ unsigned short num_si;
+ unsigned short size_si;
+};
+
+struct xkb_sym_map {
+ unsigned char kt_index[XkbNumKbdGroups];
+ unsigned char group_info;
+ unsigned char width;
+ unsigned short offset;
+};
+
+#define XkbNumGroups(g) ((g)&0x0f)
+#define XkbOutOfRangeGroupInfo(g) ((g)&0xf0)
+#define XkbOutOfRangeGroupAction(g) ((g)&0xc0)
+#define XkbOutOfRangeGroupNumber(g) (((g)&0x30)>>4)
+#define XkbSetGroupInfo(g,w,n) (((w)&0xc0)|(((n)&3)<<4)|((g)&0x0f))
+#define XkbSetNumGroups(g,n) (((g)&0xf0)|((n)&0x0f))
+
+struct xkb_client_map {
+ unsigned char size_types;
+ unsigned char num_types;
+ struct xkb_key_type * types;
+
+ uint32_t size_syms;
+ uint32_t num_syms;
+ xkb_keysym_t *syms;
+ struct xkb_sym_map * key_sym_map;
+
+ unsigned char *modmap;
+};
+
+struct xkb_behavior {
+ unsigned char type;
+ unsigned char data;
+};
+
+struct xkb_server_map {
+ unsigned short num_acts;
+ unsigned short size_acts;
+
+#if defined(__cplusplus) || defined(c_plusplus)
+ /* explicit is a C++ reserved word */
+ unsigned char * c_explicit;
+#else
+ unsigned char * explicit;
+#endif
+
+ union xkb_action *acts;
+ struct xkb_behavior *behaviors;
+ unsigned short *key_acts;
+ unsigned char *explicits;
+ uint32_t vmods[XkbNumVirtualMods]; /* vmod -> mod mapping */
+ uint32_t *vmodmap; /* key -> vmod mapping */
+};
+
+
+struct xkb_indicator_map {
+ unsigned char flags;
+ unsigned char which_groups;
+ unsigned char groups;
+ unsigned char which_mods;
+ struct xkb_mods mods;
+ unsigned int ctrls;
+};
+
+struct xkb_indicator {
+ unsigned long phys_indicators;
+ struct xkb_indicator_map maps[XkbNumIndicators];
+};
+
+struct xkb_key_name {
+ char name[XkbKeyNameLength];
+};
+
+struct xkb_key_alias {
+ char real[XkbKeyNameLength];
+ char alias[XkbKeyNameLength];
+};
+
+struct xkb_names {
+ const char *vmods[XkbNumVirtualMods];
+ const char *indicators[XkbNumIndicators];
+ const char *groups[XkbNumKbdGroups];
+ struct xkb_key_name * keys;
+ struct xkb_key_alias * key_aliases;
+
+ xkb_keycode_t num_keys;
+ xkb_keycode_t num_key_aliases;
+};
+
+struct xkb_controls {
+ unsigned char num_groups;
+ unsigned char groups_wrap;
+ struct xkb_mods internal;
+ struct xkb_mods ignore_lock;
+ unsigned int enabled_ctrls;
+ unsigned short repeat_delay;
+ unsigned short repeat_interval;
+ unsigned short slow_keys_delay;
+ unsigned short debounce_delay;
+ unsigned short ax_options;
+ unsigned short ax_timeout;
+ unsigned short axt_opts_mask;
+ unsigned short axt_opts_values;
+ unsigned int axt_ctrls_mask;
+ unsigned int axt_ctrls_values;
+ unsigned char *per_key_repeat;
+};
+
+/* Common keyboard description structure */
+struct xkb_desc {
+ unsigned int refcnt;
+ unsigned int defined;
+ unsigned short flags;
+ unsigned short device_spec;
+ xkb_keycode_t min_key_code;
+ xkb_keycode_t max_key_code;
+
+ struct xkb_controls * ctrls;
+ struct xkb_server_map * server;
+ struct xkb_client_map * map;
+ struct xkb_indicator * indicators;
+ struct xkb_names * names;
+ struct xkb_compat_map * compat;
+};
+
+#define XkbKeyGroupInfo(d,k) ((d)->map->key_sym_map[k].group_info)
+#define XkbKeyNumGroups(d,k) (XkbNumGroups((d)->map->key_sym_map[k].group_info))
+#define XkbKeyGroupWidth(d,k,g) (XkbKeyType(d,k,g)->num_levels)
+#define XkbKeyGroupsWidth(d,k) ((d)->map->key_sym_map[k].width)
+#define XkbKeyTypeIndex(d,k,g) ((d)->map->key_sym_map[k].kt_index[g&0x3])
+#define XkbKeyType(d,k,g) (&(d)->map->types[XkbKeyTypeIndex(d,k,g)])
+#define XkbKeyNumSyms(d,k) (XkbKeyGroupsWidth(d,k)*XkbKeyNumGroups(d,k))
+#define XkbKeySymsOffset(d,k) ((d)->map->key_sym_map[k].offset)
+#define XkbKeySymsPtr(d,k) (&(d)->map->syms[XkbKeySymsOffset(d,k)])
+#define XkbKeySym(d,k,n) (XkbKeySymsPtr(d,k)[n])
+#define XkbKeySymEntry(d,k,sl,g) \
+ (XkbKeySym(d,k,((XkbKeyGroupsWidth(d,k)*(g))+(sl))))
+#define XkbKeyHasActions(d,k) ((d)->server->key_acts[k]!=0)
+#define XkbKeyNumActions(d,k) (XkbKeyHasActions(d,k)?XkbKeyNumSyms(d,k):1)
+#define XkbKeyActionsPtr(d,k) (&(d)->server->acts[(d)->server->key_acts[k]])
+#define XkbKeyAction(d,k,n) \
+ (XkbKeyHasActions(d,k)?&XkbKeyActionsPtr(d,k)[n]:NULL)
+#define XkbKeyActionEntry(d,k,sl,g) \
+ (XkbKeyHasActions(d,k)?\
+ XkbKeyAction(d,k,((XkbKeyGroupsWidth(d,k)*(g))+(sl))):NULL)
+
+#define XkbKeycodeInRange(d,k) (((k)>=(d)->min_key_code)&&\
+ ((k)<=(d)->max_key_code))
+#define XkbNumKeys(d) ((d)->max_key_code-(d)->min_key_code+1)
+
+struct xkb_component_name {
+ unsigned short flags;
+ char * name;
+};
+
+struct xkb_state {
+ xkb_group_index_t base_group; /**< depressed */
+ xkb_group_index_t latched_group;
+ xkb_group_index_t locked_group;
+ xkb_group_index_t group; /**< effective */
+
+ xkb_mod_mask_t base_mods; /**< depressed */
+ xkb_mod_mask_t latched_mods;
+ xkb_mod_mask_t locked_mods;
+ xkb_mod_mask_t mods; /**< effective */
+
+ uint32_t leds;
+
+ int refcnt;
+ void *filters;
+ int num_filters;
+ struct xkb_desc *xkb;
+};
+
+#define XkbStateFieldFromRec(s) XkbBuildCoreState((s)->lookup_mods,(s)->group)
+#define XkbGrabStateFromRec(s) XkbBuildCoreState((s)->grab_mods,(s)->group)
+
+#define XkbNumGroups(g) ((g)&0x0f)
+#define XkbOutOfRangeGroupInfo(g) ((g)&0xf0)
+#define XkbOutOfRangeGroupAction(g) ((g)&0xc0)
+#define XkbOutOfRangeGroupNumber(g) (((g)&0x30)>>4)
+#define XkbSetNumGroups(g,n) (((g)&0xf0)|((n)&0x0f))
+
#endif /* _XKBCOMMONINT_H_ */