diff options
author | Ran Benita <ran234@gmail.com> | 2013-03-03 21:35:43 +0200 |
---|---|---|
committer | Daniel Stone <daniel@fooishbar.org> | 2013-03-18 22:20:04 +0000 |
commit | 71eb033eefe2f0f2a2d3fc7c54ebd5f0d4c2d3f5 (patch) | |
tree | 0bb26279c1b680a1e0cb8b8d946f85b3edaaf235 | |
parent | 82c3e3936078e2f8ea738615d2fdb0812a2f521b (diff) |
Move a couple of general keymap functions from keycodes.c
To get a key by name and resolve an alias - this makes sense for
everyone.
Signed-off-by: Ran Benita <ran234@gmail.com>
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | src/keymap.c | 30 | ||||
-rw-r--r-- | src/keymap.h | 16 | ||||
-rw-r--r-- | src/xkbcomp/action.c | 1 | ||||
-rw-r--r-- | src/xkbcomp/keycodes.c | 41 | ||||
-rw-r--r-- | src/xkbcomp/keycodes.h | 37 | ||||
-rw-r--r-- | src/xkbcomp/symbols.c | 8 |
7 files changed, 47 insertions, 87 deletions
diff --git a/Makefile.am b/Makefile.am index 02a93b2..87b2b51 100644 --- a/Makefile.am +++ b/Makefile.am @@ -36,7 +36,6 @@ libxkbcommon_la_SOURCES = \ src/xkbcomp/include.c \ src/xkbcomp/include.h \ src/xkbcomp/keycodes.c \ - src/xkbcomp/keycodes.h \ src/xkbcomp/keymap.c \ src/xkbcomp/keymap-dump.c \ src/xkbcomp/parser.y \ diff --git a/src/keymap.c b/src/keymap.c index 9c581d5..758a35b 100644 --- a/src/keymap.c +++ b/src/keymap.c @@ -477,3 +477,33 @@ xkb_keymap_key_repeats(struct xkb_keymap *keymap, xkb_keycode_t kc) return key->repeats; } + +struct xkb_key * +XkbKeyByName(struct xkb_keymap *keymap, xkb_atom_t name, bool use_aliases) +{ + struct xkb_key *key; + + xkb_foreach_key(key, keymap) + if (key->name == name) + return key; + + if (use_aliases) { + xkb_atom_t new_name = XkbResolveKeyAlias(keymap, name); + if (new_name != XKB_ATOM_NONE) + return XkbKeyByName(keymap, new_name, false); + } + + return NULL; +} + +xkb_atom_t +XkbResolveKeyAlias(struct xkb_keymap *keymap, xkb_atom_t name) +{ + const struct xkb_key_alias *alias; + + darray_foreach(alias, keymap->key_aliases) + if (name == alias->alias) + return alias->real; + + return XKB_ATOM_NONE; +} diff --git a/src/keymap.h b/src/keymap.h index 30733bf..f4b80eb 100644 --- a/src/keymap.h +++ b/src/keymap.h @@ -403,6 +403,11 @@ struct xkb_keymap { char *compat_section_name; }; +#define xkb_foreach_key(iter, keymap) \ + for (iter = keymap->keys + keymap->min_key_code; \ + iter <= keymap->keys + keymap->max_key_code; \ + iter++) + static inline const struct xkb_key * XkbKey(struct xkb_keymap *keymap, xkb_keycode_t kc) { @@ -411,17 +416,18 @@ XkbKey(struct xkb_keymap *keymap, xkb_keycode_t kc) return &keymap->keys[kc]; } -#define xkb_foreach_key(iter, keymap) \ - for (iter = keymap->keys + keymap->min_key_code; \ - iter <= keymap->keys + keymap->max_key_code; \ - iter++) - static inline xkb_level_index_t XkbKeyGroupWidth(const struct xkb_key *key, xkb_layout_index_t layout) { return key->groups[layout].type->num_levels; } +struct xkb_key * +XkbKeyByName(struct xkb_keymap *keymap, xkb_atom_t name, bool use_aliases); + +xkb_atom_t +XkbResolveKeyAlias(struct xkb_keymap *keymap, xkb_atom_t name); + xkb_layout_index_t wrap_group_into_range(int32_t group, xkb_layout_index_t num_groups, diff --git a/src/xkbcomp/action.c b/src/xkbcomp/action.c index d45b143..3c5c5c7 100644 --- a/src/xkbcomp/action.c +++ b/src/xkbcomp/action.c @@ -55,7 +55,6 @@ #include "text.h" #include "expr.h" #include "action.h" -#include "keycodes.h" static const ExprDef constTrue = { .common = { .type = STMT_EXPR, .next = NULL }, diff --git a/src/xkbcomp/keycodes.c b/src/xkbcomp/keycodes.c index 5b262d9..e25d141 100644 --- a/src/xkbcomp/keycodes.c +++ b/src/xkbcomp/keycodes.c @@ -27,7 +27,6 @@ #include "xkbcomp-priv.h" #include "text.h" #include "expr.h" -#include "keycodes.h" #include "include.h" /* @@ -625,7 +624,7 @@ CopyAliasesToKeymap(KeyNamesInfo *info, struct xkb_keymap *keymap) struct xkb_key_alias new; /* Check that ->real is a key. */ - key = FindNamedKey(keymap, alias->real, false); + key = XkbKeyByName(keymap, alias->real, false); if (!key) { log_vrb(info->ctx, 5, "Attempt to alias %s to non-existent key %s; Ignored\n", @@ -635,7 +634,7 @@ CopyAliasesToKeymap(KeyNamesInfo *info, struct xkb_keymap *keymap) } /* Check that ->alias is not a key. */ - key = FindNamedKey(keymap, alias->alias, false); + key = XkbKeyByName(keymap, alias->alias, false); if (key) { log_vrb(info->ctx, 5, "Attempt to create alias with the name of a real key; " @@ -712,39 +711,3 @@ err_info: ClearKeyNamesInfo(&info); return false; } - -/***====================================================================***/ - -struct xkb_key * -FindNamedKey(struct xkb_keymap *keymap, xkb_atom_t name, bool use_aliases) -{ - struct xkb_key *key; - - xkb_foreach_key(key, keymap) - if (key->name == name) - return key; - - if (use_aliases) { - xkb_atom_t new_name; - if (FindKeyNameForAlias(keymap, name, &new_name)) - return FindNamedKey(keymap, new_name, false); - } - - return NULL; -} - -bool -FindKeyNameForAlias(struct xkb_keymap *keymap, xkb_atom_t name, - xkb_atom_t *real_name) -{ - const struct xkb_key_alias *a; - - darray_foreach(a, keymap->key_aliases) { - if (name == a->alias) { - *real_name = a->real; - return true; - } - } - - return false; -} diff --git a/src/xkbcomp/keycodes.h b/src/xkbcomp/keycodes.h deleted file mode 100644 index 395478b..0000000 --- a/src/xkbcomp/keycodes.h +++ /dev/null @@ -1,37 +0,0 @@ -/************************************************************ - * Copyright (c) 1994 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. - * - ********************************************************/ - -#ifndef XKBCOMP_KEYCODES_H -#define XKBCOMP_KEYCODES_H - -struct xkb_key * -FindNamedKey(struct xkb_keymap *keymap, xkb_atom_t name, bool use_aliases); - -bool -FindKeyNameForAlias(struct xkb_keymap *keymap, xkb_atom_t name, - xkb_atom_t *real_name); - -#endif diff --git a/src/xkbcomp/symbols.c b/src/xkbcomp/symbols.c index c0f8cde..2ae184c 100644 --- a/src/xkbcomp/symbols.c +++ b/src/xkbcomp/symbols.c @@ -56,7 +56,6 @@ #include "expr.h" #include "action.h" #include "vmod.h" -#include "keycodes.h" #include "include.h" #include "keysym.h" @@ -427,7 +426,8 @@ AddKeySymbols(SymbolsInfo *info, KeyInfo *keyi) * following loop) is enough, and we won't get multiple KeyInfo's * for the same key because of aliases. */ - if (FindKeyNameForAlias(info->keymap, keyi->name, &real_name)) + real_name = XkbResolveKeyAlias(info->keymap, keyi->name); + if (real_name != XKB_ATOM_NONE) keyi->name = real_name; darray_foreach(iter, info->keys) @@ -1450,7 +1450,7 @@ CopySymbolsDef(SymbolsInfo *info, KeyInfo *keyi) * The name is guaranteed to be real and not an alias (see * AddKeySymbols), so 'false' is safe here. */ - key = FindNamedKey(keymap, keyi->name, false); + key = XkbKeyByName(keymap, keyi->name, false); if (!key) { log_vrb(info->keymap->ctx, 5, "Key %s not found in keycodes; Symbols ignored\n", @@ -1547,7 +1547,7 @@ CopyModMapDef(SymbolsInfo *info, ModMapEntry *entry) struct xkb_keymap *keymap = info->keymap; if (!entry->haveSymbol) { - key = FindNamedKey(keymap, entry->u.keyName, true); + key = XkbKeyByName(keymap, entry->u.keyName, true); if (!key) { log_vrb(info->keymap->ctx, 5, "Key %s not found in keycodes; " |