Blob Blame History Raw
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;