Skip to content

Commit

Permalink
maple/visio.c: vkey(): Support modified ([Ctrl/Meta/Shift]-ed) spac…
Browse files Browse the repository at this point in the history
…ial keys.

* maple/visio.c: `vkey()`: Support xterm-style modified ([Ctrl/Meta/Shift]-ed) spacial keys.
* maple/visio.c: `vkey()`: Support rxvt-style modified ([Ctrl/Shift]-ed) spacial keys.
* maple/visio.c: `vkey()`: Make `Esc-key` Meta-ed for special keys.
  • Loading branch information
IepIweidieng committed Jul 1, 2019
1 parent af186d2 commit 5398b50
Showing 1 changed file with 93 additions and 24 deletions.
117 changes: 93 additions & 24 deletions maple/visio.c
Original file line number Diff line number Diff line change
Expand Up @@ -2335,10 +2335,45 @@ vans(

#undef TRAP_ESC

#define META_CODE 0x8
#define CTRL_CODE 0x4
#define ALT_CODE 0x2
#define SHIFT_CODE 0x1

static inline int
mod_key(int mod, int key) /* xterm-style modifier */
{
if (mod & CTRL_CODE)
key = Ctrl(key);
if (mod & META_CODE || mod & ALT_CODE)
key = Meta(key);
if (mod & SHIFT_CODE)
key = Shift(key);
return key;
}

static inline int
char_mod(int ch) /* rxvt-style modifier character */
{
switch (ch)
{
case '~':
return 0;
case '$':
return SHIFT_CODE;
case '^':
return CTRL_CODE;
case '@':
return CTRL_CODE | SHIFT_CODE;
default:
return -1;
}
}

int
vkey(void)
{
int mode;
int mode, mod = 0;
int ch, last, last2;

mode = last = last2 = 0;
Expand All @@ -2355,7 +2390,13 @@ vkey(void)
}
#else
if (ch == KEY_ESC)
{
if (mode == 1) /* "<Esc> <Esc>" */ /* <Esc> + possible special keys */
mod = META_CODE; /* Make the key Meta-ed */
else
mod = 0; /* Reset modifiers */
mode = 1;
}
else if (mode == 0) /* Normal Key */
{
return ch;
Expand All @@ -2373,54 +2414,81 @@ vkey(void)
else if (mode == 2) /* "<Esc> <[O> `ch`" */
{
if (ch >= 'A' && ch <= 'D') /* "<Esc> <[O> <A-D>" */ /* Cursor key */
return KEY_UP + (ch - 'A');
return mod_key(mod, KEY_UP + (ch - 'A'));
else switch (ch) /* "<Esc> <[O> <HF>" */ /* Home Ens (xterm) */
{
case 'H':
return KEY_HOME;
return mod_key(mod, KEY_HOME);
case 'F':
return KEY_END;
return mod_key(mod, KEY_END);
}
/* else */ if (last == 'O') /* "<Esc> O `ch`" */
/* else */ if (last == 'O' || mod) /* "<Esc> O `ch`" | "<Esc> [ 1 ; 1 <0-6> `ch`" | "<Esc> [ 1 ; <2-9> `ch`" */
{
if (ch >= 'P' && ch <= 'S') /* "<Esc> O <PQRS>" */ /* F1 - F4 */
return KEY_F1 + (ch - 'P');
return mod_key(mod, KEY_F1 + (ch - 'P'));
else if (ch == 'w') /* "<Esc> O w" */ /* END (PuTTY-rxvt) */
return KEY_END;
else
return ch;
return mod_key(mod, KEY_END);
else if (ch >= 'a' && ch <= 'd') /* "<Esc> O <a-d>" */ /* Ctrl-ed cursor key (rxvt) */
return mod_key(mod | SHIFT_CODE, KEY_UP + (ch - 'a'));
}
if (last == 'O')
return ch;
else if (ch >= 'a' && ch <= 'd') /* "<Esc> [ <a-d>" */ /* Shift-ed cursor key (rxvt) */
return mod_key(mod | SHIFT_CODE, KEY_UP + (ch - 'a'));
else if (ch >= '1' && ch <= '8') /* "<Esc> [ <1-8>" */
mode = 3;
else switch (ch) /* "<Esc> [ `ch`" */
{
/* "<Esc> [ <GIL>" */ /* PgDn PgUp Ins (SCO) */
case 'G':
return KEY_PGDN;
return mod_key(mod, KEY_PGDN);
case 'I':
return KEY_PGUP;
return mod_key(mod, KEY_PGUP);
case 'L':
return KEY_INS;
return mod_key(mod, KEY_INS);

case 'Z': /* "<Esc> [ Z" */ /* Shift-Tab */
return KEY_STAB;
return mod_key(mod, KEY_STAB);

default:
return ch;
}
}
else if (ch == ';') /* "<Esc> [ <1-6> ;" | "<Esc> [ <12> `last` `ch`" */
{ /* Modifier argument (xterm-style) */ /* "; <2-9>" | "; 1 <0-6>" */
int mod_ch = igetch();
if (mod_ch < '1' || mod_ch > '9')
return ch;
if (mod_ch == '1') /* "; 1 <0-6>" */
{
mod_ch = igetch();
if (mod_ch < '0' || mod_ch > '6')
return ch;
mod_ch += 10;
}
mod_ch -= '1'; /* Change to bit number */
mod |= mod_ch;
if (mode == 3 && last == '1') /* "<Esc> [ 1 ; <2-9>" | "<Esc> [ 1 ; 1 <0-6>" */
{
/* Recover state to "<Esc> [ `ch`" */
mode = 2;
last = last2;
}
continue; /* Get next `ch`; keep current state */
}
else if (mode == 3) /* "<Esc> [ <1-8> `ch`" */
{ /* Home Ins Del End PgUp PgDn */
if (ch == '~') /* "<Esc> [ <1-8> ~" */
if (char_mod(ch) != -1) /* "<Esc> [ <1-8> <~$^@>" */
{
if (last <= '6') /* "<Esc> [ <1-6> ~" */
return KEY_HOME + (last - '1');
else switch (last) /* "<Esc> [ <78> ~" */ /* Home End (rxvt) */
mod |= char_mod(ch);
if (last <= '6') /* "<Esc> [ <1-6> <~$^@>" */
return mod_key(mod, KEY_HOME + (last - '1'));
else switch (last) /* "<Esc> [ <78> <~$^@>" */ /* Home End (rxvt) */
{
case '7':
return KEY_HOME;
return mod_key(mod, KEY_HOME);
case '8':
return KEY_END;
return mod_key(mod, KEY_END);
default:
return ch;
}
Expand All @@ -2432,12 +2500,13 @@ vkey(void)
}
else if (mode == 4) /* "<Esc> [ <1-6> <0-9> `ch`" */
{ /* F1 - F12 */
if (ch == '~') /* "<Esc> [ <1-6> <0-9> ~" */
if (char_mod(ch) != -1) /* "<Esc> [ <1-6> <0-9> <~$^@>" */
{
if (last2 == '1') /* "<Esc> [ 1 `last` ~" */ /* F1 - F8 */
return KEY_F1 + (last - '1') - (last > '6');
else if (last2 == '2') /* "<Esc> [ 2 `last` ~" */ /* F9 - F12 */
return KEY_F9 + (last - '0') - (last > '2');
mod |= char_mod(ch);
if (last2 == '1') /* "<Esc> [ 1 `last` <~$^@>" */ /* F1 - F8 */
return mod_key(mod, KEY_F1 + (last - '1') - (last > '6'));
else if (last2 == '2') /* "<Esc> [ 2 `last` <~$^@>" */ /* F9 - F12 */
return mod_key(mod, KEY_F9 + (last - '0') - (last > '2'));
else
return ch;
}
Expand Down

0 comments on commit 5398b50

Please sign in to comment.