xcb_keysym_t xcb_key_symbols_get_keysym (xcb_key_symbols_t *syms, xcb_keycode_t keycode, int col) { xcb_keysym_t *keysyms; xcb_keysym_t keysym_null = { XCB_NO_SYMBOL }; xcb_keysym_t lsym; xcb_keysym_t usym; xcb_keycode_t min_keycode; xcb_keycode_t max_keycode; int per; if (!syms || xcb_connection_has_error(syms->c)) return keysym_null; xcb_key_symbols_get_reply (syms, NULL); if (!syms->u.reply) return keysym_null; keysyms = xcb_get_keyboard_mapping_keysyms (syms->u.reply); min_keycode = xcb_get_setup (syms->c)->min_keycode; max_keycode = xcb_get_setup (syms->c)->max_keycode; per = syms->u.reply->keysyms_per_keycode; if ((col < 0) || ((col >= per) && (col > 3)) || (keycode < min_keycode) || (keycode > max_keycode)) return keysym_null; keysyms = &keysyms[(keycode - min_keycode) * per]; if (col < 4) { if (col > 1) { while ((per > 2) && (keysyms[per - 1] == XCB_NO_SYMBOL)) per--; if (per < 3) col -= 2; } if ((per <= (col|1)) || (keysyms[col|1] == XCB_NO_SYMBOL)) { xcb_convert_case(keysyms[col&~1], &lsym, &usym); if (!(col & 1)) return lsym; else if (usym == lsym) return keysym_null; else return usym; } } return keysyms[col]; }
KeySym XKeycodeToKeysym(Display *display, KeyCode keycode, int index) { xcb_get_keyboard_mapping_cookie_t cookie; xcb_get_keyboard_mapping_reply_t *reply; xcb_keysym_t result = NoSymbol; cookie = xcb_get_keyboard_mapping(display, keycode, 1); reply = xcb_get_keyboard_mapping_reply(display, cookie, NULL); if (reply == NULL) fatal("Error in X11 communication\n"); result = xcb_get_keyboard_mapping_keysyms(reply)[index]; free(reply); return result; }