From 3a11bcb5adb53035981b8910f7edcade845b49a5 Mon Sep 17 00:00:00 2001 From: Julien Danjou Date: Sat, 11 Apr 2009 19:02:55 +0200 Subject: keysyms: fix xcb_key_symbols_get_keycode() API xcb_key_symbols_get_keycode() returned a keycode. That's wrong, since actually a keysym can have multiple keycode. And we usually need all this keycodes to correctly grab a keysym. Signed-off-by: Julien Danjou --- keysyms/keysyms.c | 53 ++++++++++++++++++++++++++------------------------- keysyms/xcb_keysyms.h | 15 +++++++++++++-- 2 files changed, 40 insertions(+), 28 deletions(-) diff --git a/keysyms/keysyms.c b/keysyms/keysyms.c index d1f1d52..c3e7f2e 100644 --- a/keysyms/keysyms.c +++ b/keysyms/keysyms.c @@ -235,34 +235,35 @@ xcb_keysym_t xcb_key_symbols_get_keysym (xcb_key_symbols_t *syms, return keysyms[col]; } - -xcb_keycode_t -xcb_key_symbols_get_keycode (xcb_key_symbols_t *syms, - xcb_keysym_t keysym) +xcb_keycode_t * +xcb_key_symbols_get_keycode(xcb_key_symbols_t *syms, + xcb_keysym_t keysym) { - xcb_keysym_t ks; - xcb_keycode_t keycode_null = { XCB_NO_SYMBOL }; - int i, j; - - if (!syms) - return keycode_null; - - xcb_key_symbols_get_reply (syms, NULL); - - for (j = 0; j < syms->u.reply->keysyms_per_keycode; j++) - { - for (i = xcb_get_setup (syms->c)->min_keycode; i <= xcb_get_setup (syms->c)->max_keycode; i++) - { - xcb_keycode_t keycode; - - keycode = i; - ks = xcb_key_symbols_get_keysym (syms, keycode, j); - if (ks == keysym) - return keycode; - } - } + xcb_keysym_t ks; + int j, nresult = 0; + xcb_keycode_t i, min, max, *result = NULL; + + if(syms) + { + xcb_key_symbols_get_reply (syms, NULL); + min = xcb_get_setup(syms->c)->min_keycode; + max = xcb_get_setup(syms->c)->max_keycode; + + for(j = 0; j < syms->u.reply->keysyms_per_keycode; j++) + for(i = min; i && i <= max; i++) + { + ks = xcb_key_symbols_get_keysym(syms, i, j); + if(ks == keysym) + { + nresult++; + result = realloc(result, sizeof(xcb_keycode_t) * (nresult + 1)); + result[nresult - 1] = i; + result[nresult] = XCB_NO_SYMBOL; + } + } + } - return keycode_null; + return result; } xcb_keysym_t diff --git a/keysyms/xcb_keysyms.h b/keysyms/xcb_keysyms.h index 1202982..9d34a50 100644 --- a/keysyms/xcb_keysyms.h +++ b/keysyms/xcb_keysyms.h @@ -19,8 +19,19 @@ xcb_keysym_t xcb_key_symbols_get_keysym (xcb_key_symbols_t *syms xcb_keycode_t keycode, int col); -xcb_keycode_t xcb_key_symbols_get_keycode (xcb_key_symbols_t *syms, - xcb_keysym_t keysym); +/** + * @brief Get the keycodes attached to a keysyms. + * There can be several value, so what is returned is an array of keycode + * terminated by XCB_NO_SYMBOL. You are responsible to free it. + * Be aware that this function can be slow. It will convert all + * combinations of all available keycodes to keysyms to find the ones that + * match. + * @param syms Key symbols. + * @param keysym The keysym to look for. + * @return A XCB_NO_SYMBOL terminated array of keycode, or NULL if nothing is found. + */ +xcb_keycode_t * xcb_key_symbols_get_keycode(xcb_key_symbols_t *syms, + xcb_keysym_t keysym); xcb_keysym_t xcb_key_press_lookup_keysym (xcb_key_symbols_t *syms, xcb_key_press_event_t *event, -- cgit v1.2.3