--- rxvt-unicode/src/screen.C 2013/03/25 16:24:18 1.439 +++ rxvt-unicode/src/screen.C 2014/12/06 09:36:12 1.451 @@ -7,7 +7,7 @@ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, @@ -717,7 +717,7 @@ if (option (Opt_scrollWithBuffer) && view_start != 0 && view_start != -saveLines) - scr_page (UP, count); + scr_page (count); if (SHOULD_INVOKE (HOOK_SCROLL_BACK)) HOOK_INVOKE ((this, HOOK_SCROLL_BACK, DT_INT, count, DT_INT, top_row, DT_END)); @@ -1242,20 +1242,16 @@ void rxvt_term::scr_index (enum page_dirn direction) NOTHROW { - int dirn; - want_refresh = 1; ZERO_SCROLLBACK (); - dirn = ((direction == UP) ? 1 : -1); - screen.flags &= ~Screen_WrapNext; if ((screen.cur.row == screen.bscroll && direction == UP) || (screen.cur.row == screen.tscroll && direction == DN)) - scr_scroll_text (screen.tscroll, screen.bscroll, dirn); + scr_scroll_text (screen.tscroll, screen.bscroll, direction); else - screen.cur.row += dirn; + screen.cur.row += direction; clamp_it (screen.cur.row, 0, nrow - 1); selection_check (0); @@ -1903,7 +1899,8 @@ void rxvt_term::scr_move_to (int y, int len) NOTHROW { - scr_changeview ((top_row - nrow) * (len - y) / len + (nrow - 1)); + // lerp (y, 0, len, top_row, nrow - 1) + scr_changeview (top_row + (nrow - 1 - top_row) * y / len); } /* ------------------------------------------------------------------------- */ @@ -1912,13 +1909,9 @@ * direction should be UP or DN */ bool -rxvt_term::scr_page (enum page_dirn direction, int nlines) NOTHROW +rxvt_term::scr_page (int nlines) NOTHROW { - int new_view_start = - direction == UP ? view_start - nlines - : view_start + nlines; - - return scr_changeview (new_view_start); + return scr_changeview (view_start - nlines); } bool @@ -2127,11 +2120,11 @@ ccol2 = Color_bg; #endif - if (focus) + if (focus && cursor_type != 2) { rend_t rend = cur_rend; - if (option (Opt_cursorUnderline)) + if (cursor_type == 1) rend ^= RS_Uline; else { @@ -2148,7 +2141,7 @@ if (ocrow != -1) { if (screen.cur.row - view_start != ocrow - || screen.cur.col != oldcursor.col) + || screen.cur.col != oldcursor.col || !showcursor) { if (ocrow < nrow && oldcursor.col < ncol) @@ -2157,9 +2150,10 @@ } // save the current cursor coordinates if the cursor is visible - // and the window is unfocused, so as to clear the outline cursor - // in the next refresh if the cursor moves - if (showcursor && !focus && screen.cur.row - view_start < nrow) + // and either the window is unfocused or the cursor style is + // vertical bar, so as to clear the outline cursor in the next + // refresh if the cursor moves or becomes invisible + if (showcursor && (!focus || cursor_type == 2) && screen.cur.row - view_start < nrow) { oldcursor.row = screen.cur.row - view_start; oldcursor.col = screen.cur.col; @@ -2256,10 +2250,7 @@ for (col = 0; col < ncol; col++) { /* compare new text with old - if exactly the same then continue */ - if (stp[col] == dtp[col] /* Must match characters to skip. */ - && (RS_SAME (srp[col], drp[col]) /* Either rendition the same or */ - || (stp[col] == ' ' /* space w/ no background change */ - && GET_BGATTR (srp[col]) == GET_BGATTR (drp[col])))) + if (stp[col] == dtp[col] && RS_SAME (srp[col], drp[col])) continue; // redraw one or more characters @@ -2465,7 +2456,19 @@ if (showcursor) { if (focus) - scr_set_char_rend (ROW(screen.cur.row), cur_col, cur_rend); + { + if (cursor_type != 2) + scr_set_char_rend (ROW(screen.cur.row), cur_col, cur_rend); + else if (oldcursor.row >= 0) + { + XSetForeground (dpy, gc, pix_colors[ccol1]); + XFillRectangle (dpy, vt, gc, + Col2Pixel (cur_col), + Row2Pixel (oldcursor.row), + 1, + Height2Pixel (1)); + } + } else if (oldcursor.row >= 0) { XSetForeground (dpy, gc, pix_colors[ccol1]); @@ -2550,7 +2553,7 @@ XClearWindow (dpy, parent); - if (scrollBar.win) + if (scrollBar.state && scrollBar.win) { if (transparent) XSetWindowBackgroundPixmap (dpy, scrollBar.win, ParentRelative); @@ -2688,8 +2691,8 @@ rxvt_term::selection_changed () NOTHROW { line_t &r1 = ROW (selection.beg.row); - while (selection.beg.col > 0 && r1.t [selection.beg.col] == NOCHAR) - --selection.beg.col; + while (selection.beg.col < r1.l && r1.t [selection.beg.col] == NOCHAR) + ++selection.beg.col; line_t &r2 = ROW (selection.end.row); while (selection.end.col < r2.l && r2.t [selection.end.col] == NOCHAR)