CSI 3 J now clears the scrollback, as in xterm.
[u/mdw/putty] / terminal.c
index c24926a..f5603a8 100644 (file)
@@ -1211,7 +1211,8 @@ static void power_on(Terminal *term, int clear)
     term->in_vbell = FALSE;
     term->cursor_on = 1;
     term->big_cursor = 0;
-    term->default_attr = term->save_attr = term->curr_attr = ATTR_DEFAULT;
+    term->default_attr = term->save_attr =
+       term->alt_save_attr = term->curr_attr = ATTR_DEFAULT;
     term->term_editing = term->term_echoing = FALSE;
     term->app_cursor_keys = term->cfg.app_cursor;
     term->app_keypad_keys = term->cfg.app_keypad;
@@ -1812,6 +1813,10 @@ static void swap_screen(Terminal *term, int which, int reset, int keep_cur_pos)
         if (!reset && !keep_cur_pos)
             term->save_csattr = term->alt_save_csattr;
         term->alt_save_csattr = t;
+        t = term->save_attr;
+        if (!reset && !keep_cur_pos)
+            term->save_attr = term->alt_save_attr;
+        term->alt_save_attr = t;
         t = term->save_utf;
         if (!reset && !keep_cur_pos)
             term->save_utf = term->alt_save_utf;
@@ -3341,10 +3346,17 @@ static void term_out(Terminal *term)
                        break;
                      case 'J':       /* ED: erase screen or parts of it */
                        {
-                           unsigned int i = def(term->esc_args[0], 0) + 1;
-                           if (i > 3)
-                               i = 0;
-                           erase_lots(term, FALSE, !!(i & 2), !!(i & 1));
+                           unsigned int i = def(term->esc_args[0], 0);
+                           if (i == 3) {
+                               /* Erase Saved Lines (xterm)
+                                * This follows Thomas Dickey's xterm. */
+                               term_clrsb(term);
+                           } else {
+                               i++;
+                               if (i > 3)
+                                   i = 0;
+                               erase_lots(term, FALSE, !!(i & 2), !!(i & 1));
+                           }
                        }
                        term->disptop = 0;
                        seen_disp_event(term);