Skip to content

Commit

Permalink
keysyms: fix xcb_key_symbols_get_keycode() API
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
jd committed Apr 11, 2009
1 parent 803dedd commit 3a11bcb
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 28 deletions.
53 changes: 27 additions & 26 deletions keysyms/keysyms.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
15 changes: 13 additions & 2 deletions keysyms/xcb_keysyms.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit 3a11bcb

Please sign in to comment.