Quick hack on our temporary keyboard driver to allow cursor movement and stuff like Control-D.

For example, command line history now works in the bash :)


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@9721 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2004-11-01 21:46:24 +00:00
parent ed85746ace
commit f09f1fa660
@@ -31,6 +31,16 @@ enum keycodes {
NUM_LOCK = 69,
SCR_LOCK = 70,
SYS_REQ = 55,
LCONTROL = 29,
RCONTROL = 29, // dunno what it really is
CURSOR_LEFT = 75,
CURSOR_RIGHT = 77,
CURSOR_UP = 72,
CURSOR_DOWN = 80,
HOME = 71,
END = 79,
F1 = 0x3b,
F2, F3, F4, F5, F6,
@@ -46,7 +56,7 @@ enum keycodes {
int32 api_version = B_CUR_DRIVER_API_VERSION;
static bool shift;
static bool shift, sControl;
static int leds;
static sem_id keyboard_sem;
static mutex keyboard_read_mutex;
@@ -54,6 +64,9 @@ static char keyboard_buf[1024];
static unsigned int head, tail;
static isa_module_info *gISA;
// begins with HOME, end with CURSOR_DOWN
static const char sControlKeys[] = {'@', 'A', 0, 0, 'D', 0, 'C', 0, '[', 'B'};
// stolen from nujeffos
const char unshifted_keymap[128] = {
0, 27, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 8, '\t',
@@ -138,6 +151,8 @@ handle_keyboard_interrupt(void *data)
// key up
if (key == LSHIFT + 0x80 || key == RSHIFT + 0x80)
shift = false;
if (key == LCONTROL + 0x80 || key == RCONTROL + 0x80)
sControl = false;
return B_HANDLED_INTERRUPT;
}
@@ -147,6 +162,10 @@ handle_keyboard_interrupt(void *data)
case RSHIFT:
shift = true;
break;
case LCONTROL:
//case RCONTROL:
sControl = true;
break;
case CAPS_LOCK:
if (leds & LED_CAPS)
leds &= ~LED_CAPS;
@@ -190,10 +209,22 @@ handle_keyboard_interrupt(void *data)
reboot();
break;
case HOME:
case END:
case CURSOR_DOWN:
case CURSOR_UP:
case CURSOR_LEFT:
case CURSOR_RIGHT:
insert_in_buf(0x1b);
insert_in_buf('[');
insert_in_buf(sControlKeys[key - HOME]);
retval = B_INVOKE_SCHEDULER;
break;
default: {
char ascii;
if (shift)
if (shift || sControl)
ascii = shifted_keymap[key];
else {
if (leds & LED_CAPS)
@@ -202,6 +233,9 @@ handle_keyboard_interrupt(void *data)
ascii = unshifted_keymap[key];
}
if (sControl && ascii >= 64 && ascii < 96)
ascii -= 0100;
TRACE(("ascii = 0x%x, '%c'\n", ascii, ascii));
if (ascii != 0) {
@@ -380,7 +414,8 @@ init_driver()
if (mutex_init(&keyboard_read_mutex, "keyboard_read_mutex") < 0)
panic("could not create keyboard read mutex!\n");
shift = 0;
shift = false;
sControl = false;
leds = 0;
// have the scroll lock reflect the state of serial debugging