305 lines
8.2 KiB
Plaintext
305 lines
8.2 KiB
Plaintext
--- 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 <sys/vt.h>
|
|
-#else
|
|
-#include <linux/vt.h>
|
|
+#else /* FreeBSD :-P */
|
|
+#include <vgakeyboard.h>
|
|
+#include <sys/consio.h>
|
|
#endif
|
|
|
|
#include <linux/keyboard.h>
|
|
@@ -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<CL_NUM_KEYS; i++) buttons[i] = NULL;
|
|
}
|
|
@@ -144,13 +103,7 @@
|
|
{
|
|
if (fd>=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;
|