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!
git-svn-id: http://svn.tartarus.org/sgt/putty@8896
cda61777-01e9-0310-a592-
d414129be87e
case NSLeftArrowFunctionKey: xkey = 'D'; break;
}
if (xkey) {
- /*
- * The arrow keys normally do ESC [ A and so on. In
- * app cursor keys mode they do ESC O A instead.
- * Ctrl toggles the two modes.
- */
- if (term->vt52_mode) {
- output[end++] = '\033';
- output[end++] = xkey;
- } else if (!term->app_cursor_keys ^ !(m & NSControlKeyMask)) {
- output[end++] = '\033';
- output[end++] = 'O';
- output[end++] = xkey;
- } else {
- output[end++] = '\033';
- output[end++] = '[';
- output[end++] = xkey;
- }
+ end += format_arrow_key(output+end, term, xkey,
+ m & NSControlKeyMask);
goto done;
}
}
int term_get_userpass_input(Terminal *term, prompts_t *p,
unsigned char *in, int inlen);
+int format_arrow_key(char *buf, Terminal *term, int xkey, int ctrl);
+
/*
* Exports from logging.c.
*/
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)
{
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;
}
case GDK_Begin: case GDK_KP_Begin: xkey = 'G'; break;
}
if (xkey) {
- /*
- * The arrow keys normally do ESC [ A and so on. In
- * app cursor keys mode they do ESC O A instead.
- * Ctrl toggles the two modes.
- */
- if (inst->term->vt52_mode) {
- end = 1 + sprintf(output+1, "\033%c", xkey);
- } else if (!inst->term->app_cursor_keys ^
- !(event->state & GDK_CONTROL_MASK)) {
- end = 1 + sprintf(output+1, "\033O%c", xkey);
- } else {
- end = 1 + sprintf(output+1, "\033[%c", xkey);
- }
+ end = 1 + format_arrow_key(output+1, inst->term, xkey,
+ event->state & GDK_CONTROL_MASK);
use_ucsoutput = FALSE;
goto done;
}
break;
}
if (xkey) {
- if (term->vt52_mode)
- p += sprintf((char *) p, "\x1B%c", xkey);
- else {
- int app_flg = (term->app_cursor_keys && !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 (shift_state == 2)
- 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, shift_state);
return p - output;
}
}