xkb: only repeat keys when they're supposed to repeat

Support for this was added upstream, we can use it now. This mostly
means that modifiers won't repeat anymore.

Signed-off-by: Ran Benita <ran234@gmail.com>
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
Ran Benita 2012-06-27 13:11:23 +03:00 committed by David Herrmann
parent 44376b8daf
commit 23eebad85d

View File

@ -126,6 +126,7 @@ int kbd_dev_process_key(struct kbd_dev *kbd,
struct uterm_input_event *out) struct uterm_input_event *out)
{ {
struct xkb_state *state; struct xkb_state *state;
struct xkb_keymap *keymap;
xkb_keycode_t keycode; xkb_keycode_t keycode;
const xkb_keysym_t *keysyms; const xkb_keysym_t *keysyms;
int num_keysyms; int num_keysyms;
@ -134,6 +135,7 @@ int kbd_dev_process_key(struct kbd_dev *kbd,
return -EINVAL; return -EINVAL;
state = kbd->state; state = kbd->state;
keymap = xkb_state_get_map(state);
keycode = code + EVDEV_KEYCODE_OFFSET; keycode = code + EVDEV_KEYCODE_OFFSET;
if (key_state == KEY_PRESSED) if (key_state == KEY_PRESSED)
@ -141,13 +143,12 @@ int kbd_dev_process_key(struct kbd_dev *kbd,
else if (key_state == KEY_RELEASED) else if (key_state == KEY_RELEASED)
xkb_state_update_key(state, keycode, XKB_KEY_UP); xkb_state_update_key(state, keycode, XKB_KEY_UP);
/*
* TODO: Add support in xkbcommon to query whether the key
* should repeat or not.
*/
if (key_state == KEY_RELEASED) if (key_state == KEY_RELEASED)
return -ENOKEY; return -ENOKEY;
if (key_state == KEY_REPEATED && !xkb_key_repeats(keymap, keycode))
return -ENOKEY;
num_keysyms = xkb_key_get_syms(state, keycode, &keysyms); num_keysyms = xkb_key_get_syms(state, keycode, &keysyms);
if (num_keysyms < 0) if (num_keysyms < 0)
return -ENOKEY; return -ENOKEY;