diff options
Diffstat (limited to 'clear.patch')
-rw-r--r-- | clear.patch | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/clear.patch b/clear.patch new file mode 100644 index 000000000000..402287677a61 --- /dev/null +++ b/clear.patch @@ -0,0 +1,61 @@ +diff -r 4399ffb6a87c -r 48f53e1cf599 src/command.C +--- a/src/command.C Sat Jan 21 13:57:22 2012 +0100 ++++ b/src/command.C Mon Apr 30 16:22:25 2012 +0200 +@@ -2869,6 +2869,10 @@ + return; + } + ++ /* remember the current row on position change, in case there's a clear screen ++ * right after, so that we can add "preserve" the buffer (e.g. on ^L) */ ++ static int old_row = -1, was_moved = 0; ++ + switch (ch) + { + /* +@@ -2932,6 +2936,12 @@ + + case CSI_CUP: /* 8.3.21: (1,1) CURSOR POSITION */ + case CSI_HVP: /* 8.3.64: (1,1) CHARACTER AND LINE POSITION */ ++ /* if moving to row 1, remember current row in case a clear screen comes next */ ++ if (nargs == 1 && arg[0] == 1 && current_screen == 0) ++ { ++ was_moved = 1; ++ old_row = screen.cur.row; ++ } + scr_gotorc (arg[0] - 1, nargs < 2 ? 0 : (arg[1] - 1), 0); + break; + +@@ -2943,6 +2953,16 @@ + break; + + case CSI_ED: /* 8.3.40: (0) ERASE IN PAGE */ ++ if (was_moved) ++ { ++ /* this is most likely a ^L, so we'll go back to where we where before ++ * the position change, add a screen of empty lines, then move back ++ * on top. that way the (scrolling) buffer will be preserved */ ++ scr_gotorc (old_row, 0, 0); ++ for (int i = nrow - 1; i > 0; --i) ++ scr_add_lines (L"\r\n", 2); ++ scr_gotorc (0, 0, 0); ++ } + scr_erase_screen (arg[0]); + break; + +@@ -3086,6 +3106,16 @@ + default: + break; + } ++ if (was_moved > 0) ++ { ++ if (was_moved > 1) ++ { ++ was_moved = 0; ++ old_row = -1; ++ } ++ else ++ ++was_moved; ++ } + } + /*}}} */ + |