Merge pull request #125 from adizero/ctrl-shift-alt-support-for-function-and-small-keypad-keys
Ctrl shift alt support for function and small keypad keys
This commit is contained in:
@@ -1810,9 +1810,8 @@ int format_arrow_key(char *buf, Terminal *term, int xkey, int modifier, bool alt
|
||||
int format_arrow_key(char *buf, Terminal *term, int xkey, bool ctrl);
|
||||
#endif
|
||||
|
||||
int format_function_key(char *buf, Terminal *term, int key_number,
|
||||
bool shift, bool ctrl);
|
||||
int format_small_keypad_key(char *buf, Terminal *term, SmallKeypadKey key);
|
||||
int format_function_key(char *buf, Terminal *term, int key_number, int modifier, bool alt);
|
||||
int format_small_keypad_key(char *buf, Terminal *term, SmallKeypadKey key, int modifier, bool alt);
|
||||
int format_numeric_keypad_key(char *buf, Terminal *term, char key,
|
||||
bool shift, bool ctrl);
|
||||
|
||||
|
||||
@@ -7150,6 +7150,18 @@ void term_mouse(Terminal *term, Mouse_Button braw, Mouse_Button bcooked,
|
||||
term_update(term);
|
||||
}
|
||||
|
||||
int get_xterm_modifier(bool shift, bool ctrl, bool alt)
|
||||
{
|
||||
int xterm_modifier = 1; // no modifier key was pressed
|
||||
if (shift)
|
||||
xterm_modifier += 1;
|
||||
if (alt)
|
||||
xterm_modifier += 2;
|
||||
if (ctrl)
|
||||
xterm_modifier += 4;
|
||||
return xterm_modifier;
|
||||
}
|
||||
|
||||
#ifdef MOD_KEYMAPPING
|
||||
int format_arrow_key(char *buf, Terminal *term, int xkey, int modifier, bool alt)
|
||||
#else
|
||||
@@ -7223,8 +7235,7 @@ int format_arrow_key(char *buf, Terminal *term, int xkey, bool ctrl)
|
||||
return p - buf;
|
||||
}
|
||||
|
||||
int format_function_key(char *buf, Terminal *term, int key_number,
|
||||
bool shift, bool ctrl)
|
||||
int format_function_key(char *buf, Terminal *term, int key_number, int modifier, bool alt)
|
||||
{
|
||||
char *p = buf;
|
||||
|
||||
@@ -7237,6 +7248,37 @@ int format_function_key(char *buf, Terminal *term, int key_number,
|
||||
assert(key_number > 0);
|
||||
assert(key_number < lenof(key_number_to_tilde_code));
|
||||
|
||||
bool shift = modifier & 1;
|
||||
bool ctrl = modifier & 2;
|
||||
if (term->funky_type == FUNKY_XTERM && !term->vt52_mode)
|
||||
{
|
||||
// XTerm mode
|
||||
char prefix[20];
|
||||
char suffix[20];
|
||||
int xterm_modifier = get_xterm_modifier(shift, ctrl, alt);
|
||||
if (xterm_modifier > 1)
|
||||
{
|
||||
sprintf(prefix, "[1;%d", xterm_modifier);
|
||||
sprintf(suffix, ";%d", xterm_modifier);
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(prefix, "O");
|
||||
sprintf(suffix, "");
|
||||
}
|
||||
|
||||
int code = key_number_to_tilde_code[key_number];
|
||||
if (code >= 11 && code <= 14)
|
||||
{
|
||||
p += sprintf(p, "\x1B%s%c", prefix, code + 'P' - 11);
|
||||
}
|
||||
else
|
||||
{
|
||||
p += sprintf(p, "\x1B[%d%s~", code, suffix);
|
||||
}
|
||||
return p - buf;
|
||||
}
|
||||
|
||||
int index = (shift && key_number <= 10) ? key_number + 10 : key_number;
|
||||
int code = key_number_to_tilde_code[index];
|
||||
|
||||
@@ -7273,7 +7315,7 @@ int format_function_key(char *buf, Terminal *term, int key_number,
|
||||
return p - buf;
|
||||
}
|
||||
|
||||
int format_small_keypad_key(char *buf, Terminal *term, SmallKeypadKey key)
|
||||
int format_small_keypad_key(char *buf, Terminal *term, SmallKeypadKey key, int modifier, bool alt)
|
||||
{
|
||||
char *p = buf;
|
||||
|
||||
@@ -7288,6 +7330,37 @@ int format_small_keypad_key(char *buf, Terminal *term, SmallKeypadKey key)
|
||||
default: unreachable("bad small keypad key enum value");
|
||||
}
|
||||
|
||||
bool shift = modifier & 1;
|
||||
bool ctrl = modifier & 2;
|
||||
if (term->funky_type == FUNKY_XTERM && !term->vt52_mode)
|
||||
{
|
||||
// XTerm mode
|
||||
char prefix[20];
|
||||
char suffix[20];
|
||||
int xterm_modifier = get_xterm_modifier(shift, ctrl, alt);
|
||||
if (xterm_modifier > 1)
|
||||
{
|
||||
sprintf(prefix, "[1;%d", xterm_modifier);
|
||||
sprintf(suffix, ";%d", xterm_modifier);
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(prefix, "[");
|
||||
sprintf(suffix, "");
|
||||
}
|
||||
|
||||
if (code == 1 || code == 4)
|
||||
{
|
||||
p += sprintf(p, "\x1B%s%c", prefix, code == 1 ? 'H' : 'F');
|
||||
}
|
||||
else
|
||||
{
|
||||
p += sprintf(p, "\x1B[%d%s~", code, suffix);
|
||||
}
|
||||
|
||||
return p - buf;
|
||||
}
|
||||
|
||||
/* Reorder edit keys to physical order */
|
||||
if (term->funky_type == FUNKY_VT400 && code <= 6)
|
||||
code = "\0\2\1\4\5\3\6"[code];
|
||||
|
||||
@@ -6591,7 +6591,7 @@ if( !get_param("PUTTY") && conf_get_int(conf, CONF_disablealtgr) ) {
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!(term->funky_type == FUNKY_XTERM && !term->vt52_mode) || fkey == 0) {
|
||||
*p++ = '\033';
|
||||
}
|
||||
@@ -6857,8 +6857,7 @@ if( !get_param("PUTTY") && conf_get_int(conf, CONF_disablealtgr) ) {
|
||||
case VK_F19: fkey_number = 19; goto numbered_function_key;
|
||||
case VK_F20: fkey_number = 20; goto numbered_function_key;
|
||||
numbered_function_key:
|
||||
p += format_function_key((char *)p, term, fkey_number,
|
||||
shift_state & 1, shift_state & 2);
|
||||
p += format_function_key((char *)p, term, fkey_number, shift_state, left_alt);
|
||||
return p - output;
|
||||
|
||||
SmallKeypadKey sk_key;
|
||||
|
||||
Reference in New Issue
Block a user