2003-02-16 15:10:32 +03:00
|
|
|
----------------------------------------------------------------------
|
|
|
|
Patch name: patch.win32-keyevents
|
|
|
|
Author: Volker Ruppert
|
|
|
|
Date: Sun Feb 16 12:55:00 CET 2003
|
2003-03-05 21:24:40 +03:00
|
|
|
Status: applied to main code
|
2003-02-16 15:10:32 +03:00
|
|
|
|
|
|
|
Detailed description:
|
|
|
|
This patch fixes the key handling of the win32 gui. Now the function
|
|
|
|
DEV_kbd_gen_scancode() is called instead of DEV_kbd_put_scancode(). This
|
|
|
|
change enables the support for different scancode sets. The win32 scancodes
|
|
|
|
are now converted to bx_key values.
|
|
|
|
|
|
|
|
Patch was created with:
|
|
|
|
diff -u
|
|
|
|
Apply patch to what version:
|
|
|
|
cvs checked out on DATE
|
|
|
|
Instructions:
|
|
|
|
To patch, go to main bochs directory.
|
|
|
|
Type "patch -p0 < THIS_PATCH_FILE".
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
diff -urN ../bochs/gui/win32.cc gui/win32.cc
|
|
|
|
--- /home/volker/bochs/gui/win32.cc 2003-01-02 10:49:48.000000000 +0100
|
|
|
|
+++ ./gui/win32.cc 2003-02-16 12:52:29.000000000 +0100
|
|
|
|
@@ -168,6 +168,104 @@
|
|
|
|
void DestroyFont(void);
|
|
|
|
|
|
|
|
|
|
|
|
+Bit32u win32_to_bx_key[0x59] = {
|
|
|
|
+ /* 0x00 - 0x0f */
|
|
|
|
+ 0,
|
|
|
|
+ BX_KEY_ESC,
|
|
|
|
+ BX_KEY_1,
|
|
|
|
+ BX_KEY_2,
|
|
|
|
+ BX_KEY_3,
|
|
|
|
+ BX_KEY_4,
|
|
|
|
+ BX_KEY_5,
|
|
|
|
+ BX_KEY_6,
|
|
|
|
+ BX_KEY_7,
|
|
|
|
+ BX_KEY_8,
|
|
|
|
+ BX_KEY_9,
|
|
|
|
+ BX_KEY_0,
|
|
|
|
+ BX_KEY_MINUS,
|
|
|
|
+ BX_KEY_EQUALS,
|
|
|
|
+ BX_KEY_BACKSPACE,
|
|
|
|
+ BX_KEY_TAB,
|
|
|
|
+ /* 0x10 - 0x1f */
|
|
|
|
+ BX_KEY_Q,
|
|
|
|
+ BX_KEY_W,
|
|
|
|
+ BX_KEY_E,
|
|
|
|
+ BX_KEY_R,
|
|
|
|
+ BX_KEY_T,
|
|
|
|
+ BX_KEY_Y,
|
|
|
|
+ BX_KEY_U,
|
|
|
|
+ BX_KEY_I,
|
|
|
|
+ BX_KEY_O,
|
|
|
|
+ BX_KEY_P,
|
|
|
|
+ BX_KEY_LEFT_BRACKET,
|
|
|
|
+ BX_KEY_RIGHT_BRACKET,
|
|
|
|
+ BX_KEY_ENTER,
|
|
|
|
+ BX_KEY_CTRL_L,
|
|
|
|
+ BX_KEY_A,
|
|
|
|
+ BX_KEY_S,
|
|
|
|
+ /* 0x20 - 0x2f */
|
|
|
|
+ BX_KEY_D,
|
|
|
|
+ BX_KEY_F,
|
|
|
|
+ BX_KEY_G,
|
|
|
|
+ BX_KEY_H,
|
|
|
|
+ BX_KEY_J,
|
|
|
|
+ BX_KEY_K,
|
|
|
|
+ BX_KEY_L,
|
|
|
|
+ BX_KEY_SEMICOLON,
|
|
|
|
+ BX_KEY_SINGLE_QUOTE,
|
|
|
|
+ BX_KEY_GRAVE,
|
|
|
|
+ BX_KEY_SHIFT_L,
|
|
|
|
+ BX_KEY_BACKSLASH,
|
|
|
|
+ BX_KEY_Z,
|
|
|
|
+ BX_KEY_X,
|
|
|
|
+ BX_KEY_C,
|
|
|
|
+ BX_KEY_V,
|
|
|
|
+ /* 0x30 - 0x3f */
|
|
|
|
+ BX_KEY_B,
|
|
|
|
+ BX_KEY_N,
|
|
|
|
+ BX_KEY_M,
|
|
|
|
+ BX_KEY_COMMA,
|
|
|
|
+ BX_KEY_PERIOD,
|
|
|
|
+ BX_KEY_SLASH,
|
|
|
|
+ BX_KEY_SHIFT_R,
|
|
|
|
+ BX_KEY_KP_MULTIPLY,
|
|
|
|
+ BX_KEY_ALT_L,
|
|
|
|
+ BX_KEY_SPACE,
|
|
|
|
+ BX_KEY_CAPS_LOCK,
|
|
|
|
+ BX_KEY_F1,
|
|
|
|
+ BX_KEY_F2,
|
|
|
|
+ BX_KEY_F3,
|
|
|
|
+ BX_KEY_F4,
|
|
|
|
+ BX_KEY_F5,
|
|
|
|
+ /* 0x40 - 0x4f */
|
|
|
|
+ BX_KEY_F6,
|
|
|
|
+ BX_KEY_F7,
|
|
|
|
+ BX_KEY_F8,
|
|
|
|
+ BX_KEY_F9,
|
|
|
|
+ BX_KEY_F10,
|
|
|
|
+ BX_KEY_PAUSE,
|
|
|
|
+ BX_KEY_SCRL_LOCK,
|
|
|
|
+ BX_KEY_KP_HOME,
|
|
|
|
+ BX_KEY_KP_UP,
|
|
|
|
+ BX_KEY_KP_PAGE_UP,
|
|
|
|
+ BX_KEY_KP_SUBTRACT,
|
|
|
|
+ BX_KEY_KP_LEFT,
|
|
|
|
+ BX_KEY_KP_5,
|
|
|
|
+ BX_KEY_KP_RIGHT,
|
|
|
|
+ BX_KEY_KP_ADD,
|
|
|
|
+ BX_KEY_KP_END,
|
|
|
|
+ /* 0x50 - 0x58 */
|
|
|
|
+ BX_KEY_KP_DOWN,
|
|
|
|
+ BX_KEY_KP_PAGE_DOWN,
|
|
|
|
+ BX_KEY_KP_INSERT,
|
|
|
|
+ BX_KEY_KP_DELETE,
|
|
|
|
+ 0,
|
|
|
|
+ 0,
|
|
|
|
+ BX_KEY_LEFT_BACKSLASH,
|
|
|
|
+ BX_KEY_F11,
|
|
|
|
+ BX_KEY_F12
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
/* Macro to convert WM_ button state to BX button state */
|
|
|
|
|
|
|
|
#ifdef __MINGW32__
|
|
|
|
@@ -670,7 +768,7 @@
|
|
|
|
|
|
|
|
void bx_win32_gui_c::handle_events(void) {
|
|
|
|
Bit32u key;
|
|
|
|
- unsigned char scancode;
|
|
|
|
+ Bit32u key_event;
|
|
|
|
|
|
|
|
// printf("# Hey!!!\n");
|
|
|
|
|
|
|
|
@@ -685,9 +783,6 @@
|
|
|
|
QueueEvent* queue_event=deq_key_event();
|
|
|
|
if ( ! queue_event)
|
|
|
|
break;
|
|
|
|
- // Bypass DEV_kbd_gen_scancode so we may enter
|
|
|
|
- // a scancode directly
|
|
|
|
- // DEV_kbd_gen_scancode(deq_key_event());
|
|
|
|
key = queue_event->key_event;
|
|
|
|
if ( key==MOUSE_MOTION)
|
|
|
|
{
|
|
|
|
@@ -703,23 +798,71 @@
|
|
|
|
headerbar_click(LOWORD(key));
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
- // Swap the scancodes of "numlock" and "pause"
|
|
|
|
- if ((key & 0xff)==0x45) key ^= 0x100;
|
|
|
|
if (key & 0x0100) {
|
|
|
|
- // This makes the "AltGr" key on European keyboards work
|
|
|
|
- if (key==0x138) {
|
|
|
|
- scancode = 0x9d; // left control key released
|
|
|
|
- DEV_kbd_put_scancode(&scancode, 1);
|
|
|
|
- }
|
|
|
|
- // Its an extended key
|
|
|
|
- scancode = 0xE0;
|
|
|
|
- DEV_kbd_put_scancode(&scancode, 1);
|
|
|
|
+ // It's an extended key
|
|
|
|
+ switch (key & 0xff) {
|
|
|
|
+ case 0x1C:
|
|
|
|
+ key_event = BX_KEY_KP_ENTER;
|
|
|
|
+ break;
|
|
|
|
+ case 0x1D:
|
|
|
|
+ key_event = BX_KEY_CTRL_R;
|
|
|
|
+ break;
|
|
|
|
+ case 0x35:
|
|
|
|
+ key_event = BX_KEY_KP_DIVIDE;
|
|
|
|
+ break;
|
|
|
|
+ case 0x38:
|
|
|
|
+ // This makes the "AltGr" key on European keyboards work
|
|
|
|
+ DEV_kbd_gen_scancode(BX_KEY_CTRL_L | BX_KEY_RELEASED);
|
|
|
|
+ key_event = BX_KEY_ALT_R;
|
|
|
|
+ break;
|
|
|
|
+ case 0x45:
|
|
|
|
+ key_event = BX_KEY_NUM_LOCK;
|
|
|
|
+ break;
|
|
|
|
+ case 0x47:
|
|
|
|
+ key_event = BX_KEY_HOME;
|
|
|
|
+ break;
|
|
|
|
+ case 0x48:
|
|
|
|
+ key_event = BX_KEY_UP;
|
|
|
|
+ break;
|
|
|
|
+ case 0x49:
|
|
|
|
+ key_event = BX_KEY_PAGE_UP;
|
|
|
|
+ break;
|
|
|
|
+ case 0x4B:
|
|
|
|
+ key_event = BX_KEY_LEFT;
|
|
|
|
+ break;
|
|
|
|
+ case 0x4D:
|
|
|
|
+ key_event = BX_KEY_RIGHT;
|
|
|
|
+ break;
|
|
|
|
+ case 0x4F:
|
|
|
|
+ key_event = BX_KEY_END;
|
|
|
|
+ break;
|
|
|
|
+ case 0x50:
|
|
|
|
+ key_event = BX_KEY_DOWN;
|
|
|
|
+ break;
|
|
|
|
+ case 0x51:
|
|
|
|
+ key_event = BX_KEY_PAGE_DOWN;
|
|
|
|
+ break;
|
|
|
|
+ case 0x52:
|
|
|
|
+ key_event = BX_KEY_INSERT;
|
|
|
|
+ break;
|
|
|
|
+ case 0x53:
|
|
|
|
+ key_event = BX_KEY_DELETE;
|
|
|
|
+ break;
|
|
|
|
+ case 0x5B:
|
|
|
|
+ key_event = BX_KEY_WIN_L;
|
|
|
|
+ break;
|
|
|
|
+ case 0x5C:
|
|
|
|
+ key_event = BX_KEY_WIN_R;
|
|
|
|
+ break;
|
|
|
|
+ case 0x5D:
|
|
|
|
+ key_event = BX_KEY_MENU;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ key_event = win32_to_bx_key[key & 0xff];
|
|
|
|
}
|
|
|
|
- // Its a key
|
|
|
|
- scancode = LOBYTE(LOWORD(key));
|
|
|
|
- // printf("# key = %d, scancode = %d\n",key,scancode);
|
|
|
|
- if (key & BX_KEY_RELEASED) scancode |= 0x80;
|
|
|
|
- DEV_kbd_put_scancode(&scancode, 1);
|
|
|
|
+ if (key & BX_KEY_RELEASED) key_event |= BX_KEY_RELEASED;
|
|
|
|
+ DEV_kbd_gen_scancode(key_event);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
LeaveCriticalSection(&stInfo.keyCS);
|