예제 #1
0
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];
}
예제 #2
0
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;
}