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.211 by root, Fri Jan 6 01:16:58 2006 UTC vs.
Revision 1.223 by root, Wed Jan 11 18:54:30 2006 UTC

1/*--------------------------------*-C-*--------------------------------------* 1/*--------------------------------*-C-*--------------------------------------*
2 * File: screen.C 2 * File: screen.C
3 *---------------------------------------------------------------------------* 3 *---------------------------------------------------------------------------*
4 * 4 *
5 * Copyright (c) 1997-2001 Geoff Wing <gcw@pobox.com> 5 * Copyright (c) 1997-2001 Geoff Wing <gcw@pobox.com>
6 * Copyright (c) 2003-2004 Marc Lehmann <pcg@goof.com> 6 * Copyright (c) 2003-2006 Marc Lehmann <pcg@goof.com>
7 * 7 *
8 * This program is free software; you can redistribute it and/or modify 8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by 9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or 10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version. 11 * (at your option) any later version.
145/* Fill a full line with blanks - make sure it is allocated first */ 145/* Fill a full line with blanks - make sure it is allocated first */
146void 146void
147rxvt_term::scr_blank_screen_mem (line_t &l, rend_t efs) 147rxvt_term::scr_blank_screen_mem (line_t &l, rend_t efs)
148{ 148{
149 scr_blank_line (l, 0, ncol, efs); 149 scr_blank_line (l, 0, ncol, efs);
150
151 l.l = 0;
152 l.f = 0;
150} 153}
151 154
152/* ------------------------------------------------------------------------- * 155/* ------------------------------------------------------------------------- *
153 * SCREEN INITIALISATION * 156 * SCREEN INITIALISATION *
154 * ------------------------------------------------------------------------- */ 157 * ------------------------------------------------------------------------- */
191 194
192 if (!row_buf) 195 if (!row_buf)
193 { 196 {
194 /* 197 /*
195 * first time called so just malloc everything: don't rely on realloc 198 * first time called so just malloc everything: don't rely on realloc
196 * Note: this is still needed so that all the scrollback lines are NULL
197 */ 199 */
198 nsaved = 0; /* no saved lines */ 200 nsaved = 0; /* no saved lines */
199 term_start = 0; 201 term_start = 0;
200 202
201 talloc = new rxvt_salloc (ncol * sizeof (text_t)); 203 talloc = new rxvt_salloc (ncol * sizeof (text_t));
202 ralloc = new rxvt_salloc (ncol * sizeof (rend_t)); 204 ralloc = new rxvt_salloc (ncol * sizeof (rend_t));
203 205
204 row_buf = (line_t *)rxvt_calloc (total_rows, sizeof (line_t)); 206 row_buf = (line_t *)rxvt_calloc (total_rows + nrow, sizeof (line_t));
205 temp_buf = (line_t *)rxvt_calloc (total_rows, sizeof (line_t));
206 drawn_buf = (line_t *)rxvt_calloc (nrow , sizeof (line_t)); 207 drawn_buf = (line_t *)rxvt_calloc (nrow , sizeof (line_t));
207 swap_buf = (line_t *)rxvt_calloc (nrow , sizeof (line_t)); 208 swap_buf = (line_t *)rxvt_calloc (nrow , sizeof (line_t));
208 209
209 for (int row = nrow; row--; ) 210 for (int row = nrow; row--; )
210 { 211 {
211 scr_blank_screen_mem (ROW (row), DEFAULT_RSTYLE); 212 scr_blank_screen_mem (ROW (row), DEFAULT_RSTYLE);
212 scr_blank_screen_mem (swap_buf [row], DEFAULT_RSTYLE); 213 scr_blank_screen_mem (swap_buf [row], DEFAULT_RSTYLE);
257 } 258 }
258 } 259 }
259#endif 260#endif
260 261
261 drawn_buf = (line_t *)rxvt_realloc (drawn_buf, nrow * sizeof (line_t)); 262 drawn_buf = (line_t *)rxvt_realloc (drawn_buf, nrow * sizeof (line_t));
262 temp_buf = (line_t *)rxvt_realloc (temp_buf , nrow * sizeof (line_t));
263 swap_buf = (line_t *)rxvt_realloc (swap_buf , nrow * sizeof (line_t)); 263 swap_buf = (line_t *)rxvt_realloc (swap_buf , nrow * sizeof (line_t));
264 264
265 for (int row = min (nrow, prev_nrow); row--; ) 265 for (int row = min (nrow, prev_nrow); row--; )
266 { 266 {
267 lresize (drawn_buf[row]); 267 lresize (drawn_buf[row]);
272 { 272 {
273 swap_buf [row].clear (); scr_blank_screen_mem (swap_buf [row], DEFAULT_RSTYLE); 273 swap_buf [row].clear (); scr_blank_screen_mem (swap_buf [row], DEFAULT_RSTYLE);
274 drawn_buf[row].clear (); scr_blank_screen_mem (drawn_buf[row], DEFAULT_RSTYLE); 274 drawn_buf[row].clear (); scr_blank_screen_mem (drawn_buf[row], DEFAULT_RSTYLE);
275 } 275 }
276 276
277 line_t *old_buf = row_buf;
277 line_t *old_buf = row_buf; row_buf = (line_t *)rxvt_calloc (total_rows, sizeof (line_t)); 278 row_buf = (line_t *)rxvt_calloc (total_rows + nrow, sizeof (line_t));
278 279
279 int p = MOD (term_start + prev_nrow, prev_total_rows); // previous row 280 int p = MOD (term_start + prev_nrow, prev_total_rows); // previous row
280 int pend = MOD (term_start - nsaved , prev_total_rows); 281 int pend = MOD (term_start - nsaved , prev_total_rows);
281 int q = total_rows; // rewrapped row 282 int q = total_rows; // rewrapped row
282 283
430 delete ralloc; ralloc = 0; 431 delete ralloc; ralloc = 0;
431 432
432 free (row_buf); 433 free (row_buf);
433 free (swap_buf); 434 free (swap_buf);
434 free (drawn_buf); 435 free (drawn_buf);
435 free (temp_buf);
436 free (tabs); 436 free (tabs);
437 437
438 row_buf = 0; // signal that we freed all the arrays 438 row_buf = 0; // signal that we freed all the arrays
439} 439}
440 440
572 * Change the colour for following text 572 * Change the colour for following text
573 */ 573 */
574void 574void
575rxvt_term::scr_color (unsigned int color, int fgbg) 575rxvt_term::scr_color (unsigned int color, int fgbg)
576{ 576{
577 if (color > maxTermCOLOR) 577 if (!IN_RANGE_INC (color, minCOLOR, maxTermCOLOR))
578 color = fgbg; 578 color = fgbg;
579 579
580 if (fgbg == Color_fg) 580 if (fgbg == Color_fg)
581 rstyle = SET_FGCOLOR (rstyle, color); 581 rstyle = SET_FGCOLOR (rstyle, color);
582 else 582 else
639 } 639 }
640 } 640 }
641 641
642 for (int i = count; i--; ) 642 for (int i = count; i--; )
643 { 643 {
644 ROW(row2 - i).l = 0; 644 // basically thi is a slightly optimized scr_blank_screen_mem
645 scr_blank_screen_mem (ROW(row2 - i), rstyle); 645 // it is worth the effort on slower machines
646 line_t &l = ROW(row2 - i);
647
648 scr_blank_line (l, 0, l.l, rstyle);
649
650 l.l = 0;
651 l.f = 0;
646 } 652 }
647 653
648 if (OPTION (Opt_scrollWithBuffer) 654 if (OPTION (Opt_scrollWithBuffer)
649 && view_start != 0 655 && view_start != 0
650 && view_start != saveLines) 656 && view_start != saveLines)
680 686
681 int rows = row2 - row1 + 1; 687 int rows = row2 - row1 + 1;
682 688
683 min_it (count, rows); 689 min_it (count, rows);
684 690
691 line_t *temp_buf = row_buf + total_rows;
692
685 for (int row = 0; row < rows; row++) 693 for (int row = 0; row < rows; row++)
686 { 694 {
687 temp_buf [row] = ROW(row1 + (row + count + rows) % rows); 695 temp_buf [row] = ROW(row1 + (row + count + rows) % rows);
688 696
689 if (!IN_RANGE_EXC (row + count, 0, rows)) 697 if (!IN_RANGE_EXC (row + count, 0, rows))
700/* ------------------------------------------------------------------------- */ 708/* ------------------------------------------------------------------------- */
701/* 709/*
702 * Add text given in <str> of length <len> to screen struct 710 * Add text given in <str> of length <len> to screen struct
703 */ 711 */
704void 712void
705rxvt_term::scr_add_lines (const unicode_t *str, int nlines, int len) 713rxvt_term::scr_add_lines (const wchar_t *str, int len, int minlines)
706{ 714{
707 if (len <= 0) /* sanity */ 715 if (len <= 0) /* sanity */
708 return; 716 return;
709 717
710 unsigned char checksel; 718 unsigned char checksel;
711 unicode_t c; 719 unicode_t c;
712 int ncol = this->ncol; 720 int ncol = this->ncol;
713 const unicode_t *strend = str + len; 721 const wchar_t *strend = str + len;
714 722
715 want_refresh = 1; 723 want_refresh = 1;
716 ZERO_SCROLLBACK (); 724 ZERO_SCROLLBACK ();
717 725
718 if (nlines > 0) 726 if (minlines > 0)
719 { 727 {
720 nlines += screen.cur.row - screen.bscroll; 728 minlines += screen.cur.row - screen.bscroll;
721 729
722 if (nlines > 0 730 if (minlines > 0
723 && screen.tscroll == 0 731 && screen.tscroll == 0
724 && screen.bscroll == nrow - 1) 732 && screen.bscroll == nrow - 1)
725 { 733 {
726 /* _at least_ this many lines need to be scrolled */ 734 /* _at least_ this many lines need to be scrolled */
727 scr_scroll_text (screen.tscroll, screen.bscroll, nlines); 735 scr_scroll_text (screen.tscroll, screen.bscroll, minlines);
728 screen.cur.row -= nlines; 736 screen.cur.row -= minlines;
729 } 737 }
730 } 738 }
731 739
732#ifdef DEBUG_STRICT 740#ifdef DEBUG_STRICT
733 assert (screen.cur.col < ncol); 741 assert (screen.cur.col < ncol);
740 748
741 line_t *line = &ROW(row); 749 line_t *line = &ROW(row);
742 750
743 while (str < strend) 751 while (str < strend)
744 { 752 {
745 c = *str++; 753 c = (unicode_t)*str++; // convert to rxvt-unicodes representation
746 754
747 if (c < 0x20) 755 if (c < 0x20)
748 if (c == C0_LF) 756 if (c == C0_LF)
749 { 757 {
750 max_it (line->l, screen.cur.col); 758 max_it (line->l, screen.cur.col);
1303 XChangeGC (display->display, gc, GCForeground, &gcvalue); 1311 XChangeGC (display->display, gc, GCForeground, &gcvalue);
1304 } 1312 }
1305 1313
1306 for (; num--; row++) 1314 for (; num--; row++)
1307 { 1315 {
1308 line_t &l = ROW(row);
1309 l.l = 0;
1310 l.is_longer (0);
1311 scr_blank_screen_mem (l, rstyle); 1316 scr_blank_screen_mem (ROW(row), rstyle);
1312 scr_blank_line (drawn_buf [row], 0, ncol, ren); 1317 scr_blank_line (drawn_buf [row], 0, ncol, ren);
1313 } 1318 }
1314} 1319}
1315 1320
1316#if ENABLE_FRILLS 1321#if ENABLE_FRILLS
1858# endif 1863# endif
1859 1864
1860 if (OPTION (Opt_visualBell)) 1865 if (OPTION (Opt_visualBell))
1861 { 1866 {
1862 scr_rvideo_mode (!rvideo); /* refresh also done */ 1867 scr_rvideo_mode (!rvideo); /* refresh also done */
1868 display->flush ();
1863 rxvt_usleep (VISUAL_BELL_DURATION); 1869 rxvt_usleep (VISUAL_BELL_DURATION);
1864 scr_rvideo_mode (!rvideo); /* refresh also done */ 1870 scr_rvideo_mode (!rvideo); /* refresh also done */
1865 } 1871 }
1866 else 1872 else
1867 XBell (display->display, 0); 1873 XBell (display->display, 0);
2375 /* 2381 /*
2376 * H: cleanup selection 2382 * H: cleanup selection
2377 */ 2383 */
2378 scr_reverse_selection (); 2384 scr_reverse_selection ();
2379 2385
2380 if (refresh_type & SMOOTH_REFRESH)
2381 XFlush (display->display);
2382
2383 num_scr = 0; 2386 num_scr = 0;
2384 num_scr_allow = 1; 2387 num_scr_allow = 1;
2385} 2388}
2386 2389
2387void 2390void
2388rxvt_term::scr_remap_chars (line_t &l) 2391rxvt_term::scr_remap_chars (line_t &l)
2389{ 2392{
2390 if (!l.t) 2393 if (!l.t)
2391 return; 2394 return;
2392 2395
2393 l.touch (); // maybe a bit of an overkill, but its not performance-relevant 2396 l.touch (); // maybe a bit of an overkill, but it's not performance-relevant
2394 2397
2395 for (int i = ncol; i--; ) 2398 for (int i = ncol; i--; )
2396 l.r[i] = SET_FONT (l.r[i], FONTSET (l.r[i])->find_font (l.t[i])); 2399 l.r[i] = SET_FONT (l.r[i], FONTSET (l.r[i])->find_font (l.t[i]));
2397} 2400}
2398 2401
2451 2454
2452 if (really) 2455 if (really)
2453 XClearWindow (display->display, vt); 2456 XClearWindow (display->display, vt);
2454} 2457}
2455 2458
2459void
2460rxvt_term::scr_xor_rect (int beg_row, int beg_col, int end_row, int end_col, rend_t rstyle1, rend_t rstyle2)
2461{
2462 int view_end = -view_start + nrow;
2463 int row, col;
2464
2465 for (row = max (beg_row, -view_start); row <= min (end_row, view_end); row++)
2466 {
2467 text_t *stp = ROW(row).t;
2468 rend_t *srp = ROW(row).r;
2469
2470 for (col = beg_col; col < end_col; col++)
2471 srp[col] ^= rstyle1;
2472
2473 while (col-- > beg_col && (stp[col] == NOCHAR || unicode::is_space (stp[col])))
2474 srp[col] ^= rstyle2;
2475
2476 if (++col < end_col)
2477 srp[col] ^= rstyle2;
2478 }
2479}
2480
2481void
2482rxvt_term::scr_xor_span (int beg_row, int beg_col, int end_row, int end_col, rend_t rstyle)
2483{
2484 int view_end = -view_start + nrow;
2485 int row, col;
2486
2487 if (beg_row >= -view_start)
2488 {
2489 col = beg_col;
2490 row = beg_row;
2491 }
2492 else
2493 {
2494 col = 0;
2495 row = -view_start;
2496 }
2497
2498 for (; row < min (end_row, view_end); row++, col = 0)
2499 for (rend_t *srp = ROW(row).r; col < ncol; col++)
2500 srp[col] ^= rstyle;
2501
2502 if (row == end_row)
2503 for (rend_t *srp = ROW(row).r; col < end_col; col++)
2504 srp[col] ^= rstyle;
2505}
2506
2456/* ------------------------------------------------------------------------- */ 2507/* ------------------------------------------------------------------------- */
2457void 2508void
2458rxvt_term::scr_reverse_selection () 2509rxvt_term::scr_reverse_selection ()
2459{ 2510{
2460 if (selection.op 2511 if (selection.op
2461 && current_screen == selection.screen 2512 && current_screen == selection.screen
2462 && selection.end.row >= -view_start) 2513 && selection.end.row >= -view_start)
2463 { 2514 {
2464 int view_end = -view_start + nrow;
2465 int row, col;
2466
2467#if ENABLE_FRILLS 2515#if ENABLE_FRILLS
2468 if (selection.rect) 2516 if (selection.rect)
2469 { 2517 scr_xor_rect (selection.beg.row, selection.beg.col,
2470 for (row = max (selection.beg.row, -view_start); row <= min (selection.end.row, view_end); row++) 2518 selection.end.row, selection.end.col,
2471 { 2519 RS_RVid, RS_RVid | RS_Uline);
2472 text_t *stp = ROW(row).t;
2473 rend_t *srp = ROW(row).r;
2474
2475 for (col = selection.beg.col; col < selection.end.col; col++)
2476 srp[col] ^= RS_RVid;
2477
2478 while (col-- > selection.beg.col && (stp[col] == NOCHAR || unicode::is_space (stp[col])))
2479 srp[col] ^= RS_RVid | RS_Uline;
2480
2481 if (++col < selection.end.col)
2482 srp[col] ^= RS_RVid | RS_Uline;
2483 }
2484 }
2485 else 2520 else
2486#endif 2521#endif
2487 { 2522 scr_xor_span (selection.beg.row, selection.beg.col,
2488 if (selection.beg.row >= -view_start) 2523 selection.end.row, selection.end.col,
2489 { 2524 RS_RVid);
2490 col = selection.beg.col;
2491 row = selection.beg.row;
2492 }
2493 else
2494 {
2495 col = 0;
2496 row = -view_start;
2497 }
2498
2499 for (; row < min (selection.end.row, view_end); row++, col = 0)
2500 for (rend_t *srp = ROW(row).r; col < ncol; col++)
2501 srp[col] ^= RS_RVid;
2502
2503 if (row == selection.end.row)
2504 for (rend_t *srp = ROW(row).r; col < selection.end.col; col++)
2505 srp[col] ^= RS_RVid;
2506 }
2507 } 2525 }
2508} 2526}
2509 2527
2510/* ------------------------------------------------------------------------- */ 2528/* ------------------------------------------------------------------------- */
2511/* 2529/*

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines