keymap: add xkb_keymap_key_by_name(), xkb_keymap_key_get_name(), tests
xkb_keymap_key_by_name() allows finding a keycode from a given keyname and is useful for generating keyboard events to use in regression tests during CI xkb_keymap_key_get_name() is the inverse of xkb_keymap_key_by_name() Signed-off-by: Mike Blumenkrantz <zmike@osg.samsung.com> [ran: some stylistic tweaks + another test case] Signed-off-by: Ran Benita <ran234@gmail.com>master
parent
7f3bb16729
commit
0ce17ef3ea
|
@ -185,6 +185,7 @@ AM_TESTS_ENVIRONMENT = \
|
||||||
|
|
||||||
TESTS = \
|
TESTS = \
|
||||||
test/keysym \
|
test/keysym \
|
||||||
|
test/keymap \
|
||||||
test/filecomp \
|
test/filecomp \
|
||||||
test/context \
|
test/context \
|
||||||
test/rules-file \
|
test/rules-file \
|
||||||
|
@ -204,6 +205,7 @@ check_PROGRAMS = \
|
||||||
TESTS_LDADD = libtest.la
|
TESTS_LDADD = libtest.la
|
||||||
|
|
||||||
test_keysym_LDADD = $(TESTS_LDADD)
|
test_keysym_LDADD = $(TESTS_LDADD)
|
||||||
|
test_keymap_LDADD = $(TESTS_LDADD)
|
||||||
test_filecomp_LDADD = $(TESTS_LDADD)
|
test_filecomp_LDADD = $(TESTS_LDADD)
|
||||||
test_context_LDADD = $(TESTS_LDADD)
|
test_context_LDADD = $(TESTS_LDADD)
|
||||||
test_rules_file_CFLAGS = $(AM_CFLAGS) -Wno-declaration-after-statement
|
test_rules_file_CFLAGS = $(AM_CFLAGS) -Wno-declaration-after-statement
|
||||||
|
|
34
src/keymap.c
34
src/keymap.c
|
@ -470,6 +470,40 @@ xkb_keymap_key_for_each(struct xkb_keymap *keymap, xkb_keymap_key_iter_t iter,
|
||||||
iter(keymap, key->keycode, data);
|
iter(keymap, key->keycode, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
XKB_EXPORT const char *
|
||||||
|
xkb_keymap_key_get_name(struct xkb_keymap *keymap, xkb_keycode_t kc)
|
||||||
|
{
|
||||||
|
const struct xkb_key *key = XkbKey(keymap, kc);
|
||||||
|
|
||||||
|
if (!key)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return xkb_atom_text(keymap->ctx, key->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
XKB_EXPORT xkb_keycode_t
|
||||||
|
xkb_keymap_key_by_name(struct xkb_keymap *keymap, const char *name)
|
||||||
|
{
|
||||||
|
struct xkb_key *key;
|
||||||
|
xkb_atom_t atom;
|
||||||
|
|
||||||
|
atom = xkb_atom_lookup(keymap->ctx, name);
|
||||||
|
if (atom) {
|
||||||
|
xkb_atom_t ratom = XkbResolveKeyAlias(keymap, atom);
|
||||||
|
if (ratom)
|
||||||
|
atom = ratom;
|
||||||
|
}
|
||||||
|
if (!atom)
|
||||||
|
return XKB_KEYCODE_INVALID;
|
||||||
|
|
||||||
|
xkb_keys_foreach(key, keymap) {
|
||||||
|
if (key->name == atom)
|
||||||
|
return key->keycode;
|
||||||
|
}
|
||||||
|
|
||||||
|
return XKB_KEYCODE_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Simple boolean specifying whether or not the key should repeat.
|
* Simple boolean specifying whether or not the key should repeat.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
*.trs
|
*.trs
|
||||||
filecomp
|
filecomp
|
||||||
rulescomp
|
rulescomp
|
||||||
|
keymap
|
||||||
keysym
|
keysym
|
||||||
state
|
state
|
||||||
context
|
context
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
/*
|
||||||
|
* Copyright © 2016 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: Mike Blumenkrantz <zmike@osg.samsung.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "test.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
struct xkb_context *context = test_get_context(0);
|
||||||
|
struct xkb_keymap *keymap;
|
||||||
|
xkb_keycode_t kc;
|
||||||
|
const char *keyname;
|
||||||
|
|
||||||
|
assert(context);
|
||||||
|
|
||||||
|
keymap = test_compile_rules(context, "evdev", "pc104", "us,ru", NULL, "grp:menu_toggle");
|
||||||
|
assert(keymap);
|
||||||
|
|
||||||
|
kc = xkb_keymap_key_by_name(keymap, "AE09");
|
||||||
|
assert(kc != XKB_KEYCODE_INVALID);
|
||||||
|
keyname = xkb_keymap_key_get_name(keymap, kc);
|
||||||
|
assert(streq(keyname, "AE09"));
|
||||||
|
|
||||||
|
kc = xkb_keymap_key_by_name(keymap, "COMP");
|
||||||
|
assert(kc != XKB_KEYCODE_INVALID);
|
||||||
|
keyname = xkb_keymap_key_get_name(keymap, kc);
|
||||||
|
assert(streq(keyname, "COMP"));
|
||||||
|
|
||||||
|
kc = xkb_keymap_key_by_name(keymap, "MENU");
|
||||||
|
assert(kc != XKB_KEYCODE_INVALID);
|
||||||
|
keyname = xkb_keymap_key_get_name(keymap, kc);
|
||||||
|
assert(streq(keyname, "COMP"));
|
||||||
|
|
||||||
|
xkb_keymap_unref(keymap);
|
||||||
|
xkb_context_unref(context);
|
||||||
|
}
|
|
@ -940,6 +940,32 @@ void
|
||||||
xkb_keymap_key_for_each(struct xkb_keymap *keymap, xkb_keymap_key_iter_t iter,
|
xkb_keymap_key_for_each(struct xkb_keymap *keymap, xkb_keymap_key_iter_t iter,
|
||||||
void *data);
|
void *data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find the name of the key with the given keycode.
|
||||||
|
*
|
||||||
|
* @returns The key name. If no key with this keycode exists,
|
||||||
|
* returns NULL.
|
||||||
|
*
|
||||||
|
* @sa xkb_keycode_t
|
||||||
|
* @memberof xkb_keymap
|
||||||
|
* @since 0.6.0
|
||||||
|
*/
|
||||||
|
const char *
|
||||||
|
xkb_keymap_key_get_name(struct xkb_keymap *keymap, xkb_keycode_t key);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find the keycode of the key with the given name.
|
||||||
|
*
|
||||||
|
* @returns The keycode. If no key with this name exists,
|
||||||
|
* returns XKB_KEYCODE_INVALID.
|
||||||
|
*
|
||||||
|
* @sa xkb_keycode_t
|
||||||
|
* @memberof xkb_keymap
|
||||||
|
* @since 0.6.0
|
||||||
|
*/
|
||||||
|
xkb_keycode_t
|
||||||
|
xkb_keymap_key_by_name(struct xkb_keymap *keymap, const char *name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the number of modifiers in the keymap.
|
* Get the number of modifiers in the keymap.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue