diff options
| -rw-r--r-- | st.c | 17 |
1 files changed, 15 insertions, 2 deletions
| @@ -1060,12 +1060,25 @@ tresize(int col, int row) { | |||
| 1060 | int i; | 1060 | int i; |
| 1061 | int minrow = MIN(row, term.row); | 1061 | int minrow = MIN(row, term.row); |
| 1062 | int mincol = MIN(col, term.col); | 1062 | int mincol = MIN(col, term.col); |
| 1063 | int slide = term.c.y - row + 1; | ||
| 1063 | 1064 | ||
| 1064 | if(col < 1 || row < 1) | 1065 | if(col < 1 || row < 1) |
| 1065 | return; | 1066 | return; |
| 1066 | 1067 | ||
| 1067 | /* free uneeded rows */ | 1068 | /* free unneeded rows */ |
| 1068 | for(i = row; i < term.row; i++) { | 1069 | i = 0; |
| 1070 | if(slide > 0) { | ||
| 1071 | /* slide screen to keep cursor where we expect it - | ||
| 1072 | * tscrollup would work here, but we can optimize to | ||
| 1073 | * memmove because we're freeing the earlier lines */ | ||
| 1074 | for(/* i = 0 */; i < slide; i++) { | ||
| 1075 | free(term.line[i]); | ||
| 1076 | free(term.alt[i]); | ||
| 1077 | } | ||
| 1078 | memmove(term.line, term.line + slide, row * sizeof(Line)); | ||
| 1079 | memmove(term.alt, term.alt + slide, row * sizeof(Line)); | ||
| 1080 | } | ||
| 1081 | for(i += row; i < term.row; i++) { | ||
| 1069 | free(term.line[i]); | 1082 | free(term.line[i]); |
| 1070 | free(term.alt[i]); | 1083 | free(term.alt[i]); |
| 1071 | } | 1084 | } |
