--- Sources/Core/Input/TTY/keyboard_tty.cpp.orig Wed Apr 26 00:40:16 2000 +++ Sources/Core/Input/TTY/keyboard_tty.cpp Mon Sep 25 00:44:59 2000 @@ -40,8 +40,9 @@ #endif #ifdef HAVE_SYS_VT_H #include -#else -#include +#else /* FreeBSD :-P */ +#include +#include #endif #include @@ -72,56 +73,14 @@ // CL_System_Generic::keep_alives.add(this); /* open the tty */ - fd = open("/dev/tty", O_RDWR | O_NONBLOCK); + fd = keyboard_init_return_fd(); if (fd < 0) { throw CL_Error("Couldn't open /dev/tty."); } - /* put tty into "straight through" mode. */ - struct termios newterm; - - if (tcgetattr(fd, &old_termios) < 0) - { - perror("tcgetattr failed"); - } - - memcpy ( &newterm, &old_termios, sizeof(termios) ); - - newterm.c_lflag &= ~(ICANON | ECHO | ISIG); - newterm.c_iflag &= ~(ISTRIP | IGNCR | ICRNL | INLCR | IXOFF | IXON); - newterm.c_iflag |= IGNBRK; - newterm.c_cc[VMIN] = 0; - newterm.c_cc[VTIME] = 0; - - if (tcsetattr(fd, TCSANOW, &newterm) < 0) - { - perror("tcsetattr failed"); - } - - /* save old mode and set to mediumraw */ - if (ioctl(fd, KDGKBMODE, &old_mode) < 0) - { - perror("Couldn't get keyboard mode"); - old_mode = K_XLATE; - } - if (ioctl(fd, KDSKBMODE, K_MEDIUMRAW) < 0) - { - perror("Couldn't set keyboard mode to K_MEDIUMRAW"); - } - - /* save old kd mode and set to graphics */ - if (ioctl(fd, KDGETMODE, &old_kd) < 0) - { - perror("Couldn't get kd mode"); - old_kd = KD_TEXT; - } - if (ioctl(fd, KDSETMODE, KD_GRAPHICS) < 0) - { - perror("Couldn't set kd mode to KD_GRAPHICS"); - } - + ioctl(fd, GIO_KEYMAP, &vga_keymap); buttons = new CL_InputButton_TTYKeyboard*[CL_NUM_KEYS]; for (int i=0; i=0) { - ioctl(fd, KDSKBMODE, old_mode); - ioctl(fd, KDSETMODE, old_kd); - if (tcsetattr(fd, TCSANOW, &old_termios) < 0) - { - std::cerr << "Could not restore old terminal input settings! Please run 'reset'!" << std::endl; - perror( "System error message" ); - } + keyboard_close(); close(fd); } } @@ -172,8 +125,8 @@ void CL_TTYKeyboard::handle_code(char code) { bool keydown; - kbentry entry; - + struct keyent_t entry; + if (code & 0x80) { code &= 0x7f; @@ -183,109 +136,115 @@ keydown = true; } + // Simple belt against out-of-range codes + if (code >= vga_keymap.n_keys) + return; + //fetch the keycode - entry.kb_table = 0; - entry.kb_index = code; - ioctl(fd,KDGKBENT,&entry); + entry = vga_keymap.key[code]; CL_Key key; - key.id = translate(entry.kb_value); + key.id = translate(entry); key.ascii = -1; key.state = keydown ? CL_Key::Pressed : CL_Key::Released; if (keydown) CL_Input::chain_button_press.on_button_press(this, key); else CL_Input::chain_button_release.on_button_release(this, key); - keymap[translate(entry.kb_value)] = keydown; + keymap[translate(entry)] = keydown; } -char CL_TTYKeyboard::translate(int kb_value) +char CL_TTYKeyboard::translate(struct keyent_t kb_value) { - switch (kb_value) - { - case K_F1: return CL_KEY_F1; - case K_F2: return CL_KEY_F2; - case K_F3: return CL_KEY_F3; - case K_F4: return CL_KEY_F4; - case K_F5: return CL_KEY_F5; - case K_F6: return CL_KEY_F6; - case K_F7: return CL_KEY_F7; - case K_F8: return CL_KEY_F8; - case K_F9: return CL_KEY_F9; - case K_F10: return CL_KEY_F10; - case K_F11: return CL_KEY_F11; - case K_F12: return CL_KEY_F12; - - case 2816+'a': return CL_KEY_A; - case 2816+'b': return CL_KEY_B; - case 2816+'c': return CL_KEY_C; - case 2816+'d': return CL_KEY_D; - case 2816+'e': return CL_KEY_E; - case 2816+'f': return CL_KEY_F; - case 2816+'g': return CL_KEY_G; - case 2816+'h': return CL_KEY_H; - case 2816+'i': return CL_KEY_I; - case 2816+'j': return CL_KEY_J; - case 2816+'k': return CL_KEY_K; - case 2816+'l': return CL_KEY_L; - case 2816+'m': return CL_KEY_M; - case 2816+'n': return CL_KEY_N; - case 2816+'o': return CL_KEY_O; - case 2816+'p': return CL_KEY_P; - case 2816+'q': return CL_KEY_Q; - case 2816+'r': return CL_KEY_R; - case 2816+'s': return CL_KEY_S; - case 2816+'t': return CL_KEY_T; - case 2816+'u': return CL_KEY_U; - case 2816+'v': return CL_KEY_V; - case 2816+'w': return CL_KEY_W; - case 2816+'x': return CL_KEY_X; - case 2816+'y': return CL_KEY_Y; - case 2816+'z': return CL_KEY_Z; + if (kb_value.spcl & 0x80) + switch (kb_value.map[0]) + { + case F(1): return CL_KEY_F1; + case F(2): return CL_KEY_F2; + case F(3): return CL_KEY_F3; + case F(4): return CL_KEY_F4; + case F(5): return CL_KEY_F5; + case F(6): return CL_KEY_F6; + case F(7): return CL_KEY_F7; + case F(8): return CL_KEY_F8; + case F(9): return CL_KEY_F9; + case F(10): return CL_KEY_F10; + case F(11): return CL_KEY_F11; + case F(12): return CL_KEY_F12; + + case RCTR: return CL_KEY_LCTRL; + case LCTR: return CL_KEY_RCTRL; + case LSH: return CL_KEY_LSHIFT; + case RSH: return CL_KEY_RSHIFT; + case LALT: return CL_KEY_ALT; + case RALT: return CL_KEY_ALTGR; + + case CLK: return CL_KEY_CAPSLOCK; + case NLK: return CL_KEY_NUMLOCK; + case SLK: return CL_KEY_SCRLOCK; + + case F(49): return CL_KEY_HOME; + case F(50): return CL_KEY_UP; + case F(51): return CL_KEY_PAGEUP; + case F(53): return CL_KEY_LEFT; + case F(55): return CL_KEY_RIGHT; + case F(57): return CL_KEY_END; + case F(58): return CL_KEY_DOWN; + case F(59): return CL_KEY_PAGEDOWN; + case F(60): return CL_KEY_INSERT; + case F(61): return CL_KEY_DELETE; + + case NEXT: return CL_KEY_PRINT; + } + else switch (kb_value.map[0]) + { + case 'a': return CL_KEY_A; + case 'b': return CL_KEY_B; + case 'c': return CL_KEY_C; + case 'd': return CL_KEY_D; + case 'e': return CL_KEY_E; + case 'f': return CL_KEY_F; + case 'g': return CL_KEY_G; + case 'h': return CL_KEY_H; + case 'i': return CL_KEY_I; + case 'j': return CL_KEY_J; + case 'k': return CL_KEY_K; + case 'l': return CL_KEY_L; + case 'm': return CL_KEY_M; + case 'n': return CL_KEY_N; + case 'o': return CL_KEY_O; + case 'p': return CL_KEY_P; + case 'q': return CL_KEY_Q; + case 'r': return CL_KEY_R; + case 's': return CL_KEY_S; + case 't': return CL_KEY_T; + case 'u': return CL_KEY_U; + case 'v': return CL_KEY_V; + case 'w': return CL_KEY_W; + case 'x': return CL_KEY_X; + case 'y': return CL_KEY_Y; + case 'z': return CL_KEY_Z; + case ' ': return CL_KEY_SPACE; - case 48: return CL_KEY_0; - case 49: return CL_KEY_1; - case 50: return CL_KEY_2; - case 51: return CL_KEY_3; - case 52: return CL_KEY_4; - case 53: return CL_KEY_5; - case 54: return CL_KEY_6; - case 55: return CL_KEY_7; - case 56: return CL_KEY_8; - case 57: return CL_KEY_9; + case '0': return CL_KEY_0; + case '1': return CL_KEY_1; + case '2': return CL_KEY_2; + case '3': return CL_KEY_3; + case '4': return CL_KEY_4; + case '5': return CL_KEY_5; + case '6': return CL_KEY_6; + case '7': return CL_KEY_7; + case '8': return CL_KEY_8; + case '9': return CL_KEY_9; - case 27: return CL_KEY_ESCAPE; - case K_LEFT: return CL_KEY_LEFT; - case K_RIGHT: return CL_KEY_RIGHT; - case K_UP: return CL_KEY_UP; - case K_DOWN: return CL_KEY_DOWN; - case K_ENTER: return CL_KEY_ENTER; - - case K_CTRLL: return CL_KEY_LCTRL; - case K_CTRLR: return CL_KEY_RCTRL; - case K_SHIFTL: return CL_KEY_LSHIFT; - case K_SHIFTR: return CL_KEY_RSHIFT; - case K_ALT: return CL_KEY_ALT; - case K_ALTGR: return CL_KEY_ALTGR; - case 9: return CL_KEY_TAB; - case 32: return CL_KEY_SPACE; - case 127: return CL_KEY_BACKSPACE; - case K_INSERT: return CL_KEY_INSERT; - case K_REMOVE: return CL_KEY_DELETE; - case K_FIND: return CL_KEY_HOME; - case K_SELECT: return CL_KEY_END; - case K_PGUP: return CL_KEY_PAGEUP; - case K_PGDN: return CL_KEY_PAGEDOWN; - case K_CAPS: return CL_KEY_CAPSLOCK; - case K_NUM: return CL_KEY_NUMLOCK; - case K_HOLD: return CL_KEY_SCRLOCK; - case 28: return CL_KEY_PRINT; - case K(1,29): return CL_KEY_PAUSE; - case K_PSLASH: return CL_KEY_KP_DIV; - case K_PSTAR: return CL_KEY_KP_MULT; - case K_PMINUS: return CL_KEY_KP_MINUS; - case K_PPLUS: return CL_KEY_KP_PLUS; - case K_PENTER: return CL_KEY_KP_ENTER; + case 27: return CL_KEY_ESCAPE; + case 13: return CL_KEY_ENTER; + case 9: return CL_KEY_TAB; + case 8: return CL_KEY_BACKSPACE; + case '/': return CL_KEY_KP_DIV; + case '*': return CL_KEY_KP_MULT; + case '-': return CL_KEY_KP_MINUS; + case '+': return CL_KEY_KP_PLUS; } return CL_KEY_NONE_OF_THE_ABOVE;