void term_size(int newrows, int newcols, int newsavelines) {
tree234 *newsb, *newscreen, *newalt;
unsigned long *newdisp, *newwant, *oldline, *line;
- int i, j, crows, ccols;
+ int i, j, ccols;
int posn, oldposn, furthest_back, oldsbsize;
int save_alt_which = alt_which;
for (i=0; i<newrows; i++) {
line = smalloc(TSIZE * (newcols+1));
for (j = 0; j <= newcols; j++)
- line[i] = erase_char;
+ line[j] = erase_char;
addpos234(newalt, line, i);
}
if (alt_screen) {
*/
static void swap_screen (int which) {
int t;
- unsigned long tt;
tree234 *ttr;
if (which == alt_which)
* Update the scroll bar.
*/
static void update_sbar(void) {
- int nscreen, nscroll;
+ int nscroll;
nscroll = count234(scrollback);
* Scroll the screen. (`lines' is +ve for scrolling forward, -ve
* for backward.) `sb' is TRUE if the scrolling is permitted to
* affect the scrollback buffer.
+ *
+ * NB this function invalidates all pointers into lines of the
+ * screen data structures. In particular, you MUST call fix_cpos
+ * after calling scroll() and before doing anything else that
+ * uses the cpos shortcut pointer.
*/
static void scroll (int topline, int botline, int lines, int sb) {
unsigned long *line, *line2;
int i;
- if (topline != 0)
+ if (topline != 0 || alt_which != 0)
sb = FALSE;
if (lines < 0) {
* whole line, or parts thereof.
*/
static void erase_lots (int line_only, int from_begin, int to_end) {
- pos start, end, here;
+ pos start, end;
int erase_lattr;
unsigned long *ldata;
compatibility(VT102);
if (curs.y <= marg_b)
scroll (curs.y, marg_b, -def(esc_args[0], 1), FALSE);
+ fix_cpos;
seen_disp_event = TRUE;
break;
case 'M': /* delete lines */
compatibility(VT102);
if (curs.y <= marg_b)
scroll (curs.y, marg_b, def(esc_args[0], 1), TRUE);
+ fix_cpos;
seen_disp_event = TRUE;
break;
case '@': /* insert chars */
break;
case SEEN_ESCHASH:
{
- unsigned long *p;
unsigned long nlattr;
unsigned long *ldata;
int i, j;
while (poslt(top, bottom)) {
int nl = FALSE;
unsigned long *ldata = lineptr(top.y);
- pos lineend, nlpos;
+ pos nlpos;
nlpos.y = top.y;
nlpos.x = cols;
*/
static pos sel_spread_half (pos p, int dir) {
unsigned long *ldata;
- int x;
short wvalue;
ldata = lineptr(p.y);
} else {
selstart = selanchor;
selend = selpoint;
- incpos(selpoint);
+ incpos(selend);
}
sel_spread();
} else if ((b == MB_SELECT || b == MB_EXTEND) && a == MA_RELEASE) {