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.216 by root, Mon Jan 9 18:51:19 2006 UTC vs.
Revision 1.227 by root, Sun Jan 15 05:14:12 2006 UTC

194 194
195 if (!row_buf) 195 if (!row_buf)
196 { 196 {
197 /* 197 /*
198 * 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
199 * Note: this is still needed so that all the scrollback lines are NULL
200 */ 199 */
201 nsaved = 0; /* no saved lines */ 200 nsaved = 0; /* no saved lines */
202 term_start = 0; 201 term_start = 0;
203 202
204 talloc = new rxvt_salloc (ncol * sizeof (text_t)); 203 talloc = new rxvt_salloc (ncol * sizeof (text_t));
205 ralloc = new rxvt_salloc (ncol * sizeof (rend_t)); 204 ralloc = new rxvt_salloc (ncol * sizeof (rend_t));
206 205
207 row_buf = (line_t *)rxvt_calloc (total_rows, sizeof (line_t)); 206 row_buf = (line_t *)rxvt_calloc (total_rows + nrow, sizeof (line_t));
208 temp_buf = (line_t *)rxvt_calloc (total_rows, sizeof (line_t));
209 drawn_buf = (line_t *)rxvt_calloc (nrow , sizeof (line_t)); 207 drawn_buf = (line_t *)rxvt_calloc (nrow , sizeof (line_t));
210 swap_buf = (line_t *)rxvt_calloc (nrow , sizeof (line_t)); 208 swap_buf = (line_t *)rxvt_calloc (nrow , sizeof (line_t));
211 209
212 for (int row = nrow; row--; ) 210 for (int row = nrow; row--; )
213 { 211 {
214 scr_blank_screen_mem (ROW (row), DEFAULT_RSTYLE); 212 scr_blank_screen_mem (ROW (row), DEFAULT_RSTYLE);
215 scr_blank_screen_mem (swap_buf [row], DEFAULT_RSTYLE); 213 scr_blank_screen_mem (swap_buf [row], DEFAULT_RSTYLE);
260 } 258 }
261 } 259 }
262#endif 260#endif
263 261
264 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));
265 temp_buf = (line_t *)rxvt_realloc (temp_buf , nrow * sizeof (line_t));
266 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));
267 264
268 for (int row = min (nrow, prev_nrow); row--; ) 265 for (int row = min (nrow, prev_nrow); row--; )
269 { 266 {
270 lresize (drawn_buf[row]); 267 lresize (drawn_buf[row]);
275 { 272 {
276 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);
277 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);
278 } 275 }
279 276
277 line_t *old_buf = row_buf;
280 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));
281 279
282 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
283 int pend = MOD (term_start - nsaved , prev_total_rows); 281 int pend = MOD (term_start - nsaved , prev_total_rows);
284 int q = total_rows; // rewrapped row 282 int q = total_rows; // rewrapped row
285 283
433 delete ralloc; ralloc = 0; 431 delete ralloc; ralloc = 0;
434 432
435 free (row_buf); 433 free (row_buf);
436 free (swap_buf); 434 free (swap_buf);
437 free (drawn_buf); 435 free (drawn_buf);
438 free (temp_buf);
439 free (tabs); 436 free (tabs);
440 437
441 row_buf = 0; // signal that we freed all the arrays 438 row_buf = 0; // signal that we freed all the arrays
442} 439}
443 440
575 * Change the colour for following text 572 * Change the colour for following text
576 */ 573 */
577void 574void
578rxvt_term::scr_color (unsigned int color, int fgbg) 575rxvt_term::scr_color (unsigned int color, int fgbg)
579{ 576{
580 if (color > maxTermCOLOR) 577 if (!IN_RANGE_INC (color, minCOLOR, maxTermCOLOR))
581 color = fgbg; 578 color = fgbg;
582 579
583 if (fgbg == Color_fg) 580 if (fgbg == Color_fg)
584 rstyle = SET_FGCOLOR (rstyle, color); 581 rstyle = SET_FGCOLOR (rstyle, color);
585 else 582 else
616 want_refresh = 1; 613 want_refresh = 1;
617 num_scr += count; 614 num_scr += count;
618 615
619 if (count > 0 616 if (count > 0
620 && row1 == 0 617 && row1 == 0
621 && row2 == nrow - 1
622 && (current_screen == PRIMARY || OPTION (Opt_secondaryScroll))) 618 && (current_screen == PRIMARY || OPTION (Opt_secondaryScroll)))
623 { 619 {
624 nsaved = min (nsaved + count, saveLines); 620 nsaved = min (nsaved + count, saveLines);
625 621
626 HOOK_INVOKE ((this, HOOK_SCROLL_BACK, DT_INT, count, DT_INT, nsaved, DT_END)); 622 HOOK_INVOKE ((this, HOOK_SCROLL_BACK, DT_INT, count, DT_INT, nsaved, DT_END));
627 623
624 // scroll everything up 'count' lines
628 term_start = (term_start + count) % total_rows; 625 term_start = (term_start + count) % total_rows;
629 626
627 {
628 // severe bottommost scrolled line
629 line_t &l = ROW(row2 - count);
630 l.touch ();
631 l.is_longer (0);
632 }
633
634 // erase newly scorlled-in lines
635 for (int i = count; i; --i )
636 {
637 // basically this is a slightly optimized scr_blank_screen_mem
638 // it is worth the effort on slower machines
639 line_t &l = ROW(nrow - i);
640
641 scr_blank_line (l, 0, l.l, rstyle);
642
643 l.l = 0;
644 l.f = 0;
645 }
646
647 // now copy lines below the scroll region bottom to the
648 // bottom of the screen again, so they look as if they
649 // hadn't moved.
650 for (int i = nrow; --i > row2; )
651 {
652 line_t &l1 = ROW(i - count);
653 line_t &l2 = ROW(i);
654
655 ::swap (l1, l2);
656 l2.touch ();
657 }
658
659 // move and/or clear selection, if any
630 if (selection.op && current_screen == selection.screen) 660 if (selection.op && current_screen == selection.screen)
631 { 661 {
632 selection.beg.row -= count; 662 selection.beg.row -= count;
633 selection.end.row -= count; 663 selection.end.row -= count;
634 selection.mark.row -= count; 664 selection.mark.row -= count;
640 CLEAR_ALL_SELECTION (); 670 CLEAR_ALL_SELECTION ();
641 selection.op = SELECTION_CLEAR; 671 selection.op = SELECTION_CLEAR;
642 } 672 }
643 } 673 }
644 674
645 for (int i = count; i--; ) 675 // finally move the view window, if desired
646 {
647 // basically thi is a slightly optimized scr_blank_screen_mem
648 // it is worth the effort on slower machines
649 line_t &l = ROW(row2 - i);
650
651 scr_blank_line (l, 0, l.l, rstyle);
652
653 l.l = 0;
654 l.f = 0;
655 }
656
657 if (OPTION (Opt_scrollWithBuffer) 676 if (OPTION (Opt_scrollWithBuffer)
658 && view_start != 0 677 && view_start != 0
659 && view_start != saveLines) 678 && view_start != saveLines)
660 scr_page (UP, count); 679 scr_page (UP, count);
661 } 680 }
688 // part of scr_scroll_text is not time-critical. 707 // part of scr_scroll_text is not time-critical.
689 708
690 int rows = row2 - row1 + 1; 709 int rows = row2 - row1 + 1;
691 710
692 min_it (count, rows); 711 min_it (count, rows);
712
713 line_t *temp_buf = row_buf + total_rows;
693 714
694 for (int row = 0; row < rows; row++) 715 for (int row = 0; row < rows; row++)
695 { 716 {
696 temp_buf [row] = ROW(row1 + (row + count + rows) % rows); 717 temp_buf [row] = ROW(row1 + (row + count + rows) % rows);
697 718
1864# endif 1885# endif
1865 1886
1866 if (OPTION (Opt_visualBell)) 1887 if (OPTION (Opt_visualBell))
1867 { 1888 {
1868 scr_rvideo_mode (!rvideo); /* refresh also done */ 1889 scr_rvideo_mode (!rvideo); /* refresh also done */
1890 display->flush ();
1869 rxvt_usleep (VISUAL_BELL_DURATION); 1891 rxvt_usleep (VISUAL_BELL_DURATION);
1870 scr_rvideo_mode (!rvideo); /* refresh also done */ 1892 scr_rvideo_mode (!rvideo); /* refresh also done */
1871 } 1893 }
1872 else 1894 else
1873 XBell (display->display, 0); 1895 XBell (display->display, 0);
2381 /* 2403 /*
2382 * H: cleanup selection 2404 * H: cleanup selection
2383 */ 2405 */
2384 scr_reverse_selection (); 2406 scr_reverse_selection ();
2385 2407
2386 if (refresh_type & SMOOTH_REFRESH)
2387 XFlush (display->display);
2388
2389 num_scr = 0; 2408 num_scr = 0;
2390 num_scr_allow = 1; 2409 num_scr_allow = 1;
2391} 2410}
2392 2411
2393void 2412void
2457 2476
2458 if (really) 2477 if (really)
2459 XClearWindow (display->display, vt); 2478 XClearWindow (display->display, vt);
2460} 2479}
2461 2480
2481void
2482rxvt_term::scr_xor_rect (int beg_row, int beg_col, int end_row, int end_col, rend_t rstyle1, rend_t rstyle2)
2483{
2484 int view_end = -view_start + nrow;
2485 int row, col;
2486
2487 for (row = max (beg_row, -view_start); row <= min (end_row, view_end); row++)
2488 {
2489 text_t *stp = ROW(row).t;
2490 rend_t *srp = ROW(row).r;
2491
2492 for (col = beg_col; col < end_col; col++)
2493 srp[col] ^= rstyle1;
2494
2495 while (col-- > beg_col && (stp[col] == NOCHAR || unicode::is_space (stp[col])))
2496 srp[col] ^= rstyle2;
2497
2498 if (++col < end_col)
2499 srp[col] ^= rstyle2;
2500 }
2501}
2502
2503void
2504rxvt_term::scr_xor_span (int beg_row, int beg_col, int end_row, int end_col, rend_t rstyle)
2505{
2506 int view_end = -view_start + nrow;
2507 int row, col;
2508
2509 if (beg_row >= -view_start)
2510 {
2511 col = beg_col;
2512 row = beg_row;
2513 }
2514 else
2515 {
2516 col = 0;
2517 row = -view_start;
2518 }
2519
2520 for (; row < min (end_row, view_end); row++, col = 0)
2521 for (rend_t *srp = ROW(row).r; col < ncol; col++)
2522 srp[col] ^= rstyle;
2523
2524 if (row == end_row)
2525 for (rend_t *srp = ROW(row).r; col < end_col; col++)
2526 srp[col] ^= rstyle;
2527}
2528
2462/* ------------------------------------------------------------------------- */ 2529/* ------------------------------------------------------------------------- */
2463void 2530void
2464rxvt_term::scr_reverse_selection () 2531rxvt_term::scr_reverse_selection ()
2465{ 2532{
2466 if (selection.op 2533 if (selection.op
2467 && current_screen == selection.screen 2534 && current_screen == selection.screen
2468 && selection.end.row >= -view_start) 2535 && selection.end.row >= -view_start)
2469 { 2536 {
2470 int view_end = -view_start + nrow;
2471 int row, col;
2472
2473#if ENABLE_FRILLS 2537#if ENABLE_FRILLS
2474 if (selection.rect) 2538 if (selection.rect)
2475 { 2539 scr_xor_rect (selection.beg.row, selection.beg.col,
2476 for (row = max (selection.beg.row, -view_start); row <= min (selection.end.row, view_end); row++) 2540 selection.end.row, selection.end.col,
2477 { 2541 RS_RVid, RS_RVid | RS_Uline);
2478 text_t *stp = ROW(row).t;
2479 rend_t *srp = ROW(row).r;
2480
2481 for (col = selection.beg.col; col < selection.end.col; col++)
2482 srp[col] ^= RS_RVid;
2483
2484 while (col-- > selection.beg.col && (stp[col] == NOCHAR || unicode::is_space (stp[col])))
2485 srp[col] ^= RS_RVid | RS_Uline;
2486
2487 if (++col < selection.end.col)
2488 srp[col] ^= RS_RVid | RS_Uline;
2489 }
2490 }
2491 else 2542 else
2492#endif 2543#endif
2493 { 2544 scr_xor_span (selection.beg.row, selection.beg.col,
2494 if (selection.beg.row >= -view_start) 2545 selection.end.row, selection.end.col,
2495 { 2546 RS_RVid);
2496 col = selection.beg.col;
2497 row = selection.beg.row;
2498 }
2499 else
2500 {
2501 col = 0;
2502 row = -view_start;
2503 }
2504
2505 for (; row < min (selection.end.row, view_end); row++, col = 0)
2506 for (rend_t *srp = ROW(row).r; col < ncol; col++)
2507 srp[col] ^= RS_RVid;
2508
2509 if (row == selection.end.row)
2510 for (rend_t *srp = ROW(row).r; col < selection.end.col; col++)
2511 srp[col] ^= RS_RVid;
2512 }
2513 } 2547 }
2514} 2548}
2515 2549
2516/* ------------------------------------------------------------------------- */ 2550/* ------------------------------------------------------------------------- */
2517/* 2551/*
3009 { 3043 {
3010 display->set_selection_owner (this); 3044 display->set_selection_owner (this);
3011 return true; 3045 return true;
3012 } 3046 }
3013 else 3047 else
3048 {
3049 selection_clear ();
3014 return false; 3050 return false;
3051 }
3015 3052
3016#if 0 3053#if 0
3017 XTextProperty ct; 3054 XTextProperty ct;
3018 3055
3019 if (XwcTextListToTextProperty (display->display, &selection.text, 1, XStringStyle, &ct) >= 0) 3056 if (XwcTextListToTextProperty (display->display, &selection.text, 1, XStringStyle, &ct) >= 0)
3032void 3069void
3033rxvt_term::selection_click (int clicks, int x, int y) 3070rxvt_term::selection_click (int clicks, int x, int y)
3034{ 3071{
3035 clicks = ((clicks - 1) % 3) + 1; 3072 clicks = ((clicks - 1) % 3) + 1;
3036 selection.clicks = clicks; /* save clicks so extend will work */ 3073 selection.clicks = clicks; /* save clicks so extend will work */
3074
3075 if (clicks == 2 && !selection.rect
3076 && HOOK_INVOKE ((this, HOOK_SEL_EXTEND, DT_END)))
3077 {
3078 MEvent.clicks = 1; // what a mess
3079 selection.screen = current_screen;
3080 selection.op = SELECTION_CONT;
3081 return;
3082 }
3037 3083
3038 selection_start_colrow (Pixel2Col (x), Pixel2Row (y)); 3084 selection_start_colrow (Pixel2Col (x), Pixel2Row (y));
3039 3085
3040 if (clicks == 2 || clicks == 3) 3086 if (clicks == 2 || clicks == 3)
3041 selection_extend_colrow (selection.mark.col, 3087 selection_extend_colrow (selection.mark.col,
3337 else if (selection.clicks == 2) 3383 else if (selection.clicks == 2)
3338 { 3384 {
3339 if (ROWCOL_IS_AFTER (selection.end, selection.beg)) 3385 if (ROWCOL_IS_AFTER (selection.end, selection.beg))
3340 selection.end.col--; 3386 selection.end.col--;
3341 3387
3342 if (!HOOK_INVOKE ((this, HOOK_SEL_EXTEND, DT_END)))
3343 {
3344 selection_delimit_word (UP, &selection.beg, &selection.beg); 3388 selection_delimit_word (UP, &selection.beg, &selection.beg);
3345 selection_delimit_word (DN, &selection.end, &selection.end); 3389 selection_delimit_word (DN, &selection.end, &selection.end);
3346 }
3347 } 3390 }
3348 else if (selection.clicks == 3) 3391 else if (selection.clicks == 3)
3349 { 3392 {
3350#if ENABLE_FRILLS 3393#if ENABLE_FRILLS
3351 if (OPTION (Opt_tripleclickwords)) 3394 if (OPTION (Opt_tripleclickwords))

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines