--- rxvt-unicode/src/screen.C 2006/01/16 08:57:02 1.234 +++ rxvt-unicode/src/screen.C 2006/01/19 19:51:08 1.242 @@ -236,7 +236,6 @@ selection.op = SELECTION_CLEAR; selection.screen = PRIMARY; selection.clicks = 0; - CLEAR_ALL_SELECTION (); rvideo = 0; } else @@ -327,6 +326,10 @@ int qcol = 0; + // see below for cursor adjustment rationale + if (p == ocur.row) + screen.cur.row = q - (total_rows - nrow); + // fill a single destination line while (lofs < llen && qcol < ncol) { @@ -346,8 +349,10 @@ int len = min (min (prev_ncol - pcol, ncol - qcol), llen - lofs); +#if DEBUG_STRICT assert (len); assert (pline.t); +#endif memcpy (qline->t + qcol, pline.t + pcol, len * sizeof (text_t)); memcpy (qline->r + qcol, pline.r + pcol, len * sizeof (rend_t)); @@ -391,11 +396,6 @@ term_start = 0; } -#ifdef DEBUG_STRICT //TODO: remove - for (int i = top_row; i < nrow; i++) - assert (ROW (i).t); -#endif - free (old_buf); delete old_ta; delete old_ra; @@ -407,6 +407,8 @@ free (tabs); } + CLEAR_ALL_SELECTION (); + prev_nrow = nrow; prev_ncol = ncol; @@ -450,7 +452,7 @@ scr_reset (); scr_clear (true); - scr_refresh (SLOW_REFRESH); + scr_refresh (); } /* ------------------------------------------------------------------------- * @@ -462,7 +464,7 @@ * XTERM_SEQ: Restore cursor: ESC 8 */ void -rxvt_term::scr_cursor (int mode) +rxvt_term::scr_cursor (cursor_mode mode) { screen_t *s; @@ -622,19 +624,19 @@ // scroll everything up 'count' lines term_start = (term_start + count) % total_rows; + // sever bottommost line { - // severe bottommost scrolled line line_t &l = ROW(row2 - count); - l.touch (); l.is_longer (0); + l.touch (); } - // erase newly scorlled-in lines - for (int i = count; i; --i ) + // erase newly scrolled-in lines + for (int i = count; i--; ) { // basically this is a slightly optimized scr_blank_screen_mem // it is worth the effort on slower machines - line_t &l = ROW(nrow - i); + line_t &l = ROW(nrow - 1 - i); scr_blank_line (l, 0, l.l, rstyle); @@ -819,11 +821,11 @@ if (screen.flags & Screen_WrapNext) { - max_it (line->l, ncol); - line->is_longer (1); - scr_do_wrap (); + line->l = ncol; + line->is_longer (1); + row = screen.cur.row; line = &ROW(row); /* _must_ refresh */ } @@ -1792,8 +1794,10 @@ for (i = rc[PART_BEG].row; i <= rc[PART_END].row; i++) fill_text (&drawn_buf[i].t[rc[PART_BEG].col], 0, rc[PART_END].col - rc[PART_BEG].col + 1); + num_scr_allow = 0; + if (refresh) - scr_refresh (SLOW_REFRESH); + scr_refresh (); } /* ------------------------------------------------------------------------- */ @@ -1937,7 +1941,7 @@ * screen.text/screen.rend contain what the screen will change to. */ void -rxvt_term::scr_refresh (unsigned char refresh_type) +rxvt_term::scr_refresh () { unsigned char must_clear, /* use draw_string not draw_image_string */ showcursor; /* show the cursor */ @@ -2071,7 +2075,6 @@ * D: CopyArea pass - very useful for slower links * This has been deliberately kept simple. */ - i = num_scr; if (!display->is_local && refresh_type == FAST_REFRESH && num_scr_allow && num_scr && abs (num_scr) < nrow && !must_clear) @@ -2079,6 +2082,7 @@ int16_t nits; int j; int len, wlen; + dLocal (int, num_scr); j = nrow; wlen = len = -1; @@ -2800,11 +2804,8 @@ * EXT: button 2 release */ void -rxvt_term::selection_request (Time tm, int x, int y) +rxvt_term::selection_request (Time tm) { - if (x < 0 || x >= width || y < 0 || y >= height) - return; /* outside window */ - if (selection.text) { /* internal selection */ char *str = rxvt_wcstombs (selection.text, selection.len);