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.391 by root, Sun Jul 10 00:39:53 2011 UTC vs.
Revision 1.414 by sf-exg, Tue Jan 24 17:05:05 2012 UTC

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))
682 else 687 else
683 scr_blank_screen_mem (l, rstyle); 688 scr_blank_screen_mem (l, rstyle);
684 } 689 }
685 690
686 // move and/or clear selection, if any 691 // move and/or clear selection, if any
687 if (selection.op && current_screen == selection.screen) 692 if (selection.op && current_screen == selection.screen
693 && selection.beg.row <= row2)
688 { 694 {
689 selection.beg.row -= count; 695 selection.beg.row -= count;
690 selection.end.row -= count; 696 selection.end.row -= count;
691 selection.mark.row -= count; 697 selection.mark.row -= count;
692 698
693 if (selection.beg.row < top_row 699 selection_check (0);
694 || selection.end.row < top_row
695 || selection.mark.row < top_row)
696 {
697 CLEAR_ALL_SELECTION ();
698 selection.op = SELECTION_CLEAR;
699 }
700 } 700 }
701 701
702 // finally move the view window, if desired 702 // finally move the view window, if desired
703 if (option (Opt_scrollWithBuffer) 703 if (option (Opt_scrollWithBuffer)
704 && view_start != 0 704 && view_start != 0
761 for (int row = 0; row < rows; row++) 761 for (int row = 0; row < rows; row++)
762 ROW(row1 + row) = temp_buf [row]; 762 ROW(row1 + row) = temp_buf [row];
763 763
764 // sever bottommost line 764 // sever bottommost line
765 { 765 {
766 line_t &l = ROW(row2 - 1); 766 line_t &l = ROW(row2);
767 l.is_longer (0); 767 l.is_longer (0);
768 l.touch (); 768 l.touch ();
769 } 769 }
770
771 } 770 }
772 771
773 return count; 772 return count;
774} 773}
775 774
781rxvt_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
782{ 781{
783 if (len <= 0) /* sanity */ 782 if (len <= 0) /* sanity */
784 return; 783 return;
785 784
786 unsigned char checksel; 785 bool checksel;
787 unicode_t c; 786 unicode_t c;
788 int ncol = this->ncol; 787 int ncol = this->ncol;
789 const wchar_t *strend = str + len; 788 const wchar_t *strend = str + len;
790 789
791 want_refresh = 1; 790 want_refresh = 1;
1313 scr_blank_line (line, col, num, rstyle); 1312 scr_blank_line (line, col, num, rstyle);
1314} 1313}
1315 1314
1316/* ------------------------------------------------------------------------- */ 1315/* ------------------------------------------------------------------------- */
1317/* 1316/*
1318 * Erase part of whole of the screen 1317 * Erase part or whole of the screen
1319 * XTERM_SEQ: Clear screen after cursor : ESC [ 0 J 1318 * XTERM_SEQ: Clear screen after cursor : ESC [ 0 J
1320 * XTERM_SEQ: Clear screen before cursor: ESC [ 1 J 1319 * XTERM_SEQ: Clear screen before cursor: ESC [ 1 J
1321 * XTERM_SEQ: Clear whole screen : ESC [ 2 J 1320 * XTERM_SEQ: Clear whole screen : ESC [ 2 J
1322 */ 1321 */
1323void 1322void
1332 ZERO_SCROLLBACK (); 1331 ZERO_SCROLLBACK ();
1333 1332
1334 switch (mode) 1333 switch (mode)
1335 { 1334 {
1336 case 0: /* erase to end of screen */ 1335 case 0: /* erase to end of screen */
1337 selection_check (1);
1338 scr_erase_line (0); 1336 scr_erase_line (0);
1339 row = screen.cur.row + 1; /* possible OOB */ 1337 row = screen.cur.row + 1; /* possible OOB */
1340 num = nrow - row; 1338 num = nrow - row;
1341 break; 1339 break;
1342 case 1: /* erase to beginning of screen */ 1340 case 1: /* erase to beginning of screen */
1343 selection_check (3);
1344 scr_erase_line (1); 1341 scr_erase_line (1);
1345 row = 0; 1342 row = 0;
1346 num = screen.cur.row; 1343 num = screen.cur.row;
1347 break; 1344 break;
1348 case 2: /* erase whole screen */ 1345 case 2: /* erase whole screen */
1349 selection_check (3);
1350 row = 0; 1346 row = 0;
1351 num = nrow; 1347 num = nrow;
1352 break; 1348 break;
1353 default: 1349 default:
1354 return; 1350 return;
1371 { 1367 {
1372 ren = DEFAULT_RSTYLE; 1368 ren = DEFAULT_RSTYLE;
1373 1369
1374 if (mapped) 1370 if (mapped)
1375 XClearArea (dpy, vt, 0, 1371 XClearArea (dpy, vt, 0,
1376 Row2Pixel (row - view_start), (unsigned int)width, 1372 Row2Pixel (row - view_start), (unsigned int)vt_width,
1377 (unsigned int)Height2Pixel (num), False); 1373 (unsigned int)Height2Pixel (num), False);
1378 } 1374 }
1379 else 1375 else
1380 { 1376 {
1381 ren = rstyle & (RS_fgMask | RS_bgMask); 1377 ren = rstyle & (RS_fgMask | RS_bgMask);
1384 { 1380 {
1385 gcvalue.foreground = pix_colors[bgcolor_of (rstyle)]; 1381 gcvalue.foreground = pix_colors[bgcolor_of (rstyle)];
1386 XChangeGC (dpy, gc, GCForeground, &gcvalue); 1382 XChangeGC (dpy, gc, GCForeground, &gcvalue);
1387 XFillRectangle (dpy, vt, gc, 1383 XFillRectangle (dpy, vt, gc,
1388 0, Row2Pixel (row - view_start), 1384 0, Row2Pixel (row - view_start),
1389 (unsigned int)width, 1385 (unsigned int)vt_width,
1390 (unsigned int)Height2Pixel (num)); 1386 (unsigned int)Height2Pixel (num));
1391 gcvalue.foreground = pix_colors[Color_fg]; 1387 gcvalue.foreground = pix_colors[Color_fg];
1392 XChangeGC (dpy, gc, GCForeground, &gcvalue); 1388 XChangeGC (dpy, gc, GCForeground, &gcvalue);
1393 } 1389 }
1394 } 1390 }
1425 1421
1426 want_refresh = 1; 1422 want_refresh = 1;
1427 ZERO_SCROLLBACK (); 1423 ZERO_SCROLLBACK ();
1428 1424
1429 num_scr_allow = 0; 1425 num_scr_allow = 0;
1430 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 ();
1431 1431
1432 fs = SET_FONT (rstyle, FONTSET (rstyle)->find_font ('E')); 1432 fs = SET_FONT (rstyle, FONTSET (rstyle)->find_font ('E'));
1433 for (int row = nrow; row--; ) 1433 for (int row = nrow; row--; )
1434 { 1434 {
1435 line_t &line = ROW(row); 1435 line_t &line = ROW(row);
1876 * Refresh the entire screen 1876 * Refresh the entire screen
1877 */ 1877 */
1878void 1878void
1879rxvt_term::scr_touch (bool refresh) NOTHROW 1879rxvt_term::scr_touch (bool refresh) NOTHROW
1880{ 1880{
1881 scr_expose (0, 0, width, height, refresh); 1881 scr_expose (0, 0, vt_width, vt_height, refresh);
1882} 1882}
1883 1883
1884/* ------------------------------------------------------------------------- */ 1884/* ------------------------------------------------------------------------- */
1885/* 1885/*
1886 * 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
2048 * A: set up vars 2048 * A: set up vars
2049 */ 2049 */
2050 refresh_count = 0; 2050 refresh_count = 0;
2051 2051
2052 unsigned int old_screen_flags = screen.flags; 2052 unsigned int old_screen_flags = screen.flags;
2053 char have_bg = 0; 2053 bool have_bg = 0;
2054#ifdef HAVE_BG_PIXMAP 2054#ifdef HAVE_BG_PIXMAP
2055 have_bg = bg_pixmap != None; 2055 have_bg = bg_pixmap != None;
2056#endif 2056#endif
2057 ocrow = oldcursor.row; /* is there an old outline cursor on screen? */ 2057 ocrow = oldcursor.row; /* is there an old outline cursor on screen? */
2058 2058
2064 HOOK_INVOKE ((this, HOOK_REFRESH_BEGIN, DT_END)); 2064 HOOK_INVOKE ((this, HOOK_REFRESH_BEGIN, DT_END));
2065#if ENABLE_OVERLAY 2065#if ENABLE_OVERLAY
2066 scr_swap_overlay (); 2066 scr_swap_overlay ();
2067#endif 2067#endif
2068 2068
2069 char showcursor = screen.flags & Screen_VisibleCursor; 2069 bool showcursor = screen.flags & Screen_VisibleCursor;
2070 2070
2071 /* 2071 /*
2072 * C: set the cursor character (s) 2072 * C: set the cursor character (s)
2073 */ 2073 */
2074 { 2074 {
2075 unsigned char setoldcursor; 2075 bool setoldcursor;
2076 2076
2077#ifdef CURSOR_BLINK 2077#ifdef CURSOR_BLINK
2078 if (hidden_cursor) 2078 if (hidden_cursor)
2079 showcursor = 0; 2079 showcursor = 0;
2080#endif 2080#endif
2167 { 2167 {
2168 int16_t nits; 2168 int16_t nits;
2169 int i = num_scr; 2169 int i = num_scr;
2170 int j; 2170 int j;
2171 int len, wlen; 2171 int len, wlen;
2172 dLocal (int, num_scr);
2173 2172
2174 j = nrow; 2173 j = nrow;
2175 wlen = len = -1; 2174 wlen = len = -1;
2176 row = i > 0 ? 0 : j - 1; 2175 row = i > 0 ? 0 : j - 1;
2177 2176
2482 2481
2483 XDrawRectangle (dpy, vt, gc, 2482 XDrawRectangle (dpy, vt, gc,
2484 Col2Pixel (col), 2483 Col2Pixel (col),
2485 Row2Pixel (oldcursor.row), 2484 Row2Pixel (oldcursor.row),
2486 (unsigned int) (Width2Pixel (cursorwidth) - 1), 2485 (unsigned int) (Width2Pixel (cursorwidth) - 1),
2487 (unsigned int) (Height2Pixel (1) - lineSpace - 1)); 2486 (unsigned int) (Height2Pixel (1) - 1));
2488 } 2487 }
2489 } 2488 }
2490 2489
2491 /* 2490 /*
2492 * H: cleanup selection 2491 * H: cleanup selection
2564 { 2563 {
2565 if (transparent) 2564 if (transparent)
2566 XSetWindowBackgroundPixmap (dpy, scrollBar.win, ParentRelative); 2565 XSetWindowBackgroundPixmap (dpy, scrollBar.win, ParentRelative);
2567 else 2566 else
2568 XSetWindowBackground (dpy, scrollBar.win, pix_colors[Color_border]); 2567 XSetWindowBackground (dpy, scrollBar.win, pix_colors[Color_border]);
2569 scrollBar.state = STATE_IDLE; 2568 scrollBar.state = SB_STATE_IDLE;
2570 scrollBar.show (0); 2569 scrollBar.show (0);
2571 } 2570 }
2572 2571
2573 if (refresh) 2572 if (refresh)
2574 { 2573 {
2668 */ 2667 */
2669#if 0 2668#if 0
2670void 2669void
2671rxvt_term::scr_dump (int fd) NOTHROW 2670rxvt_term::scr_dump (int fd) NOTHROW
2672{ 2671{
2673 int row, wrote; 2672 // if this method is needed, it can be implemented by factoring the
2674 unsigned int width, towrite; 2673 // relevant code in scr_printscreen
2675 const char r1[] = "\n";
2676
2677 for (row = saveLines + top_row;
2678 row < saveLines + nrow - 1; row++)
2679 {
2680 width = row_buf[row].l >= 0 ? row_buf[row].l
2681 : ncol;
2682 for (towrite = width; towrite; towrite -= wrote)
2683 {
2684 wrote = write (fd, & (row_buf[row].t[width - towrite]),
2685 towrite);
2686 if (wrote < 0)
2687 return; /* XXX: death, no report */
2688 }
2689 if (row_buf[row].l >= 0)
2690 if (write (fd, r1, 1) <= 0)
2691 return; /* XXX: death, no report */
2692 }
2693} 2674}
2694#endif 2675#endif
2695 2676
2696/* ------------------------------------------------------------------------- * 2677/* ------------------------------------------------------------------------- *
2697 * CHARACTER SELECTION * 2678 * CHARACTER SELECTION *
2698 * ------------------------------------------------------------------------- */ 2679 * ------------------------------------------------------------------------- */
2699void 2680void
2700rxvt_term::selection_check (int check_more) NOTHROW 2681rxvt_term::selection_check (int check_more) NOTHROW
2701{ 2682{
2702 row_col_t pos;
2703
2704 if (!selection.op) 2683 if (!selection.op)
2705 return; 2684 return;
2706 2685
2707 pos.row = pos.col = 0;
2708 if (!IN_RANGE_EXC (selection.beg.row, top_row, nrow) 2686 if (!IN_RANGE_EXC (selection.beg.row, top_row, nrow)
2709 || !IN_RANGE_EXC (selection.mark.row, top_row, nrow) 2687 || !IN_RANGE_EXC (selection.mark.row, top_row, nrow)
2710 || !IN_RANGE_EXC (selection.end.row, top_row, nrow) 2688 || !IN_RANGE_EXC (selection.end.row, top_row, nrow)
2711 || (check_more == 1 2689 || (check_more == 1
2712 && current_screen == selection.screen 2690 && current_screen == selection.screen
2713 && !ROWCOL_IS_BEFORE (screen.cur, selection.beg) 2691 && !ROWCOL_IS_BEFORE (screen.cur, selection.beg)
2714 && ROWCOL_IS_BEFORE (screen.cur, selection.end)) 2692 && ROWCOL_IS_BEFORE (screen.cur, selection.end)))
2715 || (check_more == 2
2716 && ROWCOL_IS_BEFORE (selection.beg, pos)
2717 && ROWCOL_IS_AFTER (selection.end, pos))
2718 || (check_more == 3
2719 && ROWCOL_IS_AFTER (selection.end, pos))
2720 || (check_more == 4 /* screen width change */
2721 && (selection.beg.row != selection.end.row
2722 || selection.end.col > ncol)))
2723 CLEAR_SELECTION (); 2693 CLEAR_ALL_SELECTION ();
2724} 2694}
2725 2695
2726/* ------------------------------------------------------------------------- */ 2696/* ------------------------------------------------------------------------- */
2727/* 2697/*
2728 * Paste a selection direct to the command fd 2698 * Paste a selection direct to the command fd
2734 for (unsigned int i = 0; i < len; i++) 2704 for (unsigned int i = 0; i < len; i++)
2735 if (data[i] == C0_LF) 2705 if (data[i] == C0_LF)
2736 data[i] = C0_CR; 2706 data[i] = C0_CR;
2737 2707
2738 if (priv_modes & PrivMode_BracketPaste) 2708 if (priv_modes & PrivMode_BracketPaste)
2739 tt_printf ("\e[200~"); 2709 tt_printf ("\x1b[200~");
2740 2710
2741 tt_write (data, len); 2711 tt_write (data, len);
2742 2712
2743 if (priv_modes & PrivMode_BracketPaste) 2713 if (priv_modes & PrivMode_BracketPaste)
2744 tt_printf ("\e[201~"); 2714 tt_printf ("\x1b[201~");
2745} 2715}
2746 2716
2747void 2717void
2748rxvt_term::paste (char *data, unsigned int len) NOTHROW 2718rxvt_term::paste (char *data, unsigned int len) NOTHROW
2749{ 2719{

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines