Implement mode set/reset. Implement DECCKM mode.

This commit is contained in:
Michael Jumper 2013-05-22 11:08:38 -07:00
parent 334d6cb08b
commit b1622413a9
4 changed files with 65 additions and 4 deletions

View File

@ -204,6 +204,12 @@ struct guac_terminal {
*/
int selection_end_column;
/**
* Whether the cursor (arrow) keys should send cursor sequences
* or application sequences (DECCKM).
*/
bool application_cursor_keys;
};
/**

View File

@ -298,10 +298,30 @@ int ssh_guac_client_key_handler(guac_client* client, int keysym, int pressed) {
else if (keysym == 0xFF1B) { data = "\x1B"; length = 1; }
/* Arrow keys */
else if (keysym == 0xFF52) { data = "\x1B\x5B""A"; length = 3; }
else if (keysym == 0xFF54) { data = "\x1B\x5B""B"; length = 3; }
else if (keysym == 0xFF53) { data = "\x1B\x5B""C"; length = 3; }
else if (keysym == 0xFF51) { data = "\x1B\x5B""D"; length = 3; }
else if (keysym == 0xFF52) {
if (term->application_cursor_keys) data = "\x1BOA";
else data = "\x1B[A";
length = 3;
}
else if (keysym == 0xFF54) {
if (term->application_cursor_keys) data = "\x1BOB";
else data = "\x1B[B";
length = 3;
}
else if (keysym == 0xFF53) {
if (term->application_cursor_keys) data = "\x1BOC";
else data = "\x1B[C";
length = 3;
}
else if (keysym == 0xFF51) {
if (term->application_cursor_keys) data = "\x1BOD";
else data = "\x1B[D";
length = 3;
}
/* Ignore other keys */
else return 0;

View File

@ -95,6 +95,7 @@ guac_terminal* guac_terminal_create(guac_client* client,
term->scroll_end = term->term_height - 1;
term->text_selected = false;
term->application_cursor_keys = false;
/* Open STDOUT pipe */
if (pipe(term->stdout_pipe_fd)) {

View File

@ -284,6 +284,9 @@ int guac_terminal_csi(guac_terminal* term, char c) {
static int argc = 0;
static int argv[16] = {0};
/* Whether the sequence started with a question mark */
static bool initial_question_mark = false;
/* Argument building counter and buffer */
static int argv_length = 0;
static char argv_buffer[256];
@ -553,6 +556,34 @@ int guac_terminal_csi(guac_terminal* term, char c) {
term->cursor_row = row;
break;
/* h: Set Mode */
case 'h':
/* DECCKM */
if (argv[0] == 1)
term->application_cursor_keys = true;
else
guac_client_log_info(term->client,
"Unhandled mode set: mode=%i, initial_question_mark=%i",
argv[0], initial_question_mark);
break;
/* l: Reset Mode */
case 'l':
/* DECCKM */
if (argv[0] == 1)
term->application_cursor_keys = false;
else
guac_client_log_info(term->client,
"Unhandled mode reset: mode=%i, initial_question_mark=%i",
argv[0], initial_question_mark);
break;
/* m: Set graphics rendition */
case 'm':
@ -659,6 +690,9 @@ int guac_terminal_csi(guac_terminal* term, char c) {
for (i=0; i<argc; i++)
argv[i] = 0;
/* Reset mark flag */
initial_question_mark = false;
/* Reset argument counters */
argc = 0;
argv_length = 0;