mike-jumper commented on code in PR #525:
URL: https://github.com/apache/guacamole-server/pull/525#discussion_r1778884987


##########
src/terminal/terminal-handlers.c:
##########
@@ -918,31 +1012,87 @@ int guac_terminal_csi(guac_terminal* term, unsigned char 
c) {
 
                 break;
 
-            /* h: Set Mode */
+            /* h: Set Mode (DECSET) */
             case 'h':
-             
-                /* Look up flag and set */ 
+
+                /* Save cursor for later restoration */
+                if (argv[0] == GUAC_TERMINAL_DECSET_SAVE_CURSOR
+                        || argv[0] == 
GUAC_TERMINAL_DECSET_USE_ALT_BUFFER_AND_SAVE_CURSOR_AND_CLEAR) {
+                    term->saved_cursor_row = term->cursor_row;
+                    term->saved_cursor_col = term->cursor_col;
+                }
+
+                if (term->current_buffer != term->alternate_buffer) {
+
+                    /* Switch to alternate buffer */
+                    if (argv[0] == GUAC_TERMINAL_DECSET_USE_ALT_BUFFER
+                            || argv[0] == 
GUAC_TERMINAL_DECSET_USE_ALT_BUFFER_AND_CLEAR
+                            || argv[0] == 
GUAC_TERMINAL_DECSET_USE_ALT_BUFFER_AND_SAVE_CURSOR_AND_CLEAR) {
+
+                        term->current_buffer = term->alternate_buffer;
+
+                        /* Update scrollbar bounds (the different buffers have 
differing levels of scrollback) */
+                        guac_terminal_scrollbar_set_bounds(term->scrollbar,
+                                -guac_terminal_get_available_scroll(term), 0);
+
+                    }
+
+                    /* Clear alternate buffer only if we were previously using
+                     * the normal buffer */
+                    if (argv[0] == 
GUAC_TERMINAL_DECSET_USE_ALT_BUFFER_AND_CLEAR
+                            || argv[0] == 
GUAC_TERMINAL_DECSET_USE_ALT_BUFFER_AND_SAVE_CURSOR_AND_CLEAR) {
+                        guac_terminal_clear_range(term,
+                                0, 0, term->term_height - 1, term->term_width 
- 1);
+                    }
+
+                }
+
+                /* Look up flag and set */
                 flag = __guac_terminal_get_flag(term, argv[0], 
private_mode_character);
                 if (flag != NULL)
                     *flag = true;
 
-                /* Open alternate screen buffer */
-                if (argv[0] == GUAC_TERMINAL_ALT_BUFFER)
-                    guac_terminal_switch_buffers(term, true);
-
                 break;
 
-            /* l: Reset Mode */
+            /* l: Reset Mode (DECRST) */
             case 'l':
-              
-                /* Look up flag and clear */ 
+
+                if (term->current_buffer != term->normal_buffer) {
+
+                    /* Switch back to normal buffer */
+                    if (argv[0] == GUAC_TERMINAL_DECRST_USE_NORMAL_BUFFER
+                            || argv[0] == 
GUAC_TERMINAL_DECRST_USE_NORMAL_BUFFER_AND_CLEAR
+                            || argv[0] == 
GUAC_TERMINAL_DECRST_USE_NORMAL_BUFFER_AND_RESTORE_CURSOR) {
+
+                        term->current_buffer = term->normal_buffer;
+
+                        /* Update scrollbar bounds (the different buffers have 
differing levels of scrollback) */
+                        guac_terminal_scrollbar_set_bounds(term->scrollbar,
+                                -guac_terminal_get_available_scroll(term), 0);
+
+                    }
+
+                    /* Clear normal buffer only if we were previously using
+                     * the alternate buffer */
+                    if (argv[0] == 
GUAC_TERMINAL_DECRST_USE_NORMAL_BUFFER_AND_CLEAR) {
+                        guac_terminal_clear_range(term,
+                                0, 0, term->term_height - 1, term->term_width 
- 1);
+                    }

Review Comment:
   > I think we should check if we receive the code 
`GUAC_TERMINAL_DECRST_USE_NORMAL_BUFFER_AND_RESTORE_CURSOR`.
   
   We typically only receive that if `TERM` is set to `xterm-256color` within 
the SSH session.
   
   > However guac_terminal_clear_range completely clears the screen instead of 
restoring the contents of the normal buffer so we have a black screen with only 
the cursor row shown
   
   I believe that's required behavior for this particular DECRST code (1047), 
which is defined as clearing the normal buffer after switching to it. From 
https://www.xfree86.org/current/ctlseqs.html:
   
   > P s = 1 0 4 7 → Use Normal Screen Buffer, clearing screen first if in the 
Alternate Screen (unless disabled by the titeInhibit resource)
   



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: dev-unsubscr...@guacamole.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to