ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/screen.C
(Generate patch)

Comparing rxvt-unicode/src/screen.C (file contents):
Revision 1.384 by sf-exg, Mon May 30 18:39:04 2011 UTC vs.
Revision 1.412 by root, Wed Jan 18 12:26:59 2012 UTC

203 term_start = 0; 203 term_start = 0;
204 204
205 talloc = new rxvt_salloc (ncol * sizeof (text_t)); 205 talloc = new rxvt_salloc (ncol * sizeof (text_t));
206 ralloc = new rxvt_salloc (ncol * sizeof (rend_t)); 206 ralloc = new rxvt_salloc (ncol * sizeof (rend_t));
207 207
208 row_buf = (line_t *)rxvt_calloc (total_rows + nrow, sizeof (line_t)); 208 row_buf = (line_t *)rxvt_calloc (total_rows , sizeof (line_t));
209 drawn_buf = (line_t *)rxvt_calloc (nrow , sizeof (line_t)); 209 drawn_buf = (line_t *)rxvt_calloc (nrow , sizeof (line_t));
210 swap_buf = (line_t *)rxvt_calloc (nrow , sizeof (line_t)); 210 swap_buf = (line_t *)rxvt_calloc (nrow , sizeof (line_t));
211 211
212 for (int row = nrow; row--; ) 212 for (int row = nrow; row--; )
213 { 213 {
275 swap_buf [row].clear (); scr_blank_screen_mem (swap_buf [row], DEFAULT_RSTYLE); 275 swap_buf [row].clear (); scr_blank_screen_mem (swap_buf [row], DEFAULT_RSTYLE);
276 drawn_buf[row].clear (); scr_blank_screen_mem (drawn_buf[row], DEFAULT_RSTYLE); 276 drawn_buf[row].clear (); scr_blank_screen_mem (drawn_buf[row], DEFAULT_RSTYLE);
277 } 277 }
278 278
279 line_t *old_buf = row_buf; 279 line_t *old_buf = row_buf;
280 row_buf = (line_t *)rxvt_calloc (total_rows + nrow, sizeof (line_t)); 280 row_buf = (line_t *)rxvt_calloc (total_rows, sizeof (line_t));
281 281
282 int p = MOD (term_start + prev_nrow, prev_total_rows); // previous row 282 int p = MOD (term_start + prev_nrow, prev_total_rows); // previous row
283 int pend = MOD (term_start + top_row , prev_total_rows); 283 int pend = MOD (term_start + top_row , prev_total_rows);
284 int q = total_rows; // rewrapped row 284 int q = total_rows; // rewrapped row
285 285
549 return; 549 return;
550 550
551 want_refresh = 1; 551 want_refresh = 1;
552 view_start = 0; 552 view_start = 0;
553 553
554 selection_check (2); /* check for boundary cross */ 554 /* check for boundary cross */
555 row_col_t pos;
556 pos.row = pos.col = 0;
557 if (ROWCOL_IS_BEFORE (selection.beg, pos)
558 && ROWCOL_IS_AFTER (selection.end, pos))
559 CLEAR_SELECTION ();
555 560
556 current_screen = scrn; 561 current_screen = scrn;
557 562
558#if NSCREENS 563#if NSCREENS
559 if (option (Opt_secondaryScreen)) 564 if (option (Opt_secondaryScreen))
638 643
639 if (count > 0 644 if (count > 0
640 && row1 == 0 645 && row1 == 0
641 && (current_screen == PRIMARY || option (Opt_secondaryScroll))) 646 && (current_screen == PRIMARY || option (Opt_secondaryScroll)))
642 { 647 {
648 min_it (count, total_rows - (nrow - (row2 + 1)));
649
643 top_row = max (top_row - count, -saveLines); 650 top_row = max (top_row - count, -saveLines);
644
645 // scroll everything up 'count' lines
646 term_start = (term_start + count) % total_rows;
647 651
648 // sever bottommost line 652 // sever bottommost line
649 { 653 {
650 line_t &l = ROW(row2 - count); 654 line_t &l = ROW(row2);
651 l.is_longer (0); 655 l.is_longer (0);
652 l.touch (); 656 l.touch ();
653 } 657 }
654 658
659 // scroll everything up 'count' lines
660 term_start = (term_start + count) % total_rows;
661
662 // now copy lines below the scroll region bottom to the
663 // bottom of the screen again, so they look as if they
664 // hadn't moved.
665 for (int i = nrow; --i > row2; )
666 {
667 line_t &l1 = ROW(i - count);
668 line_t &l2 = ROW(i);
669
670 ::swap (l1, l2);
671 l2.touch ();
672 }
673
655 // erase newly scrolled-in lines 674 // erase newly scrolled-in lines
656 for (int i = count; i--; ) 675 for (int i = count; i--; )
657 { 676 {
658 line_t &l = ROW(nrow - 1 - i); 677 line_t &l = ROW(row2 - i);
659 678
660 // optimize if already cleared, can be significant on slow machines 679 // optimise if already cleared, can be significant on slow machines
661 // could be rolled into scr_blank_screen_mem 680 // could be rolled into scr_blank_screen_mem
662 if (l.r && l.l < ncol - 1 && !((l.r[l.l + 1] ^ rstyle) & (RS_fgMask | RS_bgMask))) 681 if (l.r && l.l < ncol - 1 && !((l.r[l.l + 1] ^ rstyle) & (RS_fgMask | RS_bgMask)))
663 { 682 {
664 scr_blank_line (l, 0, l.l, rstyle); 683 scr_blank_line (l, 0, l.l, rstyle);
665 l.l = 0; 684 l.l = 0;
667 } 686 }
668 else 687 else
669 scr_blank_screen_mem (l, rstyle); 688 scr_blank_screen_mem (l, rstyle);
670 } 689 }
671 690
672 // now copy lines below the scroll region bottom to the
673 // bottom of the screen again, so they look as if they
674 // hadn't moved.
675 for (int i = nrow; --i > row2; )
676 {
677 line_t &l1 = ROW(i - count);
678 line_t &l2 = ROW(i);
679
680 ::swap (l1, l2);
681 l2.touch ();
682 }
683
684 // move and/or clear selection, if any 691 // move and/or clear selection, if any
685 if (selection.op && current_screen == selection.screen) 692 if (selection.op && current_screen == selection.screen
693 && selection.beg.row <= row2)
686 { 694 {
687 selection.beg.row -= count; 695 selection.beg.row -= count;
688 selection.end.row -= count; 696 selection.end.row -= count;
689 selection.mark.row -= count; 697 selection.mark.row -= count;
690 698
691 if (selection.beg.row < top_row 699 selection_check (0);
692 || selection.end.row < top_row
693 || selection.mark.row < top_row)
694 {
695 CLEAR_ALL_SELECTION ();
696 selection.op = SELECTION_CLEAR;
697 }
698 } 700 }
699 701
700 // finally move the view window, if desired 702 // finally move the view window, if desired
701 if (option (Opt_scrollWithBuffer) 703 if (option (Opt_scrollWithBuffer)
702 && view_start != 0 704 && view_start != 0
732 } 734 }
733 735
734 // use a simple and robust scrolling algorithm, this 736 // use a simple and robust scrolling algorithm, this
735 // part of scr_scroll_text is not time-critical. 737 // part of scr_scroll_text is not time-critical.
736 738
739 // sever line above scroll region
740 if (row1)
741 {
742 line_t &l = ROW(row1 - 1);
743 l.is_longer (0);
744 l.touch ();
745 }
746
737 int rows = row2 - row1 + 1; 747 int rows = row2 - row1 + 1;
738 748
739 min_it (count, rows); 749 min_it (count, rows);
740 750
741 line_t *temp_buf = row_buf + total_rows; 751 line_t *temp_buf = rxvt_temp_buf<line_t> (rows);
742 752
743 for (int row = 0; row < rows; row++) 753 for (int row = 0; row < rows; row++)
744 { 754 {
745 temp_buf [row] = ROW(row1 + (row + count + rows) % rows); 755 temp_buf [row] = ROW(row1 + (row + count + rows) % rows);
746 756
748 scr_blank_screen_mem (temp_buf [row], rstyle); 758 scr_blank_screen_mem (temp_buf [row], rstyle);
749 } 759 }
750 760
751 for (int row = 0; row < rows; row++) 761 for (int row = 0; row < rows; row++)
752 ROW(row1 + row) = temp_buf [row]; 762 ROW(row1 + row) = temp_buf [row];
763
764 // sever bottommost line
765 {
766 line_t &l = ROW(row2);
767 l.is_longer (0);
768 l.touch ();
769 }
753 } 770 }
754 771
755 return count; 772 return count;
756} 773}
757 774
763rxvt_term::scr_add_lines (const wchar_t *str, int len, int minlines) NOTHROW 780rxvt_term::scr_add_lines (const wchar_t *str, int len, int minlines) NOTHROW
764{ 781{
765 if (len <= 0) /* sanity */ 782 if (len <= 0) /* sanity */
766 return; 783 return;
767 784
768 unsigned char checksel; 785 bool checksel;
769 unicode_t c; 786 unicode_t c;
770 int ncol = this->ncol; 787 int ncol = this->ncol;
771 const wchar_t *strend = str + len; 788 const wchar_t *strend = str + len;
772 789
773 want_refresh = 1; 790 want_refresh = 1;
1295 scr_blank_line (line, col, num, rstyle); 1312 scr_blank_line (line, col, num, rstyle);
1296} 1313}
1297 1314
1298/* ------------------------------------------------------------------------- */ 1315/* ------------------------------------------------------------------------- */
1299/* 1316/*
1300 * Erase part of whole of the screen 1317 * Erase part or whole of the screen
1301 * XTERM_SEQ: Clear screen after cursor : ESC [ 0 J 1318 * XTERM_SEQ: Clear screen after cursor : ESC [ 0 J
1302 * XTERM_SEQ: Clear screen before cursor: ESC [ 1 J 1319 * XTERM_SEQ: Clear screen before cursor: ESC [ 1 J
1303 * XTERM_SEQ: Clear whole screen : ESC [ 2 J 1320 * XTERM_SEQ: Clear whole screen : ESC [ 2 J
1304 */ 1321 */
1305void 1322void
1314 ZERO_SCROLLBACK (); 1331 ZERO_SCROLLBACK ();
1315 1332
1316 switch (mode) 1333 switch (mode)
1317 { 1334 {
1318 case 0: /* erase to end of screen */ 1335 case 0: /* erase to end of screen */
1319 selection_check (1);
1320 scr_erase_line (0); 1336 scr_erase_line (0);
1321 row = screen.cur.row + 1; /* possible OOB */ 1337 row = screen.cur.row + 1; /* possible OOB */
1322 num = nrow - row; 1338 num = nrow - row;
1323 break; 1339 break;
1324 case 1: /* erase to beginning of screen */ 1340 case 1: /* erase to beginning of screen */
1325 selection_check (3);
1326 scr_erase_line (1); 1341 scr_erase_line (1);
1327 row = 0; 1342 row = 0;
1328 num = screen.cur.row; 1343 num = screen.cur.row;
1329 break; 1344 break;
1330 case 2: /* erase whole screen */ 1345 case 2: /* erase whole screen */
1331 selection_check (3);
1332 row = 0; 1346 row = 0;
1333 num = nrow; 1347 num = nrow;
1334 break; 1348 break;
1335 default: 1349 default:
1336 return; 1350 return;
1353 { 1367 {
1354 ren = DEFAULT_RSTYLE; 1368 ren = DEFAULT_RSTYLE;
1355 1369
1356 if (mapped) 1370 if (mapped)
1357 XClearArea (dpy, vt, 0, 1371 XClearArea (dpy, vt, 0,
1358 Row2Pixel (row - view_start), (unsigned int)width, 1372 Row2Pixel (row - view_start), (unsigned int)vt_width,
1359 (unsigned int)Height2Pixel (num), False); 1373 (unsigned int)Height2Pixel (num), False);
1360 } 1374 }
1361 else 1375 else
1362 { 1376 {
1363 ren = rstyle & (RS_fgMask | RS_bgMask); 1377 ren = rstyle & (RS_fgMask | RS_bgMask);
1366 { 1380 {
1367 gcvalue.foreground = pix_colors[bgcolor_of (rstyle)]; 1381 gcvalue.foreground = pix_colors[bgcolor_of (rstyle)];
1368 XChangeGC (dpy, gc, GCForeground, &gcvalue); 1382 XChangeGC (dpy, gc, GCForeground, &gcvalue);
1369 XFillRectangle (dpy, vt, gc, 1383 XFillRectangle (dpy, vt, gc,
1370 0, Row2Pixel (row - view_start), 1384 0, Row2Pixel (row - view_start),
1371 (unsigned int)width, 1385 (unsigned int)vt_width,
1372 (unsigned int)Height2Pixel (num)); 1386 (unsigned int)Height2Pixel (num));
1373 gcvalue.foreground = pix_colors[Color_fg]; 1387 gcvalue.foreground = pix_colors[Color_fg];
1374 XChangeGC (dpy, gc, GCForeground, &gcvalue); 1388 XChangeGC (dpy, gc, GCForeground, &gcvalue);
1375 } 1389 }
1376 } 1390 }
1407 1421
1408 want_refresh = 1; 1422 want_refresh = 1;
1409 ZERO_SCROLLBACK (); 1423 ZERO_SCROLLBACK ();
1410 1424
1411 num_scr_allow = 0; 1425 num_scr_allow = 0;
1412 selection_check (3); 1426
1427 row_col_t pos;
1428 pos.row = pos.col = 0;
1429 if (ROWCOL_IS_AFTER (selection.end, pos))
1430 CLEAR_SELECTION ();
1413 1431
1414 fs = SET_FONT (rstyle, FONTSET (rstyle)->find_font ('E')); 1432 fs = SET_FONT (rstyle, FONTSET (rstyle)->find_font ('E'));
1415 for (int row = nrow; row--; ) 1433 for (int row = nrow; row--; )
1416 { 1434 {
1417 line_t &line = ROW(row); 1435 line_t &line = ROW(row);
1858 * Refresh the entire screen 1876 * Refresh the entire screen
1859 */ 1877 */
1860void 1878void
1861rxvt_term::scr_touch (bool refresh) NOTHROW 1879rxvt_term::scr_touch (bool refresh) NOTHROW
1862{ 1880{
1863 scr_expose (0, 0, width, height, refresh); 1881 scr_expose (0, 0, vt_width, vt_height, refresh);
1864} 1882}
1865 1883
1866/* ------------------------------------------------------------------------- */ 1884/* ------------------------------------------------------------------------- */
1867/* 1885/*
1868 * Move the display so that the line represented by scrollbar value Y is at 1886 * Move the display so that the line represented by scrollbar value Y is at
2030 * A: set up vars 2048 * A: set up vars
2031 */ 2049 */
2032 refresh_count = 0; 2050 refresh_count = 0;
2033 2051
2034 unsigned int old_screen_flags = screen.flags; 2052 unsigned int old_screen_flags = screen.flags;
2035 char have_bg = 0; 2053 bool have_bg = 0;
2036#ifdef HAVE_BG_PIXMAP 2054#ifdef HAVE_BG_PIXMAP
2037 have_bg = bg_pixmap != None; 2055 have_bg = bg_pixmap != None;
2038#endif 2056#endif
2039 ocrow = oldcursor.row; /* is there an old outline cursor on screen? */ 2057 ocrow = oldcursor.row; /* is there an old outline cursor on screen? */
2040 2058
2046 HOOK_INVOKE ((this, HOOK_REFRESH_BEGIN, DT_END)); 2064 HOOK_INVOKE ((this, HOOK_REFRESH_BEGIN, DT_END));
2047#if ENABLE_OVERLAY 2065#if ENABLE_OVERLAY
2048 scr_swap_overlay (); 2066 scr_swap_overlay ();
2049#endif 2067#endif
2050 2068
2051 char showcursor = screen.flags & Screen_VisibleCursor; 2069 bool showcursor = screen.flags & Screen_VisibleCursor;
2052 2070
2053 /* 2071 /*
2054 * C: set the cursor character (s) 2072 * C: set the cursor character (s)
2055 */ 2073 */
2056 { 2074 {
2057 unsigned char setoldcursor; 2075 bool setoldcursor;
2058 2076
2059#ifdef CURSOR_BLINK 2077#ifdef CURSOR_BLINK
2060 if (hidden_cursor) 2078 if (hidden_cursor)
2061 showcursor = 0; 2079 showcursor = 0;
2062#endif 2080#endif
2149 { 2167 {
2150 int16_t nits; 2168 int16_t nits;
2151 int i = num_scr; 2169 int i = num_scr;
2152 int j; 2170 int j;
2153 int len, wlen; 2171 int len, wlen;
2154 dLocal (int, num_scr);
2155 2172
2156 j = nrow; 2173 j = nrow;
2157 wlen = len = -1; 2174 wlen = len = -1;
2158 row = i > 0 ? 0 : j - 1; 2175 row = i > 0 ? 0 : j - 1;
2159 2176
2546 { 2563 {
2547 if (transparent) 2564 if (transparent)
2548 XSetWindowBackgroundPixmap (dpy, scrollBar.win, ParentRelative); 2565 XSetWindowBackgroundPixmap (dpy, scrollBar.win, ParentRelative);
2549 else 2566 else
2550 XSetWindowBackground (dpy, scrollBar.win, pix_colors[Color_border]); 2567 XSetWindowBackground (dpy, scrollBar.win, pix_colors[Color_border]);
2551 scrollBar.state = STATE_IDLE; 2568 scrollBar.state = SB_STATE_IDLE;
2552 scrollBar.show (0); 2569 scrollBar.show (0);
2553 } 2570 }
2554 2571
2555 if (refresh) 2572 if (refresh)
2556 { 2573 {
2650 */ 2667 */
2651#if 0 2668#if 0
2652void 2669void
2653rxvt_term::scr_dump (int fd) NOTHROW 2670rxvt_term::scr_dump (int fd) NOTHROW
2654{ 2671{
2655 int row, wrote; 2672 // if this method is needed, it can be implemented by factoring the
2656 unsigned int width, towrite; 2673 // relevant code in scr_printscreen
2657 const char r1[] = "\n";
2658
2659 for (row = saveLines + top_row;
2660 row < saveLines + nrow - 1; row++)
2661 {
2662 width = row_buf[row].l >= 0 ? row_buf[row].l
2663 : ncol;
2664 for (towrite = width; towrite; towrite -= wrote)
2665 {
2666 wrote = write (fd, & (row_buf[row].t[width - towrite]),
2667 towrite);
2668 if (wrote < 0)
2669 return; /* XXX: death, no report */
2670 }
2671 if (row_buf[row].l >= 0)
2672 if (write (fd, r1, 1) <= 0)
2673 return; /* XXX: death, no report */
2674 }
2675} 2674}
2676#endif 2675#endif
2677 2676
2678/* ------------------------------------------------------------------------- * 2677/* ------------------------------------------------------------------------- *
2679 * CHARACTER SELECTION * 2678 * CHARACTER SELECTION *
2680 * ------------------------------------------------------------------------- */ 2679 * ------------------------------------------------------------------------- */
2681void 2680void
2682rxvt_term::selection_check (int check_more) NOTHROW 2681rxvt_term::selection_check (int check_more) NOTHROW
2683{ 2682{
2684 row_col_t pos;
2685
2686 if (!selection.op) 2683 if (!selection.op)
2687 return; 2684 return;
2688 2685
2689 pos.row = pos.col = 0;
2690 if (!IN_RANGE_EXC (selection.beg.row, top_row, nrow) 2686 if (!IN_RANGE_EXC (selection.beg.row, top_row, nrow)
2691 || !IN_RANGE_EXC (selection.mark.row, top_row, nrow) 2687 || !IN_RANGE_EXC (selection.mark.row, top_row, nrow)
2692 || !IN_RANGE_EXC (selection.end.row, top_row, nrow) 2688 || !IN_RANGE_EXC (selection.end.row, top_row, nrow)
2693 || (check_more == 1 2689 || (check_more == 1
2694 && current_screen == selection.screen 2690 && current_screen == selection.screen
2695 && !ROWCOL_IS_BEFORE (screen.cur, selection.beg) 2691 && !ROWCOL_IS_BEFORE (screen.cur, selection.beg)
2696 && ROWCOL_IS_BEFORE (screen.cur, selection.end)) 2692 && ROWCOL_IS_BEFORE (screen.cur, selection.end)))
2697 || (check_more == 2
2698 && ROWCOL_IS_BEFORE (selection.beg, pos)
2699 && ROWCOL_IS_AFTER (selection.end, pos))
2700 || (check_more == 3
2701 && ROWCOL_IS_AFTER (selection.end, pos))
2702 || (check_more == 4 /* screen width change */
2703 && (selection.beg.row != selection.end.row
2704 || selection.end.col > ncol)))
2705 CLEAR_SELECTION (); 2693 CLEAR_ALL_SELECTION ();
2706} 2694}
2707 2695
2708/* ------------------------------------------------------------------------- */ 2696/* ------------------------------------------------------------------------- */
2709/* 2697/*
2710 * Paste a selection direct to the command fd 2698 * Paste a selection direct to the command fd
2716 for (unsigned int i = 0; i < len; i++) 2704 for (unsigned int i = 0; i < len; i++)
2717 if (data[i] == C0_LF) 2705 if (data[i] == C0_LF)
2718 data[i] = C0_CR; 2706 data[i] = C0_CR;
2719 2707
2720 if (priv_modes & PrivMode_BracketPaste) 2708 if (priv_modes & PrivMode_BracketPaste)
2721 tt_printf ("\e[200~"); 2709 tt_printf ("\x1b[200~");
2722 2710
2723 tt_write (data, len); 2711 tt_write (data, len);
2724 2712
2725 if (priv_modes & PrivMode_BracketPaste) 2713 if (priv_modes & PrivMode_BracketPaste)
2726 tt_printf ("\e[201~"); 2714 tt_printf ("\x1b[201~");
2727} 2715}
2728 2716
2729void 2717void
2730rxvt_term::paste (char *data, unsigned int len) NOTHROW 2718rxvt_term::paste (char *data, unsigned int len) NOTHROW
2731{ 2719{

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines