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.385 by sf-exg, Wed Jul 6 00:40:10 2011 UTC vs.
Revision 1.414 by sf-exg, Tue Jan 24 17:05:05 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
455 scr_clear (true); 455 scr_clear (true);
456 scr_refresh (); 456 scr_refresh ();
457} 457}
458 458
459void 459void
460rxvt_term::scr_soft_reset () 460rxvt_term::scr_soft_reset () NOTHROW
461{ 461{
462 /* only affects modes, nothing drastic such as clearing the screen */ 462 /* only affects modes, nothing drastic such as clearing the screen */
463#if ENABLE_OVERLAY 463#if ENABLE_OVERLAY
464 scr_overlay_off (); 464 scr_overlay_off ();
465#endif 465#endif
520 assert (s->cur.row >= 0); 520 assert (s->cur.row >= 0);
521 assert (s->cur.col >= 0); 521 assert (s->cur.col >= 0);
522} 522}
523 523
524void 524void
525rxvt_term::scr_swap_screen () 525rxvt_term::scr_swap_screen () NOTHROW
526{ 526{
527 if (!option (Opt_secondaryScreen)) 527 if (!option (Opt_secondaryScreen))
528 return; 528 return;
529 529
530 for (int i = prev_nrow; i--; ) 530 for (int i = prev_nrow; i--; )
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))
631rxvt_term::scr_scroll_text (int row1, int row2, int count) NOTHROW 636rxvt_term::scr_scroll_text (int row1, int row2, int count) NOTHROW
632{ 637{
633 if (count == 0 || (row1 > row2)) 638 if (count == 0 || (row1 > row2))
634 return 0; 639 return 0;
635 640
636 int rows = row2 - row1 + 1;
637
638 min_it (count, rows);
639
640 want_refresh = 1; 641 want_refresh = 1;
641 num_scr += count; 642 num_scr += count;
642 643
643 if (count > 0 644 if (count > 0
644 && row1 == 0 645 && row1 == 0
645 && (current_screen == PRIMARY || option (Opt_secondaryScroll))) 646 && (current_screen == PRIMARY || option (Opt_secondaryScroll)))
646 { 647 {
648 min_it (count, total_rows - (nrow - (row2 + 1)));
649
647 top_row = max (top_row - count, -saveLines); 650 top_row = max (top_row - count, -saveLines);
648
649 // scroll everything up 'count' lines
650 term_start = (term_start + count) % total_rows;
651 651
652 // sever bottommost line 652 // sever bottommost line
653 { 653 {
654 line_t &l = ROW(row2 - count); 654 line_t &l = ROW(row2);
655 l.is_longer (0); 655 l.is_longer (0);
656 l.touch (); 656 l.touch ();
657 } 657 }
658 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
659 // erase newly scrolled-in lines 674 // erase newly scrolled-in lines
660 for (int i = count; i--; ) 675 for (int i = count; i--; )
661 { 676 {
662 line_t &l = ROW(nrow - 1 - i); 677 line_t &l = ROW(row2 - i);
663 678
664 // optimize if already cleared, can be significant on slow machines 679 // optimise if already cleared, can be significant on slow machines
665 // could be rolled into scr_blank_screen_mem 680 // could be rolled into scr_blank_screen_mem
666 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)))
667 { 682 {
668 scr_blank_line (l, 0, l.l, rstyle); 683 scr_blank_line (l, 0, l.l, rstyle);
669 l.l = 0; 684 l.l = 0;
671 } 686 }
672 else 687 else
673 scr_blank_screen_mem (l, rstyle); 688 scr_blank_screen_mem (l, rstyle);
674 } 689 }
675 690
676 // now copy lines below the scroll region bottom to the
677 // bottom of the screen again, so they look as if they
678 // hadn't moved.
679 for (int i = nrow; --i > row2; )
680 {
681 line_t &l1 = ROW(i - count);
682 line_t &l2 = ROW(i);
683
684 ::swap (l1, l2);
685 l2.touch ();
686 }
687
688 // move and/or clear selection, if any 691 // move and/or clear selection, if any
689 if (selection.op && current_screen == selection.screen) 692 if (selection.op && current_screen == selection.screen
693 && selection.beg.row <= row2)
690 { 694 {
691 selection.beg.row -= count; 695 selection.beg.row -= count;
692 selection.end.row -= count; 696 selection.end.row -= count;
693 selection.mark.row -= count; 697 selection.mark.row -= count;
694 698
695 if (selection.beg.row < top_row 699 selection_check (0);
696 || selection.end.row < top_row
697 || selection.mark.row < top_row)
698 {
699 CLEAR_ALL_SELECTION ();
700 selection.op = SELECTION_CLEAR;
701 }
702 } 700 }
703 701
704 // finally move the view window, if desired 702 // finally move the view window, if desired
705 if (option (Opt_scrollWithBuffer) 703 if (option (Opt_scrollWithBuffer)
706 && view_start != 0 704 && view_start != 0
736 } 734 }
737 735
738 // use a simple and robust scrolling algorithm, this 736 // use a simple and robust scrolling algorithm, this
739 // part of scr_scroll_text is not time-critical. 737 // part of scr_scroll_text is not time-critical.
740 738
741 line_t *temp_buf = row_buf + total_rows; 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
747 int rows = row2 - row1 + 1;
748
749 min_it (count, rows);
750
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
2464 2481
2465 XDrawRectangle (dpy, vt, gc, 2482 XDrawRectangle (dpy, vt, gc,
2466 Col2Pixel (col), 2483 Col2Pixel (col),
2467 Row2Pixel (oldcursor.row), 2484 Row2Pixel (oldcursor.row),
2468 (unsigned int) (Width2Pixel (cursorwidth) - 1), 2485 (unsigned int) (Width2Pixel (cursorwidth) - 1),
2469 (unsigned int) (Height2Pixel (1) - lineSpace - 1)); 2486 (unsigned int) (Height2Pixel (1) - 1));
2470 } 2487 }
2471 } 2488 }
2472 2489
2473 /* 2490 /*
2474 * H: cleanup selection 2491 * H: cleanup selection
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