From 8f3b5d3a8618d5d5ef03e9e69fcfadf1647c283d Mon Sep 17 00:00:00 2001 From: corentin-soriano Date: Mon, 15 Apr 2024 17:50:30 +0200 Subject: [PATCH] GUACAMOLE-1943: Add ctrl+arrows/backspace/del and shift+up/down/home/end keyboard shortcuts. --- src/terminal/terminal.c | 42 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/src/terminal/terminal.c b/src/terminal/terminal.c index 68a3875a8..3e6c7992c 100644 --- a/src/terminal/terminal.c +++ b/src/terminal/terminal.c @@ -1608,9 +1608,21 @@ static int __guac_terminal_send_key(guac_terminal* term, int keysym, int pressed if ((keysym == 'C' && term->mod_ctrl) || (keysym == 'c' && term->mod_meta)) return 0; - /* Shift+PgUp / Shift+PgDown shortcuts for scrolling */ + /* Shortcuts for scrolling history with shift */ if (term->mod_shift) { + /* Home */ + if (keysym == 0xFF50 || keysym == 0xFF95) { + guac_terminal_scroll_display_up(term, term->max_scrollback); + return 0; + } + + /* End */ + if (keysym == 0xFF57 || keysym == 0xFF9C) { + guac_terminal_scroll_display_down(term, term->max_scrollback); + return 0; + } + /* Page up */ if (keysym == 0xFF55) { guac_terminal_scroll_display_up(term, term->term_height); @@ -1623,6 +1635,18 @@ static int __guac_terminal_send_key(guac_terminal* term, int keysym, int pressed return 0; } + /* Up */ + if (keysym == 0xFF52 || keysym == 0xFF97) { + guac_terminal_scroll_display_up(term, 1); + return 0; + } + + /* Down */ + if (keysym == 0xFF54 || keysym == 0xFF99) { + guac_terminal_scroll_display_down(term, 1); + return 0; + } + } /* Reset scroll */ @@ -1658,6 +1682,22 @@ static int __guac_terminal_send_key(guac_terminal* term, int keysym, int pressed else if (keysym >= '3' && keysym <= '7') data = (char) (keysym - '3' + 0x1B); + /* CTRL+Left: return to previous word */ + else if (keysym == 0xFF51 || keysym == 0xFF96) + return guac_terminal_send_string(term, "\033[1;5D"); + + /* CTRL+Right: go to next word */ + else if (keysym == 0xFF53 || keysym == 0xFF98) + return guac_terminal_send_string(term, "\033[1;5C"); + + /* CTRL+Backspace: remove word (map to CTRL+w) */ + else if (keysym == 0xFF08) + data = (char) 23; + + /* CTRL+Supr: remove word to right */ + else if (keysym == 0xFFFF) + return guac_terminal_send_string(term, "\033D"); + /* Otherwise ignore */ else return 0;