mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-07-02 03:52:49 -05:00
Centralise generation of the control sequences for arrow keys into a
function in terminal.c, and replace the cloned-and-hacked handling code in all our front ends with calls to that. This was intended for code cleanliness, but a side effect is to make the GTK arrow-key handling support disabling of application cursor key mode in the Features panel. Previously that checkbox was accidentally ignored, and nobody seems to have noticed before! [originally from svn r8896]
This commit is contained in:
51
terminal.c
51
terminal.c
@ -5844,6 +5844,42 @@ void term_mouse(Terminal *term, Mouse_Button braw, Mouse_Button bcooked,
|
||||
term_update(term);
|
||||
}
|
||||
|
||||
int format_arrow_key(char *buf, Terminal *term, int xkey, int ctrl)
|
||||
{
|
||||
char *p = buf;
|
||||
|
||||
if (term->vt52_mode)
|
||||
p += sprintf((char *) p, "\x1B%c", xkey);
|
||||
else {
|
||||
int app_flg = (term->app_cursor_keys && !term->cfg.no_applic_c);
|
||||
#if 0
|
||||
/*
|
||||
* RDB: VT100 & VT102 manuals both state the app cursor
|
||||
* keys only work if the app keypad is on.
|
||||
*
|
||||
* SGT: That may well be true, but xterm disagrees and so
|
||||
* does at least one application, so I've #if'ed this out
|
||||
* and the behaviour is back to PuTTY's original: app
|
||||
* cursor and app keypad are independently switchable
|
||||
* modes. If anyone complains about _this_ I'll have to
|
||||
* put in a configurable option.
|
||||
*/
|
||||
if (!term->app_keypad_keys)
|
||||
app_flg = 0;
|
||||
#endif
|
||||
/* Useful mapping of Ctrl-arrows */
|
||||
if (ctrl)
|
||||
app_flg = !app_flg;
|
||||
|
||||
if (app_flg)
|
||||
p += sprintf((char *) p, "\x1BO%c", xkey);
|
||||
else
|
||||
p += sprintf((char *) p, "\x1B[%c", xkey);
|
||||
}
|
||||
|
||||
return p - buf;
|
||||
}
|
||||
|
||||
void term_key(Terminal *term, Key_Sym keysym, wchar_t *text, size_t tlen,
|
||||
unsigned int modifiers, unsigned int flags)
|
||||
{
|
||||
@ -6220,20 +6256,7 @@ void term_key(Terminal *term, Key_Sym keysym, wchar_t *text, size_t tlen,
|
||||
case PK_REST: xkey = 'G'; break; /* centre key on number pad */
|
||||
default: xkey = 0; break; /* else gcc warns `enum value not used' */
|
||||
}
|
||||
if (term->vt52_mode)
|
||||
p += sprintf((char *) p, "\x1B%c", xkey);
|
||||
else {
|
||||
int app_flg = (term->app_cursor_keys && !term->cfg.no_applic_c);
|
||||
|
||||
/* Useful mapping of Ctrl-arrows */
|
||||
if (modifiers == PKM_CONTROL)
|
||||
app_flg = !app_flg;
|
||||
|
||||
if (app_flg)
|
||||
p += sprintf((char *) p, "\x1BO%c", xkey);
|
||||
else
|
||||
p += sprintf((char *) p, "\x1B[%c", xkey);
|
||||
}
|
||||
p += format_arrow_key(p, term, xkey, modifiers == PKM_CONTROL);
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user