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.215 by root, Sun Jan 8 06:35:23 2006 UTC vs.
Revision 1.225 by root, Thu Jan 12 05:22:47 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
641 selection.op = SELECTION_CLEAR; 638 selection.op = SELECTION_CLEAR;
642 } 639 }
643 } 640 }
644 641
645 for (int i = count; i--; ) 642 for (int i = count; i--; )
646 scr_blank_screen_mem (ROW(row2 - i), rstyle); 643 {
644 // basically thi is a slightly optimized scr_blank_screen_mem
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;
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)
651 scr_page (UP, count); 657 scr_page (UP, count);
679 // part of scr_scroll_text is not time-critical. 685 // part of scr_scroll_text is not time-critical.
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);
690
691 line_t *temp_buf = row_buf + total_rows;
684 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
1855# endif 1863# endif
1856 1864
1857 if (OPTION (Opt_visualBell)) 1865 if (OPTION (Opt_visualBell))
1858 { 1866 {
1859 scr_rvideo_mode (!rvideo); /* refresh also done */ 1867 scr_rvideo_mode (!rvideo); /* refresh also done */
1868 display->flush ();
1860 rxvt_usleep (VISUAL_BELL_DURATION); 1869 rxvt_usleep (VISUAL_BELL_DURATION);
1861 scr_rvideo_mode (!rvideo); /* refresh also done */ 1870 scr_rvideo_mode (!rvideo); /* refresh also done */
1862 } 1871 }
1863 else 1872 else
1864 XBell (display->display, 0); 1873 XBell (display->display, 0);
2372 /* 2381 /*
2373 * H: cleanup selection 2382 * H: cleanup selection
2374 */ 2383 */
2375 scr_reverse_selection (); 2384 scr_reverse_selection ();
2376 2385
2377 if (refresh_type & SMOOTH_REFRESH)
2378 XFlush (display->display);
2379
2380 num_scr = 0; 2386 num_scr = 0;
2381 num_scr_allow = 1; 2387 num_scr_allow = 1;
2382} 2388}
2383 2389
2384void 2390void
2448 2454
2449 if (really) 2455 if (really)
2450 XClearWindow (display->display, vt); 2456 XClearWindow (display->display, vt);
2451} 2457}
2452 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
2453/* ------------------------------------------------------------------------- */ 2507/* ------------------------------------------------------------------------- */
2454void 2508void
2455rxvt_term::scr_reverse_selection () 2509rxvt_term::scr_reverse_selection ()
2456{ 2510{
2457 if (selection.op 2511 if (selection.op
2458 && current_screen == selection.screen 2512 && current_screen == selection.screen
2459 && selection.end.row >= -view_start) 2513 && selection.end.row >= -view_start)
2460 { 2514 {
2461 int view_end = -view_start + nrow;
2462 int row, col;
2463
2464#if ENABLE_FRILLS 2515#if ENABLE_FRILLS
2465 if (selection.rect) 2516 if (selection.rect)
2466 { 2517 scr_xor_rect (selection.beg.row, selection.beg.col,
2467 for (row = max (selection.beg.row, -view_start); row <= min (selection.end.row, view_end); row++) 2518 selection.end.row, selection.end.col,
2468 { 2519 RS_RVid, RS_RVid | RS_Uline);
2469 text_t *stp = ROW(row).t;
2470 rend_t *srp = ROW(row).r;
2471
2472 for (col = selection.beg.col; col < selection.end.col; col++)
2473 srp[col] ^= RS_RVid;
2474
2475 while (col-- > selection.beg.col && (stp[col] == NOCHAR || unicode::is_space (stp[col])))
2476 srp[col] ^= RS_RVid | RS_Uline;
2477
2478 if (++col < selection.end.col)
2479 srp[col] ^= RS_RVid | RS_Uline;
2480 }
2481 }
2482 else 2520 else
2483#endif 2521#endif
2484 { 2522 scr_xor_span (selection.beg.row, selection.beg.col,
2485 if (selection.beg.row >= -view_start) 2523 selection.end.row, selection.end.col,
2486 { 2524 RS_RVid);
2487 col = selection.beg.col;
2488 row = selection.beg.row;
2489 }
2490 else
2491 {
2492 col = 0;
2493 row = -view_start;
2494 }
2495
2496 for (; row < min (selection.end.row, view_end); row++, col = 0)
2497 for (rend_t *srp = ROW(row).r; col < ncol; col++)
2498 srp[col] ^= RS_RVid;
2499
2500 if (row == selection.end.row)
2501 for (rend_t *srp = ROW(row).r; col < selection.end.col; col++)
2502 srp[col] ^= RS_RVid;
2503 }
2504 } 2525 }
2505} 2526}
2506 2527
2507/* ------------------------------------------------------------------------- */ 2528/* ------------------------------------------------------------------------- */
2508/* 2529/*
3000 { 3021 {
3001 display->set_selection_owner (this); 3022 display->set_selection_owner (this);
3002 return true; 3023 return true;
3003 } 3024 }
3004 else 3025 else
3026 {
3027 selection_clear ();
3005 return false; 3028 return false;
3029 }
3006 3030
3007#if 0 3031#if 0
3008 XTextProperty ct; 3032 XTextProperty ct;
3009 3033
3010 if (XwcTextListToTextProperty (display->display, &selection.text, 1, XStringStyle, &ct) >= 0) 3034 if (XwcTextListToTextProperty (display->display, &selection.text, 1, XStringStyle, &ct) >= 0)
3023void 3047void
3024rxvt_term::selection_click (int clicks, int x, int y) 3048rxvt_term::selection_click (int clicks, int x, int y)
3025{ 3049{
3026 clicks = ((clicks - 1) % 3) + 1; 3050 clicks = ((clicks - 1) % 3) + 1;
3027 selection.clicks = clicks; /* save clicks so extend will work */ 3051 selection.clicks = clicks; /* save clicks so extend will work */
3052
3053 if (clicks == 2 && !selection.rect
3054 && HOOK_INVOKE ((this, HOOK_SEL_EXTEND, DT_END)))
3055 {
3056 MEvent.clicks = 1; // what a mess
3057 return;
3058 }
3028 3059
3029 selection_start_colrow (Pixel2Col (x), Pixel2Row (y)); 3060 selection_start_colrow (Pixel2Col (x), Pixel2Row (y));
3030 3061
3031 if (clicks == 2 || clicks == 3) 3062 if (clicks == 2 || clicks == 3)
3032 selection_extend_colrow (selection.mark.col, 3063 selection_extend_colrow (selection.mark.col,
3328 else if (selection.clicks == 2) 3359 else if (selection.clicks == 2)
3329 { 3360 {
3330 if (ROWCOL_IS_AFTER (selection.end, selection.beg)) 3361 if (ROWCOL_IS_AFTER (selection.end, selection.beg))
3331 selection.end.col--; 3362 selection.end.col--;
3332 3363
3333 if (!HOOK_INVOKE ((this, HOOK_SEL_EXTEND, DT_END)))
3334 {
3335 selection_delimit_word (UP, &selection.beg, &selection.beg); 3364 selection_delimit_word (UP, &selection.beg, &selection.beg);
3336 selection_delimit_word (DN, &selection.end, &selection.end); 3365 selection_delimit_word (DN, &selection.end, &selection.end);
3337 }
3338 } 3366 }
3339 else if (selection.clicks == 3) 3367 else if (selection.clicks == 3)
3340 { 3368 {
3341#if ENABLE_FRILLS 3369#if ENABLE_FRILLS
3342 if (OPTION (Opt_tripleclickwords)) 3370 if (OPTION (Opt_tripleclickwords))

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines