Proper support of XTerm function/small keypad keys

This commit is contained in:
akocis
2020-03-06 09:57:34 +00:00
committed by Adrian Kocis
parent 227323799e
commit 8b56df1703
3 changed files with 80 additions and 9 deletions
+2 -3
View File
@@ -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);
+76 -3
View File
@@ -7137,6 +7137,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
@@ -7210,8 +7222,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;
@@ -7224,6 +7235,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];
@@ -7260,7 +7302,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;
@@ -7275,6 +7317,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];
+2 -3
View File
@@ -6801,8 +6801,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;
@@ -6817,7 +6816,7 @@ if( !get_param("PUTTY") && conf_get_int(conf, CONF_disablealtgr) ) {
if (shift_state & 2)
break;
p += format_small_keypad_key((char *)p, term, sk_key);
p += format_small_keypad_key((char *)p, term, sk_key, shift_state, left_alt);
return p - output;
char xkey;