From 0893d377295806bbe40ae31601e0c662c6abb187 Mon Sep 17 00:00:00 2001 From: Noor Date: Thu, 4 Nov 2021 10:41:04 +0500 Subject: [PATCH 1/6] GUACAMOLE-943: Fixed incorrect sequence for SSH and telnet when shift is held. --- src/terminal/terminal.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/terminal/terminal.c b/src/terminal/terminal.c index 1430b056..b521129a 100644 --- a/src/terminal/terminal.c +++ b/src/terminal/terminal.c @@ -1590,6 +1590,23 @@ static int __guac_terminal_send_key(guac_terminal* term, int keysym, int pressed if (keysym == 0xFF54 || keysym == 0xFF99) return guac_terminal_send_string(term, "\x1B[B"); /* Down */ } + if (term->mod_shift) + { + if (keysym == 0xFFBE || keysym == 0xFF91) return guac_terminal_send_string(term, "\x1B[1;2P"); /* F1 */ + if (keysym == 0xFFBF || keysym == 0xFF92) return guac_terminal_send_string(term, "\x1B[1;2Q"); /* F2 */ + if (keysym == 0xFFC0 || keysym == 0xFF93) return guac_terminal_send_string(term, "\x1B[1;2R"); /* F3 */ + if (keysym == 0xFFC1 || keysym == 0xFF94) return guac_terminal_send_string(term, "\x1B[1;2S"); /* F4 */ + if (keysym == 0xFFC2) return guac_terminal_send_string(term, "\x1B[15;2~"); /* F5 */ + + if (keysym == 0xFFC3) return guac_terminal_send_string(term, "\x1B[17;2~"); /* F6 */ + if (keysym == 0xFFC4) return guac_terminal_send_string(term, "\x1B[18;2~"); /* F7 */ + if (keysym == 0xFFC5) return guac_terminal_send_string(term, "\x1B[19;2~"); /* F8 */ + if (keysym == 0xFFC6) return guac_terminal_send_string(term, "\x1B[20;2~"); /* F9 */ + if (keysym == 0xFFC7) return guac_terminal_send_string(term, "\x1B[21;2~"); /* F10 */ + if (keysym == 0xFFC8) return guac_terminal_send_string(term, "\x1B[23;2~"); /* F11 */ + if (keysym == 0xFFC9) return guac_terminal_send_string(term, "\x1B[24;2~"); /* F12 */ + } + if (keysym == 0xFF55 || keysym == 0xFF9A) return guac_terminal_send_string(term, "\x1B[5~"); /* Page up */ if (keysym == 0xFF56 || keysym == 0xFF9B) return guac_terminal_send_string(term, "\x1B[6~"); /* Page down */ if (keysym == 0xFF57 || keysym == 0xFF9C) return guac_terminal_send_string(term, "\x1B[4~"); /* End */ From 39e84861166b29e71b8b88b79bb13151af681e70 Mon Sep 17 00:00:00 2001 From: Noor Date: Fri, 5 Nov 2021 11:19:47 +0500 Subject: [PATCH 2/6] GUACAMOLE-943: Fixed function key press with and without Shift key hold. --- src/terminal/terminal.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/terminal/terminal.c b/src/terminal/terminal.c index b521129a..6f712e4a 100644 --- a/src/terminal/terminal.c +++ b/src/terminal/terminal.c @@ -1590,8 +1590,8 @@ static int __guac_terminal_send_key(guac_terminal* term, int keysym, int pressed if (keysym == 0xFF54 || keysym == 0xFF99) return guac_terminal_send_string(term, "\x1B[B"); /* Down */ } - if (term->mod_shift) - { + /* Shift + Function keys. */ + if (term->mod_shift) { if (keysym == 0xFFBE || keysym == 0xFF91) return guac_terminal_send_string(term, "\x1B[1;2P"); /* F1 */ if (keysym == 0xFFBF || keysym == 0xFF92) return guac_terminal_send_string(term, "\x1B[1;2Q"); /* F2 */ if (keysym == 0xFFC0 || keysym == 0xFF93) return guac_terminal_send_string(term, "\x1B[1;2R"); /* F3 */ From f8d2862d0f3c7249fe7c261f83f595945b727d82 Mon Sep 17 00:00:00 2001 From: Noor Date: Mon, 8 Nov 2021 13:52:50 +0500 Subject: [PATCH 3/6] GUACAMOLE-943: Fixed incorrect escape seqeunce for different combinations. --- src/terminal/terminal.c | 107 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 101 insertions(+), 6 deletions(-) diff --git a/src/terminal/terminal.c b/src/terminal/terminal.c index 6f712e4a..1bcb6da3 100644 --- a/src/terminal/terminal.c +++ b/src/terminal/terminal.c @@ -1597,7 +1597,6 @@ static int __guac_terminal_send_key(guac_terminal* term, int keysym, int pressed if (keysym == 0xFFC0 || keysym == 0xFF93) return guac_terminal_send_string(term, "\x1B[1;2R"); /* F3 */ if (keysym == 0xFFC1 || keysym == 0xFF94) return guac_terminal_send_string(term, "\x1B[1;2S"); /* F4 */ if (keysym == 0xFFC2) return guac_terminal_send_string(term, "\x1B[15;2~"); /* F5 */ - if (keysym == 0xFFC3) return guac_terminal_send_string(term, "\x1B[17;2~"); /* F6 */ if (keysym == 0xFFC4) return guac_terminal_send_string(term, "\x1B[18;2~"); /* F7 */ if (keysym == 0xFFC5) return guac_terminal_send_string(term, "\x1B[19;2~"); /* F8 */ @@ -1606,6 +1605,102 @@ static int __guac_terminal_send_key(guac_terminal* term, int keysym, int pressed if (keysym == 0xFFC8) return guac_terminal_send_string(term, "\x1B[23;2~"); /* F11 */ if (keysym == 0xFFC9) return guac_terminal_send_string(term, "\x1B[24;2~"); /* F12 */ } + + /* Alt + Function keys. */ + if (term->mod_alt) { + if (keysym == 0xFFBE || keysym == 0xFF91) return guac_terminal_send_string(term, "\x1B[1;3P"); /* F1 */ + if (keysym == 0xFFBF || keysym == 0xFF92) return guac_terminal_send_string(term, "\x1B[1;3Q"); /* F2 */ + if (keysym == 0xFFC0 || keysym == 0xFF93) return guac_terminal_send_string(term, "\x1B[1;3R"); /* F3 */ + if (keysym == 0xFFC1 || keysym == 0xFF94) return guac_terminal_send_string(term, "\x1B[1;3S"); /* F4 */ + if (keysym == 0xFFC2) return guac_terminal_send_string(term, "\x1B[15;3~"); /* F5 */ + if (keysym == 0xFFC3) return guac_terminal_send_string(term, "\x1B[17;3~"); /* F6 */ + if (keysym == 0xFFC4) return guac_terminal_send_string(term, "\x1B[18;3~"); /* F7 */ + if (keysym == 0xFFC5) return guac_terminal_send_string(term, "\x1B[19;3~"); /* F8 */ + if (keysym == 0xFFC6) return guac_terminal_send_string(term, "\x1B[20;3~"); /* F9 */ + if (keysym == 0xFFC7) return guac_terminal_send_string(term, "\x1B[21;3~"); /* F10 */ + if (keysym == 0xFFC8) return guac_terminal_send_string(term, "\x1B[23;3~"); /* F11 */ + if (keysym == 0xFFC9) return guac_terminal_send_string(term, "\x1B[24;3~"); /* F12 */ + } + + /* Shift + Alt + Function keys. */ + if(term->mod_shift && term->mod_alt){ + if (keysym == 0xFFBE || keysym == 0xFF91) return guac_terminal_send_string(term, "\x1B[1;4P"); /* F1 */ + if (keysym == 0xFFBF || keysym == 0xFF92) return guac_terminal_send_string(term, "\x1B[1;4Q"); /* F2 */ + if (keysym == 0xFFC0 || keysym == 0xFF93) return guac_terminal_send_string(term, "\x1B[1;4R"); /* F3 */ + if (keysym == 0xFFC1 || keysym == 0xFF94) return guac_terminal_send_string(term, "\x1B[1;4S"); /* F4 */ + if (keysym == 0xFFC2) return guac_terminal_send_string(term, "\x1B[15;4~"); /* F5 */ + if (keysym == 0xFFC3) return guac_terminal_send_string(term, "\x1B[17;4~"); /* F6 */ + if (keysym == 0xFFC4) return guac_terminal_send_string(term, "\x1B[18;4~"); /* F7 */ + if (keysym == 0xFFC5) return guac_terminal_send_string(term, "\x1B[19;4~"); /* F8 */ + if (keysym == 0xFFC6) return guac_terminal_send_string(term, "\x1B[20;4~"); /* F9 */ + if (keysym == 0xFFC7) return guac_terminal_send_string(term, "\x1B[21;4~"); /* F10 */ + if (keysym == 0xFFC8) return guac_terminal_send_string(term, "\x1B[23;4~"); /* F11 */ + if (keysym == 0xFFC9) return guac_terminal_send_string(term, "\x1B[24;4~"); /* F12 */ + } + + /* Ctrl+ Function keys. */ + if (term->mod_ctrl) { + if (keysym == 0xFFBE || keysym == 0xFF91) return guac_terminal_send_string(term, "\x1B[1;5P"); /* F1 */ + if (keysym == 0xFFBF || keysym == 0xFF92) return guac_terminal_send_string(term, "\x1B[1;5Q"); /* F2 */ + if (keysym == 0xFFC0 || keysym == 0xFF93) return guac_terminal_send_string(term, "\x1B[1;5R"); /* F3 */ + if (keysym == 0xFFC1 || keysym == 0xFF94) return guac_terminal_send_string(term, "\x1B[1;5S"); /* F4 */ + if (keysym == 0xFFC2) return guac_terminal_send_string(term, "\x1B[15;5~"); /* F5 */ + if (keysym == 0xFFC3) return guac_terminal_send_string(term, "\x1B[17;5~"); /* F6 */ + if (keysym == 0xFFC4) return guac_terminal_send_string(term, "\x1B[18;5~"); /* F7 */ + if (keysym == 0xFFC5) return guac_terminal_send_string(term, "\x1B[19;5~"); /* F8 */ + if (keysym == 0xFFC6) return guac_terminal_send_string(term, "\x1B[20;5~"); /* F9 */ + if (keysym == 0xFFC7) return guac_terminal_send_string(term, "\x1B[21;5~"); /* F10 */ + if (keysym == 0xFFC8) return guac_terminal_send_string(term, "\x1B[23;5~"); /* F11 */ + if (keysym == 0xFFC9) return guac_terminal_send_string(term, "\x1B[24;5~"); /* F12 */ + } + + /* Shift + Ctrl + Function keys. */ + if(term->mod_shift && term->mod_ctrl){ + if (keysym == 0xFFBE || keysym == 0xFF91) return guac_terminal_send_string(term, "\x1B[1;6P"); /* F1 */ + if (keysym == 0xFFBF || keysym == 0xFF92) return guac_terminal_send_string(term, "\x1B[1;6Q"); /* F2 */ + if (keysym == 0xFFC0 || keysym == 0xFF93) return guac_terminal_send_string(term, "\x1B[1;6R"); /* F3 */ + if (keysym == 0xFFC1 || keysym == 0xFF94) return guac_terminal_send_string(term, "\x1B[1;6S"); /* F4 */ + if (keysym == 0xFFC2) return guac_terminal_send_string(term, "\x1B[15;6~"); /* F5 */ + if (keysym == 0xFFC3) return guac_terminal_send_string(term, "\x1B[17;6~"); /* F6 */ + if (keysym == 0xFFC4) return guac_terminal_send_string(term, "\x1B[18;6~"); /* F7 */ + if (keysym == 0xFFC5) return guac_terminal_send_string(term, "\x1B[19;6~"); /* F8 */ + if (keysym == 0xFFC6) return guac_terminal_send_string(term, "\x1B[20;6~"); /* F9 */ + if (keysym == 0xFFC7) return guac_terminal_send_string(term, "\x1B[21;6~"); /* F10 */ + if (keysym == 0xFFC8) return guac_terminal_send_string(term, "\x1B[23;6~"); /* F11 */ + if (keysym == 0xFFC9) return guac_terminal_send_string(term, "\x1B[24;6~"); /* F12 */ + } + + /* Alt + Ctrl + Function keys. */ + if(term->mod_alt && term->mod_ctrl){ + if (keysym == 0xFFBE || keysym == 0xFF91) return guac_terminal_send_string(term, "\x1B[1;7P"); /* F1 */ + if (keysym == 0xFFBF || keysym == 0xFF92) return guac_terminal_send_string(term, "\x1B[1;7Q"); /* F2 */ + if (keysym == 0xFFC0 || keysym == 0xFF93) return guac_terminal_send_string(term, "\x1B[1;7R"); /* F3 */ + if (keysym == 0xFFC1 || keysym == 0xFF94) return guac_terminal_send_string(term, "\x1B[1;7S"); /* F4 */ + if (keysym == 0xFFC2) return guac_terminal_send_string(term, "\x1B[15;7~"); /* F5 */ + if (keysym == 0xFFC3) return guac_terminal_send_string(term, "\x1B[17;7~"); /* F6 */ + if (keysym == 0xFFC4) return guac_terminal_send_string(term, "\x1B[18;7~"); /* F7 */ + if (keysym == 0xFFC5) return guac_terminal_send_string(term, "\x1B[19;7~"); /* F8 */ + if (keysym == 0xFFC6) return guac_terminal_send_string(term, "\x1B[20;7~"); /* F9 */ + if (keysym == 0xFFC7) return guac_terminal_send_string(term, "\x1B[21;7~"); /* F10 */ + if (keysym == 0xFFC8) return guac_terminal_send_string(term, "\x1B[23;7~"); /* F11 */ + if (keysym == 0xFFC9) return guac_terminal_send_string(term, "\x1B[24;7~"); /* F12 */ + } + + /* Ctrl+ Shift +Alt Function keys. */ + if(term->mod_ctrl && term->mod_alt && term->mod_shift){ + if (keysym == 0xFFBE || keysym == 0xFF91) return guac_terminal_send_string(term, "\x1B[1;8P"); /* F1 */ + if (keysym == 0xFFBF || keysym == 0xFF92) return guac_terminal_send_string(term, "\x1B[1;8Q"); /* F2 */ + if (keysym == 0xFFC0 || keysym == 0xFF93) return guac_terminal_send_string(term, "\x1B[1;8R"); /* F3 */ + if (keysym == 0xFFC1 || keysym == 0xFF94) return guac_terminal_send_string(term, "\x1B[1;8S"); /* F4 */ + if (keysym == 0xFFC2) return guac_terminal_send_string(term, "\x1B[15;8~"); /* F5 */ + if (keysym == 0xFFC3) return guac_terminal_send_string(term, "\x1B[17;8~"); /* F6 */ + if (keysym == 0xFFC4) return guac_terminal_send_string(term, "\x1B[18;8~"); /* F7 */ + if (keysym == 0xFFC5) return guac_terminal_send_string(term, "\x1B[19;8~"); /* F8 */ + if (keysym == 0xFFC6) return guac_terminal_send_string(term, "\x1B[20;8~"); /* F9 */ + if (keysym == 0xFFC7) return guac_terminal_send_string(term, "\x1B[21;8~"); /* F10 */ + if (keysym == 0xFFC8) return guac_terminal_send_string(term, "\x1B[23;8~"); /* F11 */ + if (keysym == 0xFFC9) return guac_terminal_send_string(term, "\x1B[24;8~"); /* F12 */ + } if (keysym == 0xFF55 || keysym == 0xFF9A) return guac_terminal_send_string(term, "\x1B[5~"); /* Page up */ if (keysym == 0xFF56 || keysym == 0xFF9B) return guac_terminal_send_string(term, "\x1B[6~"); /* Page down */ @@ -1613,11 +1708,11 @@ static int __guac_terminal_send_key(guac_terminal* term, int keysym, int pressed if (keysym == 0xFF63 || keysym == 0xFF9E) return guac_terminal_send_string(term, "\x1B[2~"); /* Insert */ - if (keysym == 0xFFBE || keysym == 0xFF91) return guac_terminal_send_string(term, "\x1B[[A"); /* F1 */ - if (keysym == 0xFFBF || keysym == 0xFF92) return guac_terminal_send_string(term, "\x1B[[B"); /* F2 */ - if (keysym == 0xFFC0 || keysym == 0xFF93) return guac_terminal_send_string(term, "\x1B[[C"); /* F3 */ - if (keysym == 0xFFC1 || keysym == 0xFF94) return guac_terminal_send_string(term, "\x1B[[D"); /* F4 */ - if (keysym == 0xFFC2) return guac_terminal_send_string(term, "\x1B[[E"); /* F5 */ + if (keysym == 0xFFBE || keysym == 0xFF91) return guac_terminal_send_string(term, "\x1B[[P"); /* F1 */ + if (keysym == 0xFFBF || keysym == 0xFF92) return guac_terminal_send_string(term, "\x1B[[Q"); /* F2 */ + if (keysym == 0xFFC0 || keysym == 0xFF93) return guac_terminal_send_string(term, "\x1B[[R"); /* F3 */ + if (keysym == 0xFFC1 || keysym == 0xFF94) return guac_terminal_send_string(term, "\x1B[[S"); /* F4 */ + if (keysym == 0xFFC2) return guac_terminal_send_string(term, "\x1B[15~"); /* F5 */ if (keysym == 0xFFC3) return guac_terminal_send_string(term, "\x1B[17~"); /* F6 */ if (keysym == 0xFFC4) return guac_terminal_send_string(term, "\x1B[18~"); /* F7 */ From 3f2ca485fc966d57f1543ff3765979a6ccddb28f Mon Sep 17 00:00:00 2001 From: Noor Date: Tue, 9 Nov 2021 12:01:05 +0500 Subject: [PATCH 4/6] GUACAMOLE-943: Reduced the repetation of if statements using Bitwise Operators. --- src/terminal/terminal.c | 191 ++++++++++++++++++---------------------- 1 file changed, 87 insertions(+), 104 deletions(-) diff --git a/src/terminal/terminal.c b/src/terminal/terminal.c index 1bcb6da3..b931658b 100644 --- a/src/terminal/terminal.c +++ b/src/terminal/terminal.c @@ -1590,116 +1590,99 @@ static int __guac_terminal_send_key(guac_terminal* term, int keysym, int pressed if (keysym == 0xFF54 || keysym == 0xFF99) return guac_terminal_send_string(term, "\x1B[B"); /* Down */ } - /* Shift + Function keys. */ - if (term->mod_shift) { - if (keysym == 0xFFBE || keysym == 0xFF91) return guac_terminal_send_string(term, "\x1B[1;2P"); /* F1 */ - if (keysym == 0xFFBF || keysym == 0xFF92) return guac_terminal_send_string(term, "\x1B[1;2Q"); /* F2 */ - if (keysym == 0xFFC0 || keysym == 0xFF93) return guac_terminal_send_string(term, "\x1B[1;2R"); /* F3 */ - if (keysym == 0xFFC1 || keysym == 0xFF94) return guac_terminal_send_string(term, "\x1B[1;2S"); /* F4 */ - if (keysym == 0xFFC2) return guac_terminal_send_string(term, "\x1B[15;2~"); /* F5 */ - if (keysym == 0xFFC3) return guac_terminal_send_string(term, "\x1B[17;2~"); /* F6 */ - if (keysym == 0xFFC4) return guac_terminal_send_string(term, "\x1B[18;2~"); /* F7 */ - if (keysym == 0xFFC5) return guac_terminal_send_string(term, "\x1B[19;2~"); /* F8 */ - if (keysym == 0xFFC6) return guac_terminal_send_string(term, "\x1B[20;2~"); /* F9 */ - if (keysym == 0xFFC7) return guac_terminal_send_string(term, "\x1B[21;2~"); /* F10 */ - if (keysym == 0xFFC8) return guac_terminal_send_string(term, "\x1B[23;2~"); /* F11 */ - if (keysym == 0xFFC9) return guac_terminal_send_string(term, "\x1B[24;2~"); /* F12 */ - } + /* Check if any Modifier key is pressed. */ + if (term->mod_ctrl || term->mod_alt || term->mod_shift) { + int keyseq = 0; - /* Alt + Function keys. */ - if (term->mod_alt) { - if (keysym == 0xFFBE || keysym == 0xFF91) return guac_terminal_send_string(term, "\x1B[1;3P"); /* F1 */ - if (keysym == 0xFFBF || keysym == 0xFF92) return guac_terminal_send_string(term, "\x1B[1;3Q"); /* F2 */ - if (keysym == 0xFFC0 || keysym == 0xFF93) return guac_terminal_send_string(term, "\x1B[1;3R"); /* F3 */ - if (keysym == 0xFFC1 || keysym == 0xFF94) return guac_terminal_send_string(term, "\x1B[1;3S"); /* F4 */ - if (keysym == 0xFFC2) return guac_terminal_send_string(term, "\x1B[15;3~"); /* F5 */ - if (keysym == 0xFFC3) return guac_terminal_send_string(term, "\x1B[17;3~"); /* F6 */ - if (keysym == 0xFFC4) return guac_terminal_send_string(term, "\x1B[18;3~"); /* F7 */ - if (keysym == 0xFFC5) return guac_terminal_send_string(term, "\x1B[19;3~"); /* F8 */ - if (keysym == 0xFFC6) return guac_terminal_send_string(term, "\x1B[20;3~"); /* F9 */ - if (keysym == 0xFFC7) return guac_terminal_send_string(term, "\x1B[21;3~"); /* F10 */ - if (keysym == 0xFFC8) return guac_terminal_send_string(term, "\x1B[23;3~"); /* F11 */ - if (keysym == 0xFFC9) return guac_terminal_send_string(term, "\x1B[24;3~"); /* F12 */ - } + if (term->mod_ctrl) keyseq = keyseq | 4; /* OR operation with other modifier key combination. */ + if (term->mod_alt) keyseq = keyseq | 2; + if (term->mod_shift) keyseq = keyseq | 1; - /* Shift + Alt + Function keys. */ - if(term->mod_shift && term->mod_alt){ - if (keysym == 0xFFBE || keysym == 0xFF91) return guac_terminal_send_string(term, "\x1B[1;4P"); /* F1 */ - if (keysym == 0xFFBF || keysym == 0xFF92) return guac_terminal_send_string(term, "\x1B[1;4Q"); /* F2 */ - if (keysym == 0xFFC0 || keysym == 0xFF93) return guac_terminal_send_string(term, "\x1B[1;4R"); /* F3 */ - if (keysym == 0xFFC1 || keysym == 0xFF94) return guac_terminal_send_string(term, "\x1B[1;4S"); /* F4 */ - if (keysym == 0xFFC2) return guac_terminal_send_string(term, "\x1B[15;4~"); /* F5 */ - if (keysym == 0xFFC3) return guac_terminal_send_string(term, "\x1B[17;4~"); /* F6 */ - if (keysym == 0xFFC4) return guac_terminal_send_string(term, "\x1B[18;4~"); /* F7 */ - if (keysym == 0xFFC5) return guac_terminal_send_string(term, "\x1B[19;4~"); /* F8 */ - if (keysym == 0xFFC6) return guac_terminal_send_string(term, "\x1B[20;4~"); /* F9 */ - if (keysym == 0xFFC7) return guac_terminal_send_string(term, "\x1B[21;4~"); /* F10 */ - if (keysym == 0xFFC8) return guac_terminal_send_string(term, "\x1B[23;4~"); /* F11 */ - if (keysym == 0xFFC9) return guac_terminal_send_string(term, "\x1B[24;4~"); /* F12 */ - } + keyseq = keyseq + 1; + + /* F1 */ + if (keysym == 0xFFBE || keysym == 0xFF91) { + char data[10]; + sprintf(data,"\x1B[1;%dP",keyseq); + return guac_terminal_send_string(term, data); + } - /* Ctrl+ Function keys. */ - if (term->mod_ctrl) { - if (keysym == 0xFFBE || keysym == 0xFF91) return guac_terminal_send_string(term, "\x1B[1;5P"); /* F1 */ - if (keysym == 0xFFBF || keysym == 0xFF92) return guac_terminal_send_string(term, "\x1B[1;5Q"); /* F2 */ - if (keysym == 0xFFC0 || keysym == 0xFF93) return guac_terminal_send_string(term, "\x1B[1;5R"); /* F3 */ - if (keysym == 0xFFC1 || keysym == 0xFF94) return guac_terminal_send_string(term, "\x1B[1;5S"); /* F4 */ - if (keysym == 0xFFC2) return guac_terminal_send_string(term, "\x1B[15;5~"); /* F5 */ - if (keysym == 0xFFC3) return guac_terminal_send_string(term, "\x1B[17;5~"); /* F6 */ - if (keysym == 0xFFC4) return guac_terminal_send_string(term, "\x1B[18;5~"); /* F7 */ - if (keysym == 0xFFC5) return guac_terminal_send_string(term, "\x1B[19;5~"); /* F8 */ - if (keysym == 0xFFC6) return guac_terminal_send_string(term, "\x1B[20;5~"); /* F9 */ - if (keysym == 0xFFC7) return guac_terminal_send_string(term, "\x1B[21;5~"); /* F10 */ - if (keysym == 0xFFC8) return guac_terminal_send_string(term, "\x1B[23;5~"); /* F11 */ - if (keysym == 0xFFC9) return guac_terminal_send_string(term, "\x1B[24;5~"); /* F12 */ - } + /* F2 */ + if (keysym == 0xFFBF || keysym == 0xFF92) { + char data[10]; + sprintf(data,"\x1B[1;%dQ",keyseq); + return guac_terminal_send_string(term, data); + } + + /* F3 */ + if (keysym == 0xFFC0 || keysym == 0xFF93) { + char data[10]; + sprintf(data,"\x1B[1;%dR",keyseq); + return guac_terminal_send_string(term, data); + } + + /* F4 */ + if (keysym == 0xFFC1 || keysym == 0xFF94) { + char data[10]; + sprintf(data,"\x1B[1;%dS",keyseq); + return guac_terminal_send_string(term, data); + } - /* Shift + Ctrl + Function keys. */ - if(term->mod_shift && term->mod_ctrl){ - if (keysym == 0xFFBE || keysym == 0xFF91) return guac_terminal_send_string(term, "\x1B[1;6P"); /* F1 */ - if (keysym == 0xFFBF || keysym == 0xFF92) return guac_terminal_send_string(term, "\x1B[1;6Q"); /* F2 */ - if (keysym == 0xFFC0 || keysym == 0xFF93) return guac_terminal_send_string(term, "\x1B[1;6R"); /* F3 */ - if (keysym == 0xFFC1 || keysym == 0xFF94) return guac_terminal_send_string(term, "\x1B[1;6S"); /* F4 */ - if (keysym == 0xFFC2) return guac_terminal_send_string(term, "\x1B[15;6~"); /* F5 */ - if (keysym == 0xFFC3) return guac_terminal_send_string(term, "\x1B[17;6~"); /* F6 */ - if (keysym == 0xFFC4) return guac_terminal_send_string(term, "\x1B[18;6~"); /* F7 */ - if (keysym == 0xFFC5) return guac_terminal_send_string(term, "\x1B[19;6~"); /* F8 */ - if (keysym == 0xFFC6) return guac_terminal_send_string(term, "\x1B[20;6~"); /* F9 */ - if (keysym == 0xFFC7) return guac_terminal_send_string(term, "\x1B[21;6~"); /* F10 */ - if (keysym == 0xFFC8) return guac_terminal_send_string(term, "\x1B[23;6~"); /* F11 */ - if (keysym == 0xFFC9) return guac_terminal_send_string(term, "\x1B[24;6~"); /* F12 */ - } + /* F5 */ + if (keysym == 0xFFC2) { + char data[10]; + sprintf(data,"\x1B[15;%d~",keyseq); + return guac_terminal_send_string(term, data); + } - /* Alt + Ctrl + Function keys. */ - if(term->mod_alt && term->mod_ctrl){ - if (keysym == 0xFFBE || keysym == 0xFF91) return guac_terminal_send_string(term, "\x1B[1;7P"); /* F1 */ - if (keysym == 0xFFBF || keysym == 0xFF92) return guac_terminal_send_string(term, "\x1B[1;7Q"); /* F2 */ - if (keysym == 0xFFC0 || keysym == 0xFF93) return guac_terminal_send_string(term, "\x1B[1;7R"); /* F3 */ - if (keysym == 0xFFC1 || keysym == 0xFF94) return guac_terminal_send_string(term, "\x1B[1;7S"); /* F4 */ - if (keysym == 0xFFC2) return guac_terminal_send_string(term, "\x1B[15;7~"); /* F5 */ - if (keysym == 0xFFC3) return guac_terminal_send_string(term, "\x1B[17;7~"); /* F6 */ - if (keysym == 0xFFC4) return guac_terminal_send_string(term, "\x1B[18;7~"); /* F7 */ - if (keysym == 0xFFC5) return guac_terminal_send_string(term, "\x1B[19;7~"); /* F8 */ - if (keysym == 0xFFC6) return guac_terminal_send_string(term, "\x1B[20;7~"); /* F9 */ - if (keysym == 0xFFC7) return guac_terminal_send_string(term, "\x1B[21;7~"); /* F10 */ - if (keysym == 0xFFC8) return guac_terminal_send_string(term, "\x1B[23;7~"); /* F11 */ - if (keysym == 0xFFC9) return guac_terminal_send_string(term, "\x1B[24;7~"); /* F12 */ - } + /* F6 */ + if (keysym == 0xFFC3) { + char data[10]; + sprintf(data,"\x1B[17;%d~",keyseq); + return guac_terminal_send_string(term, data); + } + + /* F7 */ + if (keysym == 0xFFC4) { + char data[10]; + sprintf(data,"\x1B[18;%d~",keyseq); + return guac_terminal_send_string(term, data); + } - /* Ctrl+ Shift +Alt Function keys. */ - if(term->mod_ctrl && term->mod_alt && term->mod_shift){ - if (keysym == 0xFFBE || keysym == 0xFF91) return guac_terminal_send_string(term, "\x1B[1;8P"); /* F1 */ - if (keysym == 0xFFBF || keysym == 0xFF92) return guac_terminal_send_string(term, "\x1B[1;8Q"); /* F2 */ - if (keysym == 0xFFC0 || keysym == 0xFF93) return guac_terminal_send_string(term, "\x1B[1;8R"); /* F3 */ - if (keysym == 0xFFC1 || keysym == 0xFF94) return guac_terminal_send_string(term, "\x1B[1;8S"); /* F4 */ - if (keysym == 0xFFC2) return guac_terminal_send_string(term, "\x1B[15;8~"); /* F5 */ - if (keysym == 0xFFC3) return guac_terminal_send_string(term, "\x1B[17;8~"); /* F6 */ - if (keysym == 0xFFC4) return guac_terminal_send_string(term, "\x1B[18;8~"); /* F7 */ - if (keysym == 0xFFC5) return guac_terminal_send_string(term, "\x1B[19;8~"); /* F8 */ - if (keysym == 0xFFC6) return guac_terminal_send_string(term, "\x1B[20;8~"); /* F9 */ - if (keysym == 0xFFC7) return guac_terminal_send_string(term, "\x1B[21;8~"); /* F10 */ - if (keysym == 0xFFC8) return guac_terminal_send_string(term, "\x1B[23;8~"); /* F11 */ - if (keysym == 0xFFC9) return guac_terminal_send_string(term, "\x1B[24;8~"); /* F12 */ + /* F8 */ + if (keysym == 0xFFC5) { + char data[10]; + sprintf(data,"\x1B[19;%d~",keyseq); + return guac_terminal_send_string(term, data); + } + + /* F9 */ + if (keysym == 0xFFC6) { + char data[10]; + sprintf(data,"\x1B[20;%d~",keyseq); + return guac_terminal_send_string(term, data); + } + + /* F10 */ + if (keysym == 0xFFC7) { + char data[10]; + sprintf(data,"\x1B[21;%d~",keyseq); + return guac_terminal_send_string(term, data); + } + + /* F11 */ + if (keysym == 0xFFC8) { + char data[10]; + sprintf(data,"\x1B[23;%d~",keyseq); + return guac_terminal_send_string(term, data); + } + + /* F12 */ + if (keysym == 0xFFC9) { + char data[10]; + sprintf(data,"\x1B[24;%d~",keyseq); + return guac_terminal_send_string(term, data); + } } if (keysym == 0xFF55 || keysym == 0xFF9A) return guac_terminal_send_string(term, "\x1B[5~"); /* Page up */ From 0e7bc0910a9d149bc26f65a9af93e3b1467fa85a Mon Sep 17 00:00:00 2001 From: Noor Date: Tue, 16 Nov 2021 17:49:29 +0500 Subject: [PATCH 5/6] GUACAMOLE-943: Fix formatting issues. --- src/terminal/terminal.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/terminal/terminal.c b/src/terminal/terminal.c index b931658b..ee9b84fd 100644 --- a/src/terminal/terminal.c +++ b/src/terminal/terminal.c @@ -1603,84 +1603,84 @@ static int __guac_terminal_send_key(guac_terminal* term, int keysym, int pressed /* F1 */ if (keysym == 0xFFBE || keysym == 0xFF91) { char data[10]; - sprintf(data,"\x1B[1;%dP",keyseq); + sprintf(data, "\x1B[1;%dP", keyseq); return guac_terminal_send_string(term, data); } /* F2 */ if (keysym == 0xFFBF || keysym == 0xFF92) { char data[10]; - sprintf(data,"\x1B[1;%dQ",keyseq); + sprintf(data, "\x1B[1;%dQ", keyseq); return guac_terminal_send_string(term, data); } /* F3 */ if (keysym == 0xFFC0 || keysym == 0xFF93) { char data[10]; - sprintf(data,"\x1B[1;%dR",keyseq); + sprintf(data, "\x1B[1;%dR", keyseq); return guac_terminal_send_string(term, data); } /* F4 */ if (keysym == 0xFFC1 || keysym == 0xFF94) { char data[10]; - sprintf(data,"\x1B[1;%dS",keyseq); + sprintf(data, "\x1B[1;%dS", keyseq); return guac_terminal_send_string(term, data); } /* F5 */ if (keysym == 0xFFC2) { char data[10]; - sprintf(data,"\x1B[15;%d~",keyseq); + sprintf(data, "\x1B[15;%d~", keyseq); return guac_terminal_send_string(term, data); } /* F6 */ if (keysym == 0xFFC3) { char data[10]; - sprintf(data,"\x1B[17;%d~",keyseq); + sprintf(data, "\x1B[17;%d~", keyseq); return guac_terminal_send_string(term, data); } /* F7 */ if (keysym == 0xFFC4) { char data[10]; - sprintf(data,"\x1B[18;%d~",keyseq); + sprintf(data, "\x1B[18;%d~", keyseq); return guac_terminal_send_string(term, data); } /* F8 */ if (keysym == 0xFFC5) { char data[10]; - sprintf(data,"\x1B[19;%d~",keyseq); + sprintf(data, "\x1B[19;%d~", keyseq); return guac_terminal_send_string(term, data); } /* F9 */ if (keysym == 0xFFC6) { char data[10]; - sprintf(data,"\x1B[20;%d~",keyseq); + sprintf(data, "\x1B[20;%d~", keyseq); return guac_terminal_send_string(term, data); } /* F10 */ if (keysym == 0xFFC7) { char data[10]; - sprintf(data,"\x1B[21;%d~",keyseq); + sprintf(data, "\x1B[21;%d~", keyseq); return guac_terminal_send_string(term, data); } /* F11 */ if (keysym == 0xFFC8) { char data[10]; - sprintf(data,"\x1B[23;%d~",keyseq); + sprintf(data, "\x1B[23;%d~", keyseq); return guac_terminal_send_string(term, data); } /* F12 */ if (keysym == 0xFFC9) { char data[10]; - sprintf(data,"\x1B[24;%d~",keyseq); + sprintf(data, "\x1B[24;%d~", keyseq); return guac_terminal_send_string(term, data); } } From 659a0d767a343aeb71ce9a236078a9548738d6e9 Mon Sep 17 00:00:00 2001 From: Noor-glyp Date: Thu, 18 Nov 2021 14:08:57 +0500 Subject: [PATCH 6/6] GUACAMOLE-943: Replaced guac_terminal_send_string functions with guac_terminal_sendf. --- src/terminal/terminal.c | 96 ++++++----------------------------------- 1 file changed, 12 insertions(+), 84 deletions(-) diff --git a/src/terminal/terminal.c b/src/terminal/terminal.c index ee9b84fd..ea9c12e2 100644 --- a/src/terminal/terminal.c +++ b/src/terminal/terminal.c @@ -1600,89 +1600,18 @@ static int __guac_terminal_send_key(guac_terminal* term, int keysym, int pressed keyseq = keyseq + 1; - /* F1 */ - if (keysym == 0xFFBE || keysym == 0xFF91) { - char data[10]; - sprintf(data, "\x1B[1;%dP", keyseq); - return guac_terminal_send_string(term, data); - } - - /* F2 */ - if (keysym == 0xFFBF || keysym == 0xFF92) { - char data[10]; - sprintf(data, "\x1B[1;%dQ", keyseq); - return guac_terminal_send_string(term, data); - } - - /* F3 */ - if (keysym == 0xFFC0 || keysym == 0xFF93) { - char data[10]; - sprintf(data, "\x1B[1;%dR", keyseq); - return guac_terminal_send_string(term, data); - } - - /* F4 */ - if (keysym == 0xFFC1 || keysym == 0xFF94) { - char data[10]; - sprintf(data, "\x1B[1;%dS", keyseq); - return guac_terminal_send_string(term, data); - } - - /* F5 */ - if (keysym == 0xFFC2) { - char data[10]; - sprintf(data, "\x1B[15;%d~", keyseq); - return guac_terminal_send_string(term, data); - } - - /* F6 */ - if (keysym == 0xFFC3) { - char data[10]; - sprintf(data, "\x1B[17;%d~", keyseq); - return guac_terminal_send_string(term, data); - } - - /* F7 */ - if (keysym == 0xFFC4) { - char data[10]; - sprintf(data, "\x1B[18;%d~", keyseq); - return guac_terminal_send_string(term, data); - } - - /* F8 */ - if (keysym == 0xFFC5) { - char data[10]; - sprintf(data, "\x1B[19;%d~", keyseq); - return guac_terminal_send_string(term, data); - } - - /* F9 */ - if (keysym == 0xFFC6) { - char data[10]; - sprintf(data, "\x1B[20;%d~", keyseq); - return guac_terminal_send_string(term, data); - } - - /* F10 */ - if (keysym == 0xFFC7) { - char data[10]; - sprintf(data, "\x1B[21;%d~", keyseq); - return guac_terminal_send_string(term, data); - } - - /* F11 */ - if (keysym == 0xFFC8) { - char data[10]; - sprintf(data, "\x1B[23;%d~", keyseq); - return guac_terminal_send_string(term, data); - } - - /* F12 */ - if (keysym == 0xFFC9) { - char data[10]; - sprintf(data, "\x1B[24;%d~", keyseq); - return guac_terminal_send_string(term, data); - } + if (keysym == 0xFFBE || keysym == 0xFF91) return guac_terminal_sendf(term, "\x1B[1;%dP", keyseq); /* F1 */ + if (keysym == 0xFFBF || keysym == 0xFF92) return guac_terminal_sendf(term, "\x1B[1;%dQ", keyseq); /* F2 */ + if (keysym == 0xFFC0 || keysym == 0xFF93) return guac_terminal_sendf(term, "\x1B[1;%dR", keyseq); /* F3 */ + if (keysym == 0xFFC1 || keysym == 0xFF94) return guac_terminal_sendf(term, "\x1B[1;%dS", keyseq); /* F4 */ + if (keysym == 0xFFC2) return guac_terminal_sendf(term, "\x1B[15;%d~", keyseq); /* F5 */ + if (keysym == 0xFFC3) return guac_terminal_sendf(term, "\x1B[17;%d~", keyseq); /* F6 */ + if (keysym == 0xFFC4) return guac_terminal_sendf(term, "\x1B[18;%d~", keyseq); /* F7 */ + if (keysym == 0xFFC5) return guac_terminal_sendf(term, "\x1B[19;%d~", keyseq); /* F8 */ + if (keysym == 0xFFC6) return guac_terminal_sendf(term, "\x1B[20;%d~", keyseq); /* F9 */ + if (keysym == 0xFFC7) return guac_terminal_sendf(term, "\x1B[21;%d~", keyseq); /* F10 */ + if (keysym == 0xFFC8) return guac_terminal_sendf(term, "\x1B[23;%d~", keyseq); /* F11 */ + if (keysym == 0xFFC9) return guac_terminal_sendf(term, "\x1B[24;%d~", keyseq); /* F12 */ } if (keysym == 0xFF55 || keysym == 0xFF9A) return guac_terminal_send_string(term, "\x1B[5~"); /* Page up */ @@ -1696,7 +1625,6 @@ static int __guac_terminal_send_key(guac_terminal* term, int keysym, int pressed if (keysym == 0xFFC0 || keysym == 0xFF93) return guac_terminal_send_string(term, "\x1B[[R"); /* F3 */ if (keysym == 0xFFC1 || keysym == 0xFF94) return guac_terminal_send_string(term, "\x1B[[S"); /* F4 */ if (keysym == 0xFFC2) return guac_terminal_send_string(term, "\x1B[15~"); /* F5 */ - if (keysym == 0xFFC3) return guac_terminal_send_string(term, "\x1B[17~"); /* F6 */ if (keysym == 0xFFC4) return guac_terminal_send_string(term, "\x1B[18~"); /* F7 */ if (keysym == 0xFFC5) return guac_terminal_send_string(term, "\x1B[19~"); /* F8 */