diff -up ClanLib-0.6.5/Sources/Display/Input/X11/keyboard_x11.cpp.keycode ClanLib-0.6.5/Sources/Display/Input/X11/keyboard_x11.cpp
--- ClanLib-0.6.5/Sources/Display/Input/X11/keyboard_x11.cpp.keycode 2009-11-30 16:13:22.000000000 +0100
+++ ClanLib-0.6.5/Sources/Display/Input/X11/keyboard_x11.cpp 2009-11-30 16:15:11.000000000 +0100
@@ -50,6 +50,16 @@ CL_XWindowKeyboard::CL_XWindowKeyboard(
{
card = _card;
+ memset(keycodes, 0, sizeof(keycodes));
+ for (int i=0; i<256; i++)
+ {
+ KeySym sym = XKeycodeToKeysym(card->get_display(), i, 0);
+ int id = map_keysym_to_id(sym);
+
+ if (id != CL_KEY_NONE_OF_THE_ABOVE)
+ keycodes[id] = i;
+ }
+
for (int j=0; j<X_KEYBOARD_BUFFERSIZE; j++) keys_return[j]=0;
buttons = new CL_InputButton_XKeyboard*[CL_NUM_KEYS];
@@ -147,7 +157,7 @@ CL_InputButton *CL_XWindowKeyboard::get_
{
if (buttons[button_num] != NULL) return buttons[button_num];
- int translate_key = map_id_to_keysym(button_num);
+ int translate_key = map_id_to_keycode(button_num);
if (translate_key == -1) return NULL;
buttons[button_num] =
@@ -205,7 +205,6 @@ int CL_XWindowKeyboard::map_keysym_to_id
{
switch (keysym)
{
- case 269025062: return CL_KEY_ESCAPE;
case XK_Select: return CL_KEY_ENTER;
case XK_BackSpace: return CL_KEY_BACKSPACE;
case XK_Tab: return CL_KEY_TAB;
@@ -300,127 +309,9 @@ int CL_XWindowKeyboard::map_keysym_to_id
return CL_KEY_NONE_OF_THE_ABOVE;
}
-int CL_XWindowKeyboard::map_id_to_keysym(int id)
+int CL_XWindowKeyboard::map_id_to_keycode(int id)
{
- switch (id)
- {
- case CL_KEY_A: return 38;
- case CL_KEY_B: return 56;
- case CL_KEY_C: return 54;
- case CL_KEY_D: return 40;
- case CL_KEY_E: return 26;
- case CL_KEY_F: return 41;
- case CL_KEY_G: return 42;
- case CL_KEY_H: return 43;
- case CL_KEY_I: return 31;
- case CL_KEY_J: return 44;
- case CL_KEY_K: return 45;
- case CL_KEY_L: return 46;
- case CL_KEY_M: return 58;
- case CL_KEY_N: return 57;
- case CL_KEY_O: return 32;
- case CL_KEY_P: return 33;
- case CL_KEY_Q: return 24;
- case CL_KEY_R: return 27;
- case CL_KEY_S: return 39;
- case CL_KEY_T: return 28;
- case CL_KEY_U: return 30;
- case CL_KEY_V: return 55;
- case CL_KEY_W: return 25;
- case CL_KEY_X: return 53;
- case CL_KEY_Y: return 29;
- case CL_KEY_Z: return 52;
-
- case CL_KEY_0: return 19;
- case CL_KEY_1: return 10;
- case CL_KEY_2: return 11;
- case CL_KEY_3: return 12;
- case CL_KEY_4: return 13;
- case CL_KEY_5: return 14;
- case CL_KEY_6: return 15;
- case CL_KEY_7: return 16;
- case CL_KEY_8: return 17;
- case CL_KEY_9: return 18;
-
- case CL_KEY_F1: return 67;
- case CL_KEY_F2: return 68;
- case CL_KEY_F3: return 69;
- case CL_KEY_F4: return 70;
- case CL_KEY_F5: return 71;
- case CL_KEY_F6: return 72;
- case CL_KEY_F7: return 73;
- case CL_KEY_F8: return 74;
- case CL_KEY_F9: return 75;
- case CL_KEY_F10: return 76;
- case CL_KEY_F11: return 95;
- case CL_KEY_F12: return 96;
-
- case CL_KEY_ESCAPE: return 9;
- case CL_KEY_LEFT: return 100;
- case CL_KEY_RIGHT: return 102;
- case CL_KEY_UP: return 98;
- case CL_KEY_DOWN: return 104;
- case CL_KEY_LCTRL: return 37;
- case CL_KEY_RCTRL: return 109;
- case CL_KEY_LSHIFT: return 50;
- case CL_KEY_RSHIFT: return 62;
- case CL_KEY_ALT: return 64;
- case CL_KEY_ALTGR: return 113;
- case CL_KEY_TAB: return 23;
- case CL_KEY_ENTER: return 36;
- case CL_KEY_SPACE: return 65;
- case CL_KEY_BACKSPACE: return 22;
- case CL_KEY_INSERT: return 106;
- case CL_KEY_DELETE: return 107;
- case CL_KEY_HOME: return 97;
- case CL_KEY_END: return 98;
- case CL_KEY_PAGEUP: return 99;
- case CL_KEY_PAGEDOWN: return 105;
- case CL_KEY_CAPSLOCK: return 66;
- case CL_KEY_NUMLOCK: return 77;
- case CL_KEY_SCRLOCK: return 78;
- case CL_KEY_PRINT: return 111;
- case CL_KEY_PAUSE: return 110;
- case CL_KEY_KP_DIV: return 112;
- case CL_KEY_KP_MULT: return 63;
- case CL_KEY_KP_MINUS: return 82;
- case CL_KEY_KP_PLUS: return 86;
- case CL_KEY_KP_ENTER: return 108;
- case CL_KEY_KP_DECIMAL: return 91;
-
- /* Found these codes in /usr/X11R6/lib/X11/xkb/keycodes/xfree86
- * from an XFree86 4.0.1 installation.
- * Tested on US 105 key keyboard. <timcr038@student.otago.ac.nz>
- */
- case CL_KEY_KP_0: return 90;
- case CL_KEY_KP_1: return 87;
- case CL_KEY_KP_2: return 88;
- case CL_KEY_KP_3: return 89;
- case CL_KEY_KP_4: return 83;
- case CL_KEY_KP_5: return 84;
- case CL_KEY_KP_6: return 85;
- case CL_KEY_KP_7: return 79;
- case CL_KEY_KP_8: return 80;
- case CL_KEY_KP_9: return 81;
-
- case CL_KEY_GRAVE: return 49;
- case CL_KEY_SUBTRACT: return 20;
- case CL_KEY_EQUALS: return 21;
- case CL_KEY_LEFT_BRACKET: return 34;
- case CL_KEY_RIGHT_BRACKET: return 35;
- case CL_KEY_SEMICOLON: return 47;
- case CL_KEY_QUOTE: return 48;
- case CL_KEY_COMMA: return 59;
- case CL_KEY_PERIOD: return 60;
- case CL_KEY_DIVIDE: return 61;
- case CL_KEY_BACKSLASH: return 51;
- case CL_KEY_LWIN: return 133;
- case CL_KEY_RWIN: return 134;
- case CL_KEY_APPS: return 135;
- case CL_KEY_COMPOSE: return 108;
- }
-
- return -1;
+ return keycodes[id];
}
/***************************
diff -up ClanLib-0.6.5/Sources/Display/Input/X11/keyboard_x11.h.keycode ClanLib-0.6.5/Sources/Display/Input/X11/keyboard_x11.h
--- ClanLib-0.6.5/Sources/Display/Input/X11/keyboard_x11.h.keycode 2001-11-30 23:38:42.000000000 +0100
+++ ClanLib-0.6.5/Sources/Display/Input/X11/keyboard_x11.h 2009-11-30 16:15:41.000000000 +0100
@@ -19,6 +19,7 @@
#include "API/Display/Input/inputbutton.h"
#include "API/Display/Input/keyboard.h"
+#include "API/Display/Input/key.h"
#include "Core/System/Unix/init_linux.h"
#include "API/Core/System/keep_alive.h"
#include "API/signals.h"
@@ -64,12 +65,13 @@ public:
private:
static int map_keysym_to_id(int keysym);
- static int map_id_to_keysym(int id);
+ int map_id_to_keycode(int id);
void on_xevent(XEvent &event);
CL_Slot slot_xevent;
char keys_return[X_KEYBOARD_BUFFERSIZE];
+ int keycodes[CL_NUM_KEYS];
CL_InputButton_XKeyboard **buttons;
CL_XWindow_CompatibleCard *card;