tresize from the top. - st - [fork] customized build of st, the simple terminal | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit fbc6ec3207fa1298ec8347697ddea6b3e78f13d0 | |
parent 9d82bdd94708fa2daabc0b53f8b71bca2a3c6f0a | |
Author: Aurélien Aptel <[email protected]> | |
Date: Thu, 2 Sep 2010 01:42:03 +0200 | |
resize from the top. | |
Diffstat: | |
M st.c | 17 +++++++++++++++-- | |
1 file changed, 15 insertions(+), 2 deletions(-) | |
--- | |
diff --git a/st.c b/st.c | |
t@@ -1060,12 +1060,25 @@ tresize(int col, int row) { | |
int i; | |
int minrow = MIN(row, term.row); | |
int mincol = MIN(col, term.col); | |
+ int slide = term.c.y - row + 1; | |
if(col < 1 || row < 1) | |
return; | |
- /* free uneeded rows */ | |
- for(i = row; i < term.row; i++) { | |
+ /* free unneeded rows */ | |
+ i = 0; | |
+ if(slide > 0) { | |
+ /* slide screen to keep cursor where we expect it - | |
+ * tscrollup would work here, but we can optimize to | |
+ * memmove because we're freeing the earlier lines */ | |
+ for(/* i = 0 */; i < slide; i++) { | |
+ free(term.line[i]); | |
+ free(term.alt[i]); | |
+ } | |
+ memmove(term.line, term.line + slide, row * sizeof(Line)); | |
+ memmove(term.alt, term.alt + slide, row * sizeof(Line)); | |
+ } | |
+ for(i += row; i < term.row; i++) { | |
free(term.line[i]); | |
free(term.alt[i]); | |
} |