- backed out patch.kbd-dieter. The patch appears to work on all XFree86

X servers that I've seen, however on other X servers it makes all
  key mappings into absolute junk.  We need to continue to work on this
  patch to support all X servers and all key maps.
This commit is contained in:
Bryce Denney 2001-06-25 22:57:27 +00:00
parent eb590bbc46
commit 06fb629d85
3 changed files with 353 additions and 106 deletions

View File

@ -92,115 +92,114 @@ private:
#define BX_KEY_PRESSED 0x00000000
#define BX_KEY_RELEASED 0x80000000
#define BX_KEY_CTRL_L 37
#define BX_KEY_SHIFT_L 50
#define BX_KEY_CTRL_L 0
#define BX_KEY_SHIFT_L 1
#define BX_KEY_F1 67
#define BX_KEY_F2 68
#define BX_KEY_F3 69
#define BX_KEY_F4 70
#define BX_KEY_F5 71
#define BX_KEY_F6 72
#define BX_KEY_F7 73
#define BX_KEY_F8 74
#define BX_KEY_F9 75
#define BX_KEY_F10 76
#define BX_KEY_F11 95
#define BX_KEY_F12 96
#define BX_KEY_F1 2
#define BX_KEY_F2 3
#define BX_KEY_F3 4
#define BX_KEY_F4 5
#define BX_KEY_F5 6
#define BX_KEY_F6 7
#define BX_KEY_F7 8
#define BX_KEY_F8 9
#define BX_KEY_F9 10
#define BX_KEY_F10 11
#define BX_KEY_F11 12
#define BX_KEY_F12 13
#define BX_KEY_CTRL_R 109
#define BX_KEY_SHIFT_R 62
#define BX_KEY_CAPS_LOCK 66
#define BX_KEY_NUM_LOCK 77
#define BX_KEY_ALT_L 64
#define BX_KEY_ALT_R 113
#define BX_KEY_CTRL_R 14
#define BX_KEY_SHIFT_R 15
#define BX_KEY_CAPS_LOCK 16
#define BX_KEY_NUM_LOCK 17
#define BX_KEY_ALT_L 18
#define BX_KEY_ALT_R 19
#define BX_KEY_A 38
#define BX_KEY_B 56
#define BX_KEY_C 54
#define BX_KEY_D 40
#define BX_KEY_E 26
#define BX_KEY_F 41
#define BX_KEY_G 42
#define BX_KEY_H 43
#define BX_KEY_I 31
#define BX_KEY_J 44
#define BX_KEY_K 45
#define BX_KEY_L 46
#define BX_KEY_M 58
#define BX_KEY_N 57
#define BX_KEY_O 32
#define BX_KEY_P 33
#define BX_KEY_Q 24
#define BX_KEY_R 27
#define BX_KEY_S 39
#define BX_KEY_T 28
#define BX_KEY_U 30
#define BX_KEY_V 55
#define BX_KEY_W 25
#define BX_KEY_X 53
#define BX_KEY_Y 29
#define BX_KEY_Z 52
#define BX_KEY_A 20
#define BX_KEY_B 21
#define BX_KEY_C 22
#define BX_KEY_D 23
#define BX_KEY_E 24
#define BX_KEY_F 25
#define BX_KEY_G 26
#define BX_KEY_H 27
#define BX_KEY_I 28
#define BX_KEY_J 29
#define BX_KEY_K 30
#define BX_KEY_L 31
#define BX_KEY_M 32
#define BX_KEY_N 33
#define BX_KEY_O 34
#define BX_KEY_P 35
#define BX_KEY_Q 36
#define BX_KEY_R 37
#define BX_KEY_S 38
#define BX_KEY_T 39
#define BX_KEY_U 40
#define BX_KEY_V 41
#define BX_KEY_W 42
#define BX_KEY_X 43
#define BX_KEY_Y 44
#define BX_KEY_Z 45
#define BX_KEY_0 19
#define BX_KEY_1 10
#define BX_KEY_2 11
#define BX_KEY_3 12
#define BX_KEY_4 13
#define BX_KEY_5 14
#define BX_KEY_6 15
#define BX_KEY_7 16
#define BX_KEY_8 17
#define BX_KEY_9 18
#define BX_KEY_0 46
#define BX_KEY_1 47
#define BX_KEY_2 48
#define BX_KEY_3 49
#define BX_KEY_4 50
#define BX_KEY_5 51
#define BX_KEY_6 52
#define BX_KEY_7 53
#define BX_KEY_8 54
#define BX_KEY_9 55
#define BX_KEY_ESC 9
#define BX_KEY_ESC 56
#define BX_KEY_SPACE 65
#define BX_KEY_SINGLE_QUOTE 48
#define BX_KEY_SPACE 57
#define BX_KEY_SINGLE_QUOTE 58
#define BX_KEY_COMMA 59
#define BX_KEY_PERIOD 60
#define BX_KEY_SLASH 61
#define BX_KEY_SEMICOLON 47
#define BX_KEY_EQUALS 21
#define BX_KEY_SEMICOLON 62
#define BX_KEY_EQUALS 63
#define BX_KEY_LEFT_BRACKET 34
#define BX_KEY_BACKSLASH 51
#define BX_KEY_LEFT_BACKSLASH 94
#define BX_KEY_RIGHT_BRACKET 35
#define BX_KEY_MINUS 20
#define BX_KEY_GRAVE 49
#define BX_KEY_LEFT_BRACKET 64
#define BX_KEY_BACKSLASH 65
#define BX_KEY_RIGHT_BRACKET 66
#define BX_KEY_MINUS 67
#define BX_KEY_GRAVE 68
#define BX_KEY_BACKSPACE 22
#define BX_KEY_ENTER 36
#define BX_KEY_TAB 23
#define BX_KEY_BACKSPACE 69
#define BX_KEY_ENTER 70
#define BX_KEY_TAB 71
#define BX_KEY_INSERT 106
#define BX_KEY_DELETE 107
#define BX_KEY_HOME 97
#define BX_KEY_END 103
#define BX_KEY_PAGE_UP 99
#define BX_KEY_PAGE_DOWN 105
#define BX_KEY_INSERT 76
#define BX_KEY_DELETE 77
#define BX_KEY_HOME 78
#define BX_KEY_END 79
#define BX_KEY_PAGE_UP 80
#define BX_KEY_PAGE_DOWN 81
#define BX_KEY_KP_ADD 86
#define BX_KEY_KP_SUBTRACT 82
#define BX_KEY_KP_END 87
#define BX_KEY_KP_DOWN 88
#define BX_KEY_KP_PAGE_DOWN 89
#define BX_KEY_KP_LEFT 83
#define BX_KEY_KP_RIGHT 85
#define BX_KEY_KP_HOME 79
#define BX_KEY_KP_UP 80
#define BX_KEY_KP_PAGE_UP 81
#define BX_KEY_KP_INSERT 90
#define BX_KEY_KP_DELETE 91
#define BX_KEY_KP_5 84
#define BX_KEY_KP_ADD 82
#define BX_KEY_KP_SUBTRACT 83
#define BX_KEY_KP_END 84
#define BX_KEY_KP_DOWN 85
#define BX_KEY_KP_PAGE_DOWN 86
#define BX_KEY_KP_LEFT 87
#define BX_KEY_KP_RIGHT 88
#define BX_KEY_KP_HOME 89
#define BX_KEY_KP_UP 90
#define BX_KEY_KP_PAGE_UP 91
#define BX_KEY_KP_INSERT 92
#define BX_KEY_KP_DELETE 93
#define BX_KEY_KP_5 94
#define BX_KEY_UP 98
#define BX_KEY_DOWN 104
#define BX_KEY_LEFT 100
#define BX_KEY_RIGHT 102
#define BX_KEY_UP 95
#define BX_KEY_DOWN 96
#define BX_KEY_LEFT 97
#define BX_KEY_RIGHT 98
#define BX_KEY_KP_ENTER 108
#define BX_KEY_KP_MULTIPLY 63
#define BX_KEY_KP_DIVIDE 112
#define BX_KEY_KP_ENTER 99
#define BX_KEY_KP_MULTIPLY 100
#define BX_KEY_KP_DIVIDE 101

View File

@ -102,11 +102,137 @@ static unsigned bx_bitmap_right_xorigin = 0; // pixels from right
static void headerbar_click(int x, int y);
static void send_keyboard_mouse_status(void);
Bit32u ascii_to_key_event[0x5f] = {
// !"#$%&'
BX_KEY_SPACE,
BX_KEY_1,
BX_KEY_SINGLE_QUOTE,
BX_KEY_3,
BX_KEY_4,
BX_KEY_5,
BX_KEY_7,
BX_KEY_SINGLE_QUOTE,
// ()*+,-./
BX_KEY_9,
BX_KEY_0,
BX_KEY_8,
BX_KEY_EQUALS,
BX_KEY_COMMA,
BX_KEY_MINUS,
BX_KEY_PERIOD,
BX_KEY_SLASH,
// 01234567
BX_KEY_0,
BX_KEY_1,
BX_KEY_2,
BX_KEY_3,
BX_KEY_4,
BX_KEY_5,
BX_KEY_6,
BX_KEY_7,
// 89:;<=>?
BX_KEY_8,
BX_KEY_9,
BX_KEY_SEMICOLON,
BX_KEY_SEMICOLON,
BX_KEY_COMMA,
BX_KEY_EQUALS,
BX_KEY_PERIOD,
BX_KEY_SLASH,
// @ABCDEFG
BX_KEY_2,
BX_KEY_A,
BX_KEY_B,
BX_KEY_C,
BX_KEY_D,
BX_KEY_E,
BX_KEY_F,
BX_KEY_G,
// HIJKLMNO
BX_KEY_H,
BX_KEY_I,
BX_KEY_J,
BX_KEY_K,
BX_KEY_L,
BX_KEY_M,
BX_KEY_N,
BX_KEY_O,
// PQRSTUVW
BX_KEY_P,
BX_KEY_Q,
BX_KEY_R,
BX_KEY_S,
BX_KEY_T,
BX_KEY_U,
BX_KEY_V,
BX_KEY_W,
// XYZ[\]^_
BX_KEY_X,
BX_KEY_Y,
BX_KEY_Z,
BX_KEY_LEFT_BRACKET,
BX_KEY_BACKSLASH,
BX_KEY_RIGHT_BRACKET,
BX_KEY_6,
BX_KEY_MINUS,
// `abcdefg
BX_KEY_GRAVE,
BX_KEY_A,
BX_KEY_B,
BX_KEY_C,
BX_KEY_D,
BX_KEY_E,
BX_KEY_F,
BX_KEY_G,
// hijklmno
BX_KEY_H,
BX_KEY_I,
BX_KEY_J,
BX_KEY_K,
BX_KEY_L,
BX_KEY_M,
BX_KEY_N,
BX_KEY_O,
// pqrstuvw
BX_KEY_P,
BX_KEY_Q,
BX_KEY_R,
BX_KEY_S,
BX_KEY_T,
BX_KEY_U,
BX_KEY_V,
BX_KEY_W,
// xyz{|}~
BX_KEY_X,
BX_KEY_Y,
BX_KEY_Z,
BX_KEY_LEFT_BRACKET,
BX_KEY_BACKSLASH,
BX_KEY_RIGHT_BRACKET,
BX_KEY_GRAVE
};
extern Bit8u graphics_snapshot[32 * 1024];
static void load_font(void);
static void xkeypress(KeyCode keycode, int press_release);
static void xkeypress(KeySym keysym, int press_release);
// extern "C" void select_visual(void);
#define ROUNDUP(nbytes, pad) ((((nbytes) + ((pad)-1)) / (pad)) * ((pad)>>3))
@ -429,7 +555,6 @@ bx_gui_c::handle_events(void)
XEvent report;
XKeyEvent *key_event;
KeySym keysym;
KeyCode keycode;
XComposeStatus compose;
char buffer[MAX_MAPPED_STRING_LENGTH];
int bufsize = MAX_MAPPED_STRING_LENGTH;
@ -565,16 +690,13 @@ bx_gui_c::handle_events(void)
case KeyPress:
key_event = (XKeyEvent *) &report;
charcount = XLookupString(key_event, buffer, bufsize, &keysym, &compose);
keycode = XKeysymToKeycode(bx_x_display, keysym);
BX_DEBUG (("key pressed, keysym=%d, keycode=%d", keysym, keycode));
xkeypress(keycode, 0);
xkeypress(keysym, 0);
break;
case KeyRelease:
key_event = (XKeyEvent *) &report;
charcount = XLookupString(key_event, buffer, bufsize, &keysym, &compose);
keycode = XKeysymToKeycode(bx_x_display, keysym);
xkeypress(keycode, 1);
xkeypress(keysym, 1);
break;
case MotionNotify:
@ -668,10 +790,137 @@ bx_gui_c::flush(void)
void
xkeypress(KeyCode keycode, int press_release)
xkeypress(KeySym keysym, int press_release)
{
Bit32u key_event;
key_event = (unsigned) keycode;
// this depends on the fact that the X11 keysyms which
// correspond to the ascii characters space .. tilde
// are in consequtive order.
if ((keysym >= XK_space) && (keysym <= XK_asciitilde)) {
key_event = ascii_to_key_event[keysym - XK_space];
}
else switch (keysym) {
case XK_KP_1:
#ifdef XK_KP_End
case XK_KP_End:
#endif
key_event = BX_KEY_KP_END; break;
case XK_KP_2:
#ifdef XK_KP_Down
case XK_KP_Down:
#endif
key_event = BX_KEY_KP_DOWN; break;
case XK_KP_3:
#ifdef XK_KP_Page_Down
case XK_KP_Page_Down:
#endif
key_event = BX_KEY_KP_PAGE_DOWN; break;
case XK_KP_4:
#ifdef XK_KP_Left
case XK_KP_Left:
#endif
key_event = BX_KEY_KP_LEFT; break;
case XK_KP_5:
key_event = BX_KEY_KP_5; break;
case XK_KP_6:
#ifdef XK_KP_Right
case XK_KP_Right:
#endif
key_event = BX_KEY_KP_RIGHT; break;
case XK_KP_7:
#ifdef XK_KP_Home
case XK_KP_Home:
#endif
key_event = BX_KEY_KP_HOME; break;
case XK_KP_8:
#ifdef XK_KP_Up
case XK_KP_Up:
#endif
key_event = BX_KEY_KP_UP; break;
case XK_KP_9:
#ifdef XK_KP_Page_Up
case XK_KP_Page_Up:
#endif
key_event = BX_KEY_KP_PAGE_UP; break;
case XK_KP_0:
#ifdef XK_KP_Insert
case XK_KP_Insert:
key_event = BX_KEY_KP_INSERT; break;
#endif
case XK_KP_Decimal:
#ifdef XK_KP_Delete
case XK_KP_Delete:
key_event = BX_KEY_KP_DELETE; break;
#endif
#ifdef XK_KP_Enter
case XK_KP_Enter:
key_event = BX_KEY_KP_ENTER; break;
#endif
case XK_KP_Subtract: key_event = BX_KEY_KP_SUBTRACT; break;
case XK_KP_Add: key_event = BX_KEY_KP_ADD; break;
case XK_KP_Multiply: key_event = BX_KEY_KP_MULTIPLY; break;
case XK_KP_Divide: key_event = BX_KEY_KP_DIVIDE; break;
case XK_Up: key_event = BX_KEY_UP; break;
case XK_Down: key_event = BX_KEY_DOWN; break;
case XK_Left: key_event = BX_KEY_LEFT; break;
case XK_Right: key_event = BX_KEY_RIGHT; break;
case XK_Delete: key_event = BX_KEY_DELETE; break;
case XK_BackSpace: key_event = BX_KEY_BACKSPACE; break;
case XK_Tab: key_event = BX_KEY_TAB; break;
case XK_Return: key_event = BX_KEY_ENTER; break;
case XK_Escape: key_event = BX_KEY_ESC; break;
case XK_F1: key_event = BX_KEY_F1; break;
case XK_F2: key_event = BX_KEY_F2; break;
case XK_F3: key_event = BX_KEY_F3; break;
case XK_F4: key_event = BX_KEY_F4; break;
case XK_F5: key_event = BX_KEY_F5; break;
case XK_F6: key_event = BX_KEY_F6; break;
case XK_F7: key_event = BX_KEY_F7; break;
case XK_F8: key_event = BX_KEY_F8; break;
case XK_F9: key_event = BX_KEY_F9; break;
case XK_F10: key_event = BX_KEY_F10; break;
case XK_F11: key_event = BX_KEY_F11; break;
case XK_F12: key_event = BX_KEY_F12; break;
case XK_Control_L: key_event = BX_KEY_CTRL_L; break;
case XK_Shift_L: key_event = BX_KEY_SHIFT_L; break;
case XK_Shift_R: key_event = BX_KEY_SHIFT_R; break;
case XK_Caps_Lock: key_event = BX_KEY_CAPS_LOCK; break;
case XK_Num_Lock: key_event = BX_KEY_NUM_LOCK; break;
case XK_Alt_L: key_event = BX_KEY_ALT_L; break;
case XK_Insert: key_event = BX_KEY_INSERT; break;
case XK_Home: key_event = BX_KEY_HOME; break;
case XK_End: key_event = BX_KEY_END; break;
case XK_Page_Up: key_event = BX_KEY_PAGE_UP; break;
case XK_Page_Down: key_event = BX_KEY_PAGE_DOWN; break;
default:
BX_ERROR(( "xkeypress(): keysym %x unhandled!", (unsigned) keysym ));
return;
break;
}
if (press_release)
key_event |= BX_KEY_RELEASED;

View File

@ -646,7 +646,6 @@ bx_keyb_c::gen_scancode(Bit32u key)
case BX_KEY_LEFT_BRACKET: scancode = 0x1a; break;
case BX_KEY_BACKSLASH: scancode = 0x2b; break;
case BX_KEY_LEFT_BACKSLASH: scancode = 0x56; break;
case BX_KEY_RIGHT_BRACKET: scancode = 0x1b; break;
case BX_KEY_MINUS: scancode = 0x0c; break;
case BX_KEY_GRAVE: scancode = 0x29; break;