📄 kb_input.c
字号:
case 'V': return KEY_PGUP ; break;
case 'U': return KEY_PGDN ; break;
case 'a': return KEY_UP ; break; /* CTRL_UP */
case 'b': return KEY_DOWN ; break; /* CTRL_DOWN */
case 'c': return CTRL_RIGHT; break;
case 'd': return CTRL_LEFT ; break;
case 'h': return CTRL_HOME ; break;
case '`': return KEY_INS ; break; /* CTRL_INS */
case 'p': return KEY_DEL ; break; /* CTRL_DEL */
case 'y': return CTRL_END ; break;
case 'v': return CTRL_PGUP ; break;
case 'u': return CTRL_PGDN ; break;
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
value = key - '0'; /* build a 1- or 2-digit-number */
for (ii = 0 ; ii < 2 ; ii++) /* read next bytes */
{
key = get_1_byte ();
if (key == '~') break; /* last char in sequence */
value = 10 * value + (key - '0');
}
switch (value)
{
case 1: return CTRL_F1 ; break;
case 2: return CTRL_F2 ; break;
case 3: return CTRL_F3 ; break;
case 4: return CTRL_F4 ; break;
case 5: return CTRL_F5 ; break;
case 6: return CTRL_F6 ; break;
case 7: return CTRL_F7 ; break;
case 8: return CTRL_F8 ; break;
case 9: return CTRL_F9 ; break;
case 10: return CTRL_F10 ; break;
case 17: return ALT_F1 ; break;
case 18: return ALT_F2 ; break;
case 19: return ALT_F3 ; break;
case 20: return ALT_F4 ; break;
case 21: return ALT_F5 ; break;
case 22: return ALT_F6 ; break;
case 23: return ALT_F7 ; break;
case 24: return ALT_F8 ; break;
case 25: return ALT_F9 ; break;
case 26: return ALT_F10 ; break;
default: return INVALID ; break;
}
default:
return INVALID;
break;
}
break;
case 'O': /* <PF> keys */
key = get_1_byte ();
switch (key)
{
case 'P': return KEY_F1; break;
case 'Q': return KEY_F2; break;
case 'R': return KEY_F3; break;
case 'S': return KEY_F4; break;
case 'T': return KEY_F5; break;
case 'U': return KEY_F6; break;
case 'V': return KEY_F7; break;
case 'W': return KEY_F8; break;
case 'X': return KEY_F9; break;
case 'Y': return KEY_F10; break;
case 'Z': return KEY_F11; break;
case 'A': return KEY_F12; break;
case 'p': return SHIFT_F1; break;
case 'q': return SHIFT_F2; break;
case 'r': return SHIFT_F3; break;
case 's': return SHIFT_F4; break;
case 't': return SHIFT_F5; break;
case 'u': return SHIFT_F6; break;
case 'v': return SHIFT_F7; break;
case 'w': return SHIFT_F8; break;
case 'x': return SHIFT_F9; break;
case 'y': return SHIFT_F10; break;
default: return INVALID; break;
}
break;
case 'N': /* ALT keys */
key = get_1_byte ();
switch (key)
{
case 'a': return ALT_A; break;
case 'b': return ALT_B; break;
case 'c': return ALT_C; break;
case 'd': return ALT_D; break;
case 'e': return ALT_E; break;
case 'f': return ALT_F; break;
case 'g': return ALT_G; break;
case 'h': return ALT_H; break;
case 'i': return ALT_I; break;
case 'j': return ALT_J; break;
case 'k': return ALT_K; break;
case 'l': return ALT_L; break;
case 'm': return ALT_M; break;
case 'n': return ALT_N; break;
case 'o': return ALT_O; break;
case 'p': return ALT_P; break;
case 'q': return ALT_Q; break;
case 'r': return ALT_R; break;
case 's': return ALT_S; break;
case 't': return ALT_T; break;
case 'u': return ALT_U; break;
case 'v': return ALT_V; break;
case 'w': return ALT_W; break;
case 'x': return ALT_X; break;
case 'y': return ALT_Y; break;
case 'z': return ALT_Z; break;
default: return INVALID; break;
}
break;
default: /* <esc> followed by any other char */
esc_buff = key; /* may also be a new <esc> sequence */
return 0x1b;
break;
} /* switch (key) */
} /* <esc> sequence */
} /* check for <esc> sequence */
else
{
return key; /* send directly */
}
} /* loc_get_1_int */
#else /* QNX pterm ansi */
/* -FF- */
/*****************************************/
/* */
/* VT 100 / VT 220 - Terminal */
/* */
/*****************************************/
/************************/
/* get 1 key stroke */
/************************/
static int loc_get_1_int (void)
{
/* translation from <esc> sequences in one single (negativ) int */
/* special keys (function, cursor keys, ...) are transferred as */
/* <esc> sequence with variable no of chars. */
/* This functions returns special keys in one (modified) int. */
#define ALLOW_SLOW_CONNECTIONS 1 /* to surround problems with <ESC>s */
/* @@ implement time survey !! */
int ii, last_key, result, value;
static int key;
static int esc_buff; /* if a single <esc> is followed by a sequence, */
/* this event must be handled in special manner. */
static int old_mode_flag, old_text_area, old_toggle;
static time_t act_time, esc_time, delta_time;
#define MAX_ESC_TIME 5 /* LSB = 1 Sec. */
char err_text [20];
#define ANSI_TERMINAL 1 /* <== 1 for SCO-Unix */
#define HP7_XTERM 1 /* <== 1 for hp 700 */
/* NEU !! */
last_key = key;
/* NEU ! output buffer leerraeumen */
fflush (stdout);
/* is there still a char in the queue ? */
if (esc_buff)
{
key = esc_buff; /* take it */
esc_buff = 0; /* clear buffer */
}
else
{
key = get_1_byte (); /* get new byte from stdin */
}
/* EOF bei input redirection ? */
key = check_end_of_file (key);
/* input from file ? */
if (input_redirected)
return key;
/* <esc> handling */
#if (!ALLOW_SLOW_CONNECTIONS)
if (key == 0x1b) /* is it <esc> ? */
#else
if ((key == 0x1b) ||
((key == '[') && (last_key == 0x1b)))
#endif
{
/* are there characters following immediately ? */
if (key == 0x1b)
{
esc_time = time (NULL);
result = get_1_byte_with_timeout (esc_waittime);
}
else
{
/* sequence: <esc> '[' (until now) */
/* check time since <esc> */
act_time = time (NULL);
delta_time = act_time - esc_time;
if (delta_time > MAX_ESC_TIME)
{
result = -1; /* absolute timeout */
}
else
{
result = key; /* '[' */
if (old_mode_flag || old_text_area || old_toggle)
{ /* gimme just a little more time */
esc_waittime = max (esc_waittime, 50); /* min. 50 msec */
esc_waittime = (esc_waittime * 16) / 10; /* factor 1.6 */
esc_waittime = min (esc_waittime, 1000); /* max. 1000 msec */
sprintf (err_text, " (AE=%d msec)", esc_waittime);
err_message_1 (ESCAPE_SEQUENCE_ERROR, err_text);
}
}
}
/* != 0, if in: */
old_mode_flag = mode_flag; /* insert / exchange mode */
old_text_area = text_area; /* status line 2 / history window */
old_toggle = save_d.toggle; /* 'B'uffer / 'D'elete */
if (result < 0) /* timeout ? */
{ /* yes : single <esc> */
return key; /* send it ! */
}
else /* no : <esc> sequence */
{
key = result; /* get following byte */
switch (key)
{
case '[':
key = get_1_byte ();
switch (key)
{
case 'A': return KEY_UP ; break; /* cursor keys */
case 'B': return KEY_DOWN ; break;
case 'C': return KEY_RIGHT; break;
case 'D': return KEY_LEFT ; break;
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
value = key - '0'; /* build a 1- or 2-digit-number */
for (ii = 0 ; ii < 2 ; ii++) /* read next bytes */
{
key = get_1_byte ();
if (key == '~') break; /* last char in sequence */
value = 10 * value + (key - '0');
}
switch (value)
{
case 1: return KEY_HOME ; break;
case 2: return KEY_INS ; break;
case 3: return KEY_DEL ; break;
case 4: return KEY_END ; break;
case 5: return KEY_PGUP ; break;
case 6: return KEY_PGDN ; break;
case 7: return KEY_END ; break; /* hp / SCO */
case 8: return KEY_HOME ; break; /* hp / SCO */
#if (HP7_XTERM)
case 11: return KEY_F1 ; break; /* HP7 XTERM F1 */
case 12: return KEY_F2 ; break; /* HP7 XTERM F2 */
case 13: return KEY_F3 ; break; /* HP7 XTERM F3 */
case 14: return KEY_F4 ; break; /* HP7 XTERM F4 */
case 15: return KEY_F5 ; break; /* HP7 XTERM F5 */
#endif
case 17: return KEY_F6 ; break;
case 18: return KEY_F7 ; break;
case 19: return KEY_F8 ; break;
case 20: return KEY_F9 ; break;
case 21: return KEY_F10 ; break;
case 23: return KEY_F11 ; break;
case 24: return KEY_F12 ; break;
case 25: return KEY_F13 ; break;
case 26: return KEY_F14 ; break;
case 28: return KEY_HELP ; break;
case 29: return KEY_DO ; break;
case 31: return KEY_F17 ; break;
case 32: return KEY_F18 ; break;
case 33: return KEY_F19 ; break;
case 34: return KEY_F20 ; break;
#if (HP7_XTERM)
case 50: return CTRL_PGUP ; break; /* HP7 */
case 51: return CTRL_HOME ; break; /* w/ customized */
case 52: return CTRL_PGDN ; break; /* xterm */
case 53: return CTRL_END ; break; /* */
case 54: return CTRL_RIGHT ; break; /* */
case 55: return CTRL_LEFT ; break; /* */
case 60: return ALT_F1 ; break; /* HP7 */
case 61: return ALT_F2 ; break; /* w/ customized */
case 62: return ALT_F3 ; break; /* xterm */
case 63: return ALT_F4 ; break; /* */
case 64: return ALT_F5 ; break; /* */
case 65: return ALT_F6 ; break; /* */
case 66: return ALT_F7 ; break; /* HP7 */
case 67: return ALT_F8 ; break; /* w/ customized */
case 68: return ALT_F9 ; break; /* xterm */
case 69: return ALT_F10 ; break; /* */
#endif
default: return INVALID ; break;
}
#if (ANSI_TERMINAL)
case 'H': return KEY_HOME ; break;
case 'L': return KEY_INS ; break;
case 'F': return KEY_END ; break;
case 'I': return KEY_PGUP ; break;
case 'G': return KEY_PGDN ; break;
case 'M': return KEY_F1 ; break;
case 'N': return KEY_F2 ; break;
case 'O': return KEY_F3 ; break;
case 'P': return KEY_F4 ; break;
case 'Q': return KEY_F5 ; break;
case 'R': return KEY_F6 ; break;
case 'S': return KEY_F7 ; break;
case 'T': return KEY_F8 ; break;
case 'U': return KEY_F9 ; break;
case 'V': return KEY_F10 ; break;
case 'W': return KEY_F11 ; break;
case 'X': return KEY_F12 ; break;
case 'Y': return SHIFT_F1 ; break;
case 'Z': return SHIFT_F2 ; break;
case 'a': return SHIFT_F3 ; break;
case 'b': return SHIFT_F4 ; break;
case 'c': return SHIFT_F5 ; break;
case 'd': return SHIFT_F6 ; break;
case 'e': return SHIFT_F7 ; break;
case 'f': return SHIFT_F8 ; break;
case 'g': return SHIFT_F9 ; break;
case 'h': return SHIFT_F10; break;
case 'i': return INVALID ; break;
case 'j': return INVALID ; break;
case 'k': return CTRL_F1 ; break;
case 'l': return CTRL_F2 ; break;
case 'm': return CTRL_F3 ; break;
case 'n': return CTRL_F4 ; break;
case 'o': return CTRL_F5 ; break;
case 'p': return CTRL_F6 ; break;
case 'q': return CTRL_F7 ; break;
case 'r': return CTRL_F8 ; break;
case 's': return CTRL_F9 ; break;
case 't': return CTRL_F10 ; break;
case 'u': return INVALID ; break;
case 'v': return INVALID ; break;
#endif
default:
return INVALID;
break;
}
break;
case 'O': /* <PF> keys */
key = get_1_byte ();
switch (key)
{
case 'P': return KEY_PF1; break;
case 'Q': return KEY_PF2; break;
case 'R': return KEY_PF3; break;
case 'S': return KEY_PF4; break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -