--- rxvt-unicode/src/screen.C 2011/11/15 20:07:10 1.404 +++ rxvt-unicode/src/screen.C 2012/01/24 17:05:05 1.414 @@ -51,8 +51,10 @@ #define CLEAR_SELECTION() \ selection.beg.row = selection.beg.col \ = selection.end.row = selection.end.col = 0 -#define CLEAR_SELECTION_MARK() \ - selection.mark.row = selection.mark.col = 0 +#define CLEAR_ALL_SELECTION() \ + selection.beg.row = selection.beg.col \ + = selection.mark.row = selection.mark.col \ + = selection.end.row = selection.end.col = 0 #define ROW_AND_COL_IS_AFTER(A, B, C, D) \ (((A) > (C)) || (((A) == (C)) && ((B) > (D)))) @@ -405,8 +407,7 @@ for (int col = ncol; col--; ) tabs [col] = col % TABSIZE == 0; - CLEAR_SELECTION (); - CLEAR_SELECTION_MARK (); + CLEAR_ALL_SELECTION (); prev_nrow = nrow; prev_ncol = ncol; @@ -456,7 +457,7 @@ } void -rxvt_term::scr_soft_reset () +rxvt_term::scr_soft_reset () NOTHROW { /* only affects modes, nothing drastic such as clearing the screen */ #if ENABLE_OVERLAY @@ -521,7 +522,7 @@ } void -rxvt_term::scr_swap_screen () +rxvt_term::scr_swap_screen () NOTHROW { if (!option (Opt_secondaryScreen)) return; @@ -550,7 +551,12 @@ want_refresh = 1; view_start = 0; - selection_check (2); /* check for boundary cross */ + /* check for boundary cross */ + row_col_t pos; + pos.row = pos.col = 0; + if (ROWCOL_IS_BEFORE (selection.beg, pos) + && ROWCOL_IS_AFTER (selection.end, pos)) + CLEAR_SELECTION (); current_screen = scrn; @@ -713,9 +719,8 @@ || (selection.end.row - count < row1 && selection.end.row >= row1) || (selection.end.row - count > row2 && selection.end.row <= row2)) { - CLEAR_SELECTION (); - if (!IN_RANGE_EXC (selection.mark.row, top_row, nrow)) - CLEAR_SELECTION_MARK (); + CLEAR_ALL_SELECTION (); + selection.op = SELECTION_CLEAR; } else if (selection.end.row >= row1 && selection.end.row <= row2) { @@ -1309,7 +1314,7 @@ /* ------------------------------------------------------------------------- */ /* - * Erase part of whole of the screen + * Erase part or whole of the screen * XTERM_SEQ: Clear screen after cursor : ESC [ 0 J * XTERM_SEQ: Clear screen before cursor: ESC [ 1 J * XTERM_SEQ: Clear whole screen : ESC [ 2 J @@ -1328,19 +1333,16 @@ switch (mode) { case 0: /* erase to end of screen */ - selection_check (1); scr_erase_line (0); row = screen.cur.row + 1; /* possible OOB */ num = nrow - row; break; case 1: /* erase to beginning of screen */ - selection_check (3); scr_erase_line (1); row = 0; num = screen.cur.row; break; case 2: /* erase whole screen */ - selection_check (3); row = 0; num = nrow; break; @@ -1367,7 +1369,7 @@ if (mapped) XClearArea (dpy, vt, 0, - Row2Pixel (row - view_start), (unsigned int)width, + Row2Pixel (row - view_start), (unsigned int)vt_width, (unsigned int)Height2Pixel (num), False); } else @@ -1380,7 +1382,7 @@ XChangeGC (dpy, gc, GCForeground, &gcvalue); XFillRectangle (dpy, vt, gc, 0, Row2Pixel (row - view_start), - (unsigned int)width, + (unsigned int)vt_width, (unsigned int)Height2Pixel (num)); gcvalue.foreground = pix_colors[Color_fg]; XChangeGC (dpy, gc, GCForeground, &gcvalue); @@ -1421,7 +1423,11 @@ ZERO_SCROLLBACK (); num_scr_allow = 0; - selection_check (3); + + row_col_t pos; + pos.row = pos.col = 0; + if (ROWCOL_IS_AFTER (selection.end, pos)) + CLEAR_SELECTION (); fs = SET_FONT (rstyle, FONTSET (rstyle)->find_font ('E')); for (int row = nrow; row--; ) @@ -1872,7 +1878,7 @@ void rxvt_term::scr_touch (bool refresh) NOTHROW { - scr_expose (0, 0, width, height, refresh); + scr_expose (0, 0, vt_width, vt_height, refresh); } /* ------------------------------------------------------------------------- */ @@ -2163,7 +2169,6 @@ int i = num_scr; int j; int len, wlen; - dLocal (int, num_scr); j = nrow; wlen = len = -1; @@ -2478,7 +2483,7 @@ Col2Pixel (col), Row2Pixel (oldcursor.row), (unsigned int) (Width2Pixel (cursorwidth) - 1), - (unsigned int) (Height2Pixel (1) - lineSpace - 1)); + (unsigned int) (Height2Pixel (1) - 1)); } } @@ -2664,26 +2669,8 @@ void rxvt_term::scr_dump (int fd) NOTHROW { - int row, wrote; - unsigned int width, towrite; - const char r1[] = "\n"; - - for (row = saveLines + top_row; - row < saveLines + nrow - 1; row++) - { - width = row_buf[row].l >= 0 ? row_buf[row].l - : ncol; - for (towrite = width; towrite; towrite -= wrote) - { - wrote = write (fd, & (row_buf[row].t[width - towrite]), - towrite); - if (wrote < 0) - return; /* XXX: death, no report */ - } - if (row_buf[row].l >= 0) - if (write (fd, r1, 1) <= 0) - return; /* XXX: death, no report */ - } + // if this method is needed, it can be implemented by factoring the + // relevant code in scr_printscreen } #endif @@ -2696,24 +2683,14 @@ if (!selection.op) return; - row_col_t pos; - pos.row = pos.col = 0; - if (!IN_RANGE_EXC (selection.beg.row, top_row, nrow) + || !IN_RANGE_EXC (selection.mark.row, top_row, nrow) || !IN_RANGE_EXC (selection.end.row, top_row, nrow) || (check_more == 1 && current_screen == selection.screen && !ROWCOL_IS_BEFORE (screen.cur, selection.beg) - && ROWCOL_IS_BEFORE (screen.cur, selection.end)) - || (check_more == 2 - && ROWCOL_IS_BEFORE (selection.beg, pos) - && ROWCOL_IS_AFTER (selection.end, pos)) - || (check_more == 3 - && ROWCOL_IS_AFTER (selection.end, pos))) - CLEAR_SELECTION (); - - if (!IN_RANGE_EXC (selection.mark.row, top_row, nrow)) - CLEAR_SELECTION_MARK (); + && ROWCOL_IS_BEFORE (screen.cur, selection.end))) + CLEAR_ALL_SELECTION (); } /* ------------------------------------------------------------------------- */ @@ -2729,12 +2706,12 @@ data[i] = C0_CR; if (priv_modes & PrivMode_BracketPaste) - tt_printf ("\e[200~"); + tt_printf ("\x1b[200~"); tt_write (data, len); if (priv_modes & PrivMode_BracketPaste) - tt_printf ("\e[201~"); + tt_printf ("\x1b[201~"); } void