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.246 by root, Sat Jan 21 14:25:05 2006 UTC vs.
Revision 1.247 by root, Sun Jan 22 20:39:47 2006 UTC

173 nrow = 24; 173 nrow = 24;
174 174
175 if (ncol == prev_ncol && nrow == prev_nrow) 175 if (ncol == prev_ncol && nrow == prev_nrow)
176 return; 176 return;
177 177
178 if (current_screen != PRIMARY)
179 scr_swap_screen ();
180
178 // we need at least two lines for wrapping to work correctly 181 // we need at least two lines for wrapping to work correctly
179 if (nrow + saveLines < 2) 182 while (nrow + saveLines < 2)
180 { 183 {
181 //TODO//FIXME 184 //TODO//FIXME
182 saveLines++; 185 saveLines++;
183 prev_nrow--; 186 prev_nrow--;
184 top_row--; 187 top_row--;
195 if (!row_buf) 198 if (!row_buf)
196 { 199 {
197 /* 200 /*
198 * first time called so just malloc everything: don't rely on realloc 201 * first time called so just malloc everything: don't rely on realloc
199 */ 202 */
200 top_row = 0; /* no saved lines */ 203 top_row = 0;
201 term_start = 0; 204 term_start = 0;
202 205
203 talloc = new rxvt_salloc (ncol * sizeof (text_t)); 206 talloc = new rxvt_salloc (ncol * sizeof (text_t));
204 ralloc = new rxvt_salloc (ncol * sizeof (rend_t)); 207 ralloc = new rxvt_salloc (ncol * sizeof (rend_t));
205 208
280 int pend = MOD (term_start + top_row , prev_total_rows); 283 int pend = MOD (term_start + top_row , prev_total_rows);
281 int q = total_rows; // rewrapped row 284 int q = total_rows; // rewrapped row
282 285
283 if (top_row) 286 if (top_row)
284 { 287 {
285 // re-wrap lines, this is rather ugly, possibly because I am too dumb 288 // Re-wrap lines. This is rather ugly, possibly because I am too dumb
286 // to come up with a lean and mean algorithm. 289 // to come up with a lean and mean algorithm.
287 290
288 row_col_t ocur = screen.cur; 291 row_col_t ocur = screen.cur;
289 ocur.row = MOD (term_start + ocur.row, prev_total_rows); 292 ocur.row = MOD (term_start + ocur.row, prev_total_rows);
290 293
347 350
348 line_t &pline = old_buf [prow]; 351 line_t &pline = old_buf [prow];
349 352
350 int len = min (min (prev_ncol - pcol, ncol - qcol), llen - lofs); 353 int len = min (min (prev_ncol - pcol, ncol - qcol), llen - lofs);
351 354
352#if DEBUG_STRICT
353 assert (len);
354 assert (pline.t);
355#endif
356
357 memcpy (qline->t + qcol, pline.t + pcol, len * sizeof (text_t)); 355 memcpy (qline->t + qcol, pline.t + pcol, len * sizeof (text_t));
358 memcpy (qline->r + qcol, pline.r + pcol, len * sizeof (rend_t)); 356 memcpy (qline->r + qcol, pline.r + pcol, len * sizeof (rend_t));
359 357
360 lofs += len; 358 lofs += len;
361 qcol += len; 359 qcol += len;
401 delete old_ra; 399 delete old_ra;
402 400
403 clamp_it (screen.cur.row, 0, nrow - 1); 401 clamp_it (screen.cur.row, 0, nrow - 1);
404 clamp_it (screen.cur.col, 0, ncol - 1); 402 clamp_it (screen.cur.col, 0, ncol - 1);
405 403
406 if (tabs)
407 free (tabs); 404 free (tabs);
408 } 405 }
409 406
410 CLEAR_ALL_SELECTION (); 407 CLEAR_ALL_SELECTION ();
411 408
412 prev_nrow = nrow; 409 prev_nrow = nrow;
415 tabs = (char *)rxvt_malloc (ncol * sizeof (char)); 412 tabs = (char *)rxvt_malloc (ncol * sizeof (char));
416 413
417 for (int col = ncol; col--; ) 414 for (int col = ncol; col--; )
418 tabs [col] = col % TABSIZE == 0; 415 tabs [col] = col % TABSIZE == 0;
419 416
417 if (current_screen != PRIMARY)
418 scr_swap_screen ();
419
420 tt_winch (); 420 tt_winch ();
421 421
422 HOOK_INVOKE ((this, HOOK_RESET, DT_END)); 422 HOOK_INVOKE ((this, HOOK_RESET, DT_END));
423} 423}
424 424
427 * Free everything. That way malloc debugging can find leakage. 427 * Free everything. That way malloc debugging can find leakage.
428 */ 428 */
429void 429void
430rxvt_term::scr_release () NOTHROW 430rxvt_term::scr_release () NOTHROW
431{ 431{
432 if (row_buf)
433 {
432 delete talloc; talloc = 0; 434 delete talloc; talloc = 0;
433 delete ralloc; ralloc = 0; 435 delete ralloc; ralloc = 0;
434 436
435 free (row_buf); 437 free (row_buf);
436 free (swap_buf); 438 free (swap_buf);
437 free (drawn_buf); 439 free (drawn_buf);
438 free (tabs); 440 free (tabs);
439 441
440 row_buf = 0; // signal that we freed all the arrays 442 row_buf = 0; // signal that we freed all the arrays
443 }
441} 444}
442 445
443/* ------------------------------------------------------------------------- */ 446/* ------------------------------------------------------------------------- */
444/* 447/*
445 * Hard reset 448 * Hard reset
446 */ 449 */
447void 450void
448rxvt_term::scr_poweron () NOTHROW 451rxvt_term::scr_poweron ()
449{ 452{
450 scr_release (); 453 scr_release ();
451 prev_nrow = prev_ncol = 0; 454 prev_nrow = prev_ncol = 0;
452 scr_reset (); 455 scr_reset ();
453 456
504 assert (s->cur.row >= 0); 507 assert (s->cur.row >= 0);
505 assert (s->cur.col >= 0); 508 assert (s->cur.col >= 0);
506#endif 509#endif
507} 510}
508 511
512void
513rxvt_term::scr_swap_screen ()
514{
515 if (!OPTION (Opt_secondaryScreen))
516 return;
517
518 for (int i = prev_nrow; i--; )
519 ::swap (ROW(i), swap_buf [i]);
520
521 ::swap (screen.cur, swap.cur);
522
523 screen.cur.row = clamp (screen.cur.row, 0, prev_nrow - 1);
524 screen.cur.col = clamp (screen.cur.col, 0, prev_ncol - 1);
525}
526
509/* ------------------------------------------------------------------------- */ 527/* ------------------------------------------------------------------------- */
510/* 528/*
511 * Swap between primary and secondary screens 529 * Swap between primary and secondary screens
512 * XTERM_SEQ: Primary screen : ESC [ ? 4 7 h 530 * XTERM_SEQ: Primary screen : ESC [ ? 4 7 h
513 * XTERM_SEQ: Secondary screen: ESC [ ? 4 7 l 531 * XTERM_SEQ: Secondary screen: ESC [ ? 4 7 l
514 */ 532 */
515int 533void
516rxvt_term::scr_change_screen (int scrn) NOTHROW 534rxvt_term::scr_change_screen (int scrn)
517{ 535{
536 if (scrn == current_screen)
537 return;
538
518 want_refresh = 1; 539 want_refresh = 1;
519 view_start = 0; 540 view_start = 0;
520 541
521 if (current_screen == scrn)
522 return scrn;
523
524 selection_check (2); /* check for boundary cross */ 542 selection_check (2); /* check for boundary cross */
525 543
526 int i = current_screen; current_screen = scrn; scrn = i; 544 int i = current_screen; current_screen = scrn; scrn = i;
527
528 ::swap (screen.cur.row, swap.cur.row);
529 ::swap (screen.cur.col, swap.cur.col);
530
531 screen.cur.row = clamp (screen.cur.row, 0, prev_nrow - 1);
532 screen.cur.col = clamp (screen.cur.col, 0, prev_ncol - 1);
533 545
534#if NSCREENS 546#if NSCREENS
535 if (OPTION (Opt_secondaryScreen)) 547 if (OPTION (Opt_secondaryScreen))
536 { 548 {
537 num_scr = 0; 549 num_scr = 0;
538 550
539 for (int i = prev_nrow; i--; ) 551 scr_swap_screen ();
540 ::swap (ROW(i), swap_buf [i]);
541 552
542 ::swap (screen.charset, swap.charset); 553 ::swap (screen.charset, swap.charset);
543 ::swap (screen.flags, swap.flags); 554 ::swap (screen.flags, swap.flags);
544 screen.flags |= Screen_VisibleCursor; 555 screen.flags |= Screen_VisibleCursor;
545 swap.flags |= Screen_VisibleCursor; 556 swap.flags |= Screen_VisibleCursor;
546 } 557 }
547 else 558 else
548#endif 559#endif
549 if (OPTION (Opt_secondaryScroll)) 560 if (OPTION (Opt_secondaryScroll))
550 scr_scroll_text (0, prev_nrow - 1, prev_nrow); 561 scr_scroll_text (0, prev_nrow - 1, prev_nrow);
551
552 return scrn;
553} 562}
554 563
555// clear WrapNext indicator, solidifying position on next line 564// clear WrapNext indicator, solidifying position on next line
556void 565void
557rxvt_term::scr_do_wrap () NOTHROW 566rxvt_term::scr_do_wrap () NOTHROW

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines