diff --git a/0.73_My_PuTTY/putty.h b/0.73_My_PuTTY/putty.h index 1b258bc..94adc58 100644 --- a/0.73_My_PuTTY/putty.h +++ b/0.73_My_PuTTY/putty.h @@ -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); diff --git a/0.73_My_PuTTY/terminal.c b/0.73_My_PuTTY/terminal.c index 1c37407..21ccc32 100644 --- a/0.73_My_PuTTY/terminal.c +++ b/0.73_My_PuTTY/terminal.c @@ -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]; diff --git a/0.73_My_PuTTY/windows/window.c b/0.73_My_PuTTY/windows/window.c index 6d75537..7c7868f 100644 --- a/0.73_My_PuTTY/windows/window.c +++ b/0.73_My_PuTTY/windows/window.c @@ -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;