|
@@ -22,11 +22,11 @@ static char map[0x80] = {
|
|
|
'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n', 0,
|
|
|
'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '`', 0, '\\',
|
|
|
'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/',
|
|
|
- 0, 0, 0, ' ', 0, 0,
|
|
|
+ 0, '*', 0, ' ', 0, 0,
|
|
|
//60
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
//70
|
|
|
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
+ 0, 0, 0, 0, '-', 0, 0, 0, '+', 0,
|
|
|
//80
|
|
|
0, 0, 0, 0, 0, 0, '\\', 0, 0, 0,
|
|
|
};
|
|
@@ -36,15 +36,17 @@ static char shift_map[0x80] = {
|
|
|
'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', '\n', 0,
|
|
|
'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"', '~', 0, '|',
|
|
|
'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?',
|
|
|
- 0, 0, 0, ' ', 0, 0,
|
|
|
+ 0, '*', 0, ' ', 0, 0,
|
|
|
//60
|
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
//70
|
|
|
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
|
+ 0, 0, 0, 0, '-', 0, 0, 0, '+', 0,
|
|
|
//80
|
|
|
0, 0, 0, 0, 0, 0, '|', 0, 0, 0,
|
|
|
};
|
|
|
|
|
|
+static char numpad_map[13] = { '7', '8', '9', 0, '4', '5', '6', 0, '1', '2', '3', '0', ',' };
|
|
|
+
|
|
|
static KeyCode unshifted_key_map[0x80] = {
|
|
|
Key_Invalid,
|
|
|
Key_Escape,
|
|
@@ -101,7 +103,7 @@ static KeyCode unshifted_key_map[0x80] = {
|
|
|
Key_Period,
|
|
|
Key_Slash,
|
|
|
Key_RightShift, // 54
|
|
|
- Key_Invalid,
|
|
|
+ Key_Asterisk,
|
|
|
Key_Alt, // 56
|
|
|
Key_Space, // 57
|
|
|
Key_CapsLock, // 58
|
|
@@ -115,16 +117,16 @@ static KeyCode unshifted_key_map[0x80] = {
|
|
|
Key_F8,
|
|
|
Key_F9,
|
|
|
Key_F10,
|
|
|
- Key_Invalid,
|
|
|
+ Key_NumLock,
|
|
|
Key_Invalid, // 70
|
|
|
Key_Home,
|
|
|
Key_Up,
|
|
|
Key_PageUp,
|
|
|
- Key_Invalid,
|
|
|
+ Key_Minus,
|
|
|
Key_Left,
|
|
|
Key_Invalid,
|
|
|
Key_Right, // 77
|
|
|
- Key_Invalid,
|
|
|
+ Key_Plus,
|
|
|
Key_End,
|
|
|
Key_Down, // 80
|
|
|
Key_PageDown,
|
|
@@ -196,7 +198,7 @@ static KeyCode shifted_key_map[0x100] = {
|
|
|
Key_GreaterThan,
|
|
|
Key_QuestionMark,
|
|
|
Key_RightShift, // 54
|
|
|
- Key_Invalid,
|
|
|
+ Key_Asterisk,
|
|
|
Key_Alt,
|
|
|
Key_Space, // 57
|
|
|
Key_CapsLock, // 58
|
|
@@ -210,16 +212,16 @@ static KeyCode shifted_key_map[0x100] = {
|
|
|
Key_F8,
|
|
|
Key_F9,
|
|
|
Key_F10,
|
|
|
- Key_Invalid,
|
|
|
+ Key_NumLock,
|
|
|
Key_Invalid, // 70
|
|
|
Key_Home,
|
|
|
Key_Up,
|
|
|
Key_PageUp,
|
|
|
- Key_Invalid,
|
|
|
+ Key_Minus,
|
|
|
Key_Left,
|
|
|
Key_Invalid,
|
|
|
Key_Right, // 77
|
|
|
- Key_Invalid,
|
|
|
+ Key_Plus,
|
|
|
Key_End,
|
|
|
Key_Down, // 80
|
|
|
Key_PageDown,
|
|
@@ -235,11 +237,31 @@ static KeyCode shifted_key_map[0x100] = {
|
|
|
Key_Logo,
|
|
|
};
|
|
|
|
|
|
+static KeyCode numpad_key_map[13] = { Key_7, Key_8, Key_9, Key_Invalid, Key_4, Key_5, Key_6, Key_Invalid, Key_1, Key_2, Key_3, Key_0, Key_Comma };
|
|
|
+
|
|
|
void KeyboardDevice::key_state_changed(u8 raw, bool pressed)
|
|
|
{
|
|
|
KeyCode key = (m_modifiers & Mod_Shift) ? shifted_key_map[raw] : unshifted_key_map[raw];
|
|
|
char character = (m_modifiers & Mod_Shift) ? shift_map[raw] : map[raw];
|
|
|
|
|
|
+ if (key == Key_NumLock && pressed)
|
|
|
+ m_num_lock_on = !m_num_lock_on;
|
|
|
+
|
|
|
+ if (m_num_lock_on && m_is_numpad_key)
|
|
|
+ {
|
|
|
+ if (raw >= 0x47 && raw <= 0x53)
|
|
|
+ {
|
|
|
+ u8 index = raw - 0x47;
|
|
|
+ KeyCode newKey = numpad_key_map[index];
|
|
|
+
|
|
|
+ if (newKey != Key_Invalid)
|
|
|
+ {
|
|
|
+ key = newKey;
|
|
|
+ character = numpad_map[index];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (key == Key_CapsLock && pressed)
|
|
|
m_caps_lock_on = !m_caps_lock_on;
|
|
|
|
|
@@ -260,6 +282,8 @@ void KeyboardDevice::key_state_changed(u8 raw, bool pressed)
|
|
|
if (m_client)
|
|
|
m_client->on_key_pressed(event);
|
|
|
m_queue.enqueue(event);
|
|
|
+
|
|
|
+ m_is_numpad_key = true;
|
|
|
}
|
|
|
|
|
|
void KeyboardDevice::handle_irq()
|
|
@@ -289,6 +313,10 @@ void KeyboardDevice::handle_irq()
|
|
|
case 0x36:
|
|
|
update_modifier(Mod_Shift, pressed);
|
|
|
break;
|
|
|
+ case 0x60:
|
|
|
+ // This flag means next key pressed could be but is not a numpad key.
|
|
|
+ m_is_numpad_key = false;
|
|
|
+ return;
|
|
|
}
|
|
|
switch (ch) {
|
|
|
case I8042_ACK:
|