in src/terminal/terminal-handlers.c [410:500]
int guac_terminal_escape(guac_terminal* term, unsigned char c) {
switch (c) {
case '(':
term->char_handler = guac_terminal_g0_charset;
break;
case ')':
term->char_handler = guac_terminal_g1_charset;
break;
case ']':
term->char_handler = guac_terminal_osc;
break;
case '[':
term->char_handler = guac_terminal_csi;
break;
case '#':
term->char_handler = guac_terminal_ctrl_func;
break;
/* Save Cursor (DECSC) */
case '7':
term->saved_cursor_row = term->cursor_row;
term->saved_cursor_col = term->cursor_col;
term->char_handler = guac_terminal_echo;
break;
/* Restore Cursor (DECRC) */
case '8':
guac_terminal_move_cursor(term,
term->saved_cursor_row,
term->saved_cursor_col);
term->char_handler = guac_terminal_echo;
break;
/* Index (IND) */
case 'D':
guac_terminal_linefeed(term, false);
term->char_handler = guac_terminal_echo;
break;
/* Next Line (NEL) */
case 'E':
guac_terminal_move_cursor(term, term->cursor_row, 0);
guac_terminal_linefeed(term, false);
term->char_handler = guac_terminal_echo;
break;
/* Set Tab (HTS) */
case 'H':
guac_terminal_set_tab(term, term->cursor_col);
term->char_handler = guac_terminal_echo;
break;
/* Reverse Linefeed */
case 'M':
guac_terminal_reverse_linefeed(term);
term->char_handler = guac_terminal_echo;
break;
/* DEC Identify */
case 'Z':
guac_terminal_send_string(term, GUAC_TERMINAL_VT102_ID);
term->char_handler = guac_terminal_echo;
break;
/* Reset */
case 'c':
guac_terminal_reset(term);
break;
case '_':
term->char_handler = guac_terminal_apc;
break;
default:
guac_client_log(term->client, GUAC_LOG_DEBUG,
"Unhandled ESC sequence: %c", c);
term->char_handler = guac_terminal_echo;
}
return 0;
}