Add escape strings and buffer management

This commit is contained in:
Laurent Vivier 2005-08-25 21:45:11 +00:00
parent 5a18009707
commit 9c2f76491c
2 changed files with 148 additions and 23 deletions

View File

@ -4,6 +4,7 @@
*
*/
#include "lowmem.h"
#include "misc.h"
#include "glue.h"
#include "keyboard.h"
@ -71,7 +72,7 @@ static keyboard_map_t symbols[scancode_Last] = {
{ '`', '~', 0, 0 }, /* 32 scancode_Tilde */
{ '\b', '\b', 0, 0 }, /* 33 scancode_Backspace */
{ 0, 0, 0, 0 }, /* 34 ? */
{ 0x1b, 0x1b, 0, 0 }, /* 35 scancode_Escape */
{ 0x1b, 0, 0, 0 }, /* 35 scancode_Escape */
{ 0, 0, 0, 0 }, /* 36 ? */
{ 0, 0, 0, 0 }, /* 37 scancode_Command */
{ 0, 0, 0, 0 }, /* 38 scancode_LeftShift */
@ -114,40 +115,105 @@ static keyboard_map_t symbols[scancode_Last] = {
{ 0, 0, 0, 0 }, /* 5d ? */
{ 0, 0, 0, 0 }, /* 5e ? */
{ 0, 0, 0, 0 }, /* 5f ? */
{ 0, 0, 0, 0 }, /* 60 scancode_F5 */
{ 0, 0, 0, 0 }, /* 61 scancode_F6 */
{ 0, 0, 0, 0 }, /* 62 scancode_F7 */
{ 0, 0, 0, 0 }, /* 63 scancode_F3 */
{ 0, 0, 0, 0 }, /* 64 scancode_F8 */
{ 0, 0, 0, 0 }, /* 65 scancode_F9 */
{ 0x1b, 0, 0, 0 }, /* 60 scancode_F5 */
{ 0x1b, 0, 0, 0 }, /* 61 scancode_F6 */
{ 0x1b, 0, 0, 0 }, /* 62 scancode_F7 */
{ 0x1b, 0, 0, 0 }, /* 63 scancode_F3 */
{ 0x1b, 0, 0, 0 }, /* 64 scancode_F8 */
{ 0x1b, 0, 0, 0 }, /* 65 scancode_F9 */
{ 0, 0, 0, 0 }, /* 66 ? */
{ 0, 0, 0, 0 }, /* 67 scancode_F11 */
{ 0x1b, 0, 0, 0 }, /* 67 scancode_F11 */
{ 0, 0, 0, 0 }, /* 68 ? */
{ 0, 0, 0, 0 }, /* 69 scancode_PrintScreen */
{ 0, 0, 0, 0 }, /* 6a ? */
{ 0, 0, 0, 0 }, /* 6b scancode_ScreenLock */
{ 0, 0, 0, 0 }, /* 6c ? */
{ 0, 0, 0, 0 }, /* 6d scancode_F10 */
{ 0x1b, 0, 0, 0 }, /* 6d scancode_F10 */
{ 0, 0, 0, 0 }, /* 6e ? */
{ 0, 0, 0, 0 }, /* 6f scancode_F12 */
{ 0x1b, 0, 0, 0 }, /* 6f scancode_F12 */
{ 0, 0, 0, 0 }, /* 70 ? */
{ 0, 0, 0, 0 }, /* 71 scancode_Pause */
{ 0, 0, 0, 0 }, /* 72 scancode_Insert */
{ 0, 0, 0, 0 }, /* 73 scancode_Home */
{ 0, 0, 0, 0 }, /* 74 scancode_PageUp */
{ 0, 0, 0, 0 }, /* 75 scancode_Del */
{ 0, 0, 0, 0 }, /* 76 scancode_F4 */
{ 0, 0, 0, 0 }, /* 77 scancode_End */
{ 0, 0, 0, 0 }, /* 78 scancode_F2 */
{ 0, 0, 0, 0 }, /* 79 scancode_PageDown */
{ 0, 0, 0, 0 }, /* 7a scancode_F1 */
{ 0, 0, 0, 0 }, /* 7b scancode_Left */
{ 0, 0, 0, 0 }, /* 7c scancode_Right */
{ 0, 0, 0, 0 }, /* 7d scancode_Down */
{ 0, 0, 0, 0 }, /* 7e scancode_Up */
{ 0x1b, 0, 0, 0 }, /* 72 scancode_Insert */
{ 0x1b, 0, 0, 0 }, /* 73 scancode_Home */
{ 0x1b, 0, 0, 0 }, /* 74 scancode_PageUp */
{ 0x7f, 0, 0, 0 }, /* 75 scancode_Del */
{ 0x1b, 0, 0, 0 }, /* 76 scancode_F4 */
{ 0x1b, 0, 0, 0 }, /* 77 scancode_End */
{ 0x1b, 0, 0, 0 }, /* 78 scancode_F2 */
{ 0x1b, 0, 0, 0 }, /* 79 scancode_PageDown */
{ 0x1b, 0, 0, 0 }, /* 7a scancode_F1 */
{ 0x1b, 0, 0, 0 }, /* 7b scancode_Left */
{ 0x1b, 0, 0, 0 }, /* 7c scancode_Right */
{ 0x1b, 0, 0, 0 }, /* 7d scancode_Down */
{ 0x1b, 0, 0, 0 }, /* 7e scancode_Up */
{ 0, 0, 0, 0 }, /* 7f ? */
};
typedef struct char_string {
scancodes_t code;
char *string;
} char_string_t;
static char_string_t escape_strings[] = {
{ scancode_Escape, 0 },
{ scancode_F5, "[15~" },
{ scancode_F6, "[17~" },
{ scancode_F7, "[18~" },
{ scancode_F3, "OR" },
{ scancode_F8, "[19~" },
{ scancode_F9, "[20~" },
{ scancode_F11, "[23~" },
{ scancode_F10, "[21~" },
{ scancode_F12, "[24~" },
{ scancode_Insert, "[2~" },
{ scancode_Home, "[1~" },
{ scancode_PageUp, "[5~" },
{ scancode_F4, "OS" },
{ scancode_End, "[4~" },
{ scancode_F2, "OQ" },
{ scancode_PageDown, "[6~" },
{ scancode_F1, "OP" },
{ scancode_Left, "[D" },
{ scancode_Right, "[C" },
{ scancode_Down, "[B" },
{ scancode_Up, "[A" },
{ 0, 0 }
};
#define BUFFER_SIZE 64
static int head = 0;
static int length = 0;
static char buffer[BUFFER_SIZE];
static inline void buffer_put(char c)
{
buffer[(head + length) % BUFFER_SIZE] = c;
length++;
}
static inline int buffer_get(void)
{
int c;
if (length == 0)
return -1;
c = buffer[head];
head = (head + 1) % BUFFER_SIZE;
length--;
return c;
}
static inline void buffer_putstring(char *s)
{
if (!s)
return;
while(*s)
buffer_put(*s++);
}
void keyboard_get_scancode(int *modifiers, int *code)
{
KeyMap keyboard= {0,0,0,0};
@ -209,6 +275,7 @@ int keyboard_convert_scancode(int modifiers, int scancode)
(modifiers & modifier_capslock))
{
c = symbols[scancode].shift;
c = symbols[scancode].shift;
} else if (modifiers & modifier_option)
{
c = symbols[scancode].option;
@ -219,3 +286,59 @@ int keyboard_convert_scancode(int modifiers, int scancode)
return c;
}
static int keyboard_catch()
{
static long last_KeyTime = -1;
int modifiers, scancode;
int c;
int i;
keyboard_get_scancode(&modifiers, &scancode);
if (KeyTime != last_KeyTime)
{
c = keyboard_convert_scancode(modifiers, scancode);
if (c == 0x1b)
{
for (i = 0; escape_strings[i].code; i++)
{
if (escape_strings[i].code == c)
{
buffer_put(0x1b);
buffer_putstring(
escape_strings[i].string);
break;
}
}
}
else if (c != 0)
buffer_put(c);
last_KeyTime = KeyTime;
}
if (modifiers || (scancode < scancode_Last - 1))
return 1;
return 0;
}
int keyboard_keypressed(int timeout)
{
long time = Ticks + timeout;
while (Ticks < time)
{
if (keyboard_catch())
return 1;
}
return 0;
}
int keyboard_getchar()
{
keyboard_catch();
return buffer_get();
}

View File

@ -124,3 +124,5 @@ typedef enum scancodes {
extern void keyboard_get_scancode(int *modifiers, int *code);
extern int keyboard_convert_scancode(int modifiers, int scancode);
extern int keyboard_keypressed(int timeout);
extern int keyboard_getchar();