… | |
… | |
107 | } |
107 | } |
108 | |
108 | |
109 | l.touch (); |
109 | l.touch (); |
110 | |
110 | |
111 | efs &= ~RS_baseattrMask; // remove italic etc. fontstyles |
111 | efs &= ~RS_baseattrMask; // remove italic etc. fontstyles |
112 | efs = SET_FONT (efs, FONTSET (efs)->find_font (' ')); |
112 | efs = SET_FONT (efs, FONTSET (efs)->find_space_font ()); |
113 | |
113 | |
114 | text_t *et = l.t + col; |
114 | text_t *et = l.t + col; |
115 | rend_t *er = l.r + col; |
115 | rend_t *er = l.r + col; |
116 | |
116 | |
117 | while (width--) |
117 | while (width--) |
… | |
… | |
139 | // find begin |
139 | // find begin |
140 | while (col > 0 && l.t[col] == NOCHAR) |
140 | while (col > 0 && l.t[col] == NOCHAR) |
141 | col--; |
141 | col--; |
142 | |
142 | |
143 | rend_t rend = l.r[col] & ~RS_baseattrMask; |
143 | rend_t rend = l.r[col] & ~RS_baseattrMask; |
144 | rend = SET_FONT (rend, FONTSET (rend)->find_font (' ')); |
144 | rend = SET_FONT (rend, FONTSET (rend)->find_space_font ()); |
145 | |
145 | |
146 | l.touch (); |
146 | l.touch (); |
147 | |
147 | |
148 | // found start, nuke |
148 | // found start, nuke |
149 | do { |
149 | do { |
… | |
… | |
291 | * add or delete rows as appropriate |
291 | * add or delete rows as appropriate |
292 | */ |
292 | */ |
293 | |
293 | |
294 | int common_col = min (prev_ncol, ncol); |
294 | int common_col = min (prev_ncol, ncol); |
295 | |
295 | |
|
|
296 | // resize swap_buf, blank drawn_buf |
296 | for (int row = min (nrow, prev_nrow); row--; ) |
297 | for (int row = min (nrow, prev_nrow); row--; ) |
297 | { |
298 | { |
298 | scr_blank_screen_mem (drawn_buf [row], DEFAULT_RSTYLE); |
299 | scr_blank_screen_mem (drawn_buf [row], DEFAULT_RSTYLE); |
299 | memcpy (drawn_buf [row].t, prev_drawn_buf [row].t, sizeof (text_t) * common_col); |
300 | memcpy (drawn_buf [row].t, prev_drawn_buf [row].t, sizeof (text_t) * common_col); |
300 | memcpy (drawn_buf [row].r, prev_drawn_buf [row].r, sizeof (rend_t) * common_col); |
301 | memcpy (drawn_buf [row].r, prev_drawn_buf [row].r, sizeof (rend_t) * common_col); |
… | |
… | |
304 | |
305 | |
305 | int p = MOD (term_start + prev_nrow, prev_total_rows); // previous row |
306 | int p = MOD (term_start + prev_nrow, prev_total_rows); // previous row |
306 | int pend = MOD (term_start + top_row , prev_total_rows); |
307 | int pend = MOD (term_start + top_row , prev_total_rows); |
307 | int q = total_rows; // rewrapped row |
308 | int q = total_rows; // rewrapped row |
308 | |
309 | |
309 | if (top_row) |
310 | #if ENABLE_FRILLS |
|
|
311 | if ((rewrap_always || top_row) && !rewrap_never) |
310 | { |
312 | { |
311 | // Re-wrap lines. This is rather ugly, possibly because I am too dumb |
313 | // Re-wrap lines. This is rather ugly, possibly because I am too dumb |
312 | // to come up with a lean and mean algorithm. |
314 | // to come up with a lean and mean algorithm. |
313 | // TODO: maybe optimise when width didn't change |
315 | // TODO: maybe optimise when width didn't change |
314 | |
316 | |
… | |
… | |
394 | // make sure all terminal lines exist |
396 | // make sure all terminal lines exist |
395 | while (top_row > 0) |
397 | while (top_row > 0) |
396 | scr_blank_screen_mem (ROW (--top_row), DEFAULT_RSTYLE); |
398 | scr_blank_screen_mem (ROW (--top_row), DEFAULT_RSTYLE); |
397 | } |
399 | } |
398 | else |
400 | else |
|
|
401 | #endif |
|
|
402 | { |
|
|
403 | // wing, instead of wrap |
399 | { |
404 | do |
400 | // if no scrollback exists (yet), wing, instead of wrap |
|
|
401 | |
|
|
402 | for (int row = min (nrow, prev_nrow); row--; ) |
|
|
403 | { |
405 | { |
404 | line_t &src = prev_row_buf [MOD (term_start + row, prev_total_rows)]; |
406 | p = MOD (p - 1, prev_total_rows); |
405 | line_t &dst = row_buf [row]; |
407 | q--; |
406 | |
408 | |
407 | copy_line (dst, src); |
409 | copy_line (row_buf [q], prev_row_buf [p]); |
408 | } |
410 | } |
|
|
411 | while (p != pend); |
409 | |
412 | |
410 | for (int row = prev_nrow; row < nrow; row++) |
413 | screen.cur.row += nrow - prev_nrow; |
411 | scr_blank_screen_mem (row_buf [row], DEFAULT_RSTYLE); |
414 | term_start = total_rows - nrow; |
412 | |
|
|
413 | term_start = 0; |
|
|
414 | } |
415 | } |
415 | |
416 | |
416 | clamp_it (screen.cur.row, 0, nrow - 1); |
417 | clamp_it (screen.cur.row, 0, nrow - 1); |
417 | clamp_it (screen.cur.col, 0, ncol - 1); |
418 | clamp_it (screen.cur.col, 0, ncol - 1); |
418 | } |
419 | } |
419 | |
420 | |
|
|
421 | // ensure drawn_buf, swap_buf and terminal rows are all initialized |
420 | for (int row = nrow; row--; ) |
422 | for (int row = nrow; row--; ) |
421 | { |
423 | { |
422 | if (!ROW (row).valid ()) scr_blank_screen_mem (ROW (row), DEFAULT_RSTYLE); |
424 | if (!ROW (row).valid ()) scr_blank_screen_mem (ROW (row), DEFAULT_RSTYLE); |
423 | if (!swap_buf [row].valid ()) scr_blank_screen_mem (swap_buf [row], DEFAULT_RSTYLE); |
425 | if (!swap_buf [row].valid ()) scr_blank_screen_mem (swap_buf [row], DEFAULT_RSTYLE); |
424 | if (!drawn_buf [row].valid ()) scr_blank_screen_mem (drawn_buf [row], DEFAULT_RSTYLE); |
426 | if (!drawn_buf [row].valid ()) scr_blank_screen_mem (drawn_buf [row], DEFAULT_RSTYLE); |
… | |
… | |
2714 | /* convert normal newline chars into common keyboard Return key sequence */ |
2716 | /* convert normal newline chars into common keyboard Return key sequence */ |
2715 | for (unsigned int i = 0; i < len; i++) |
2717 | for (unsigned int i = 0; i < len; i++) |
2716 | if (data[i] == C0_LF) |
2718 | if (data[i] == C0_LF) |
2717 | data[i] = C0_CR; |
2719 | data[i] = C0_CR; |
2718 | |
2720 | |
2719 | if (priv_modes & PrivMode_BracketPaste) |
2721 | #if ENABLE_FRILLS |
|
|
2722 | if ((priv_modes & PrivMode_BracketPaste) && !option (Opt_disablePasteBrackets)) |
2720 | tt_printf ("\x1b[200~"); |
2723 | tt_printf ("\x1b[200~"); |
|
|
2724 | #endif |
2721 | |
2725 | |
2722 | tt_write (data, len); |
2726 | tt_write (data, len); |
2723 | |
2727 | |
2724 | if (priv_modes & PrivMode_BracketPaste) |
2728 | #if ENABLE_FRILLS |
|
|
2729 | if ((priv_modes & PrivMode_BracketPaste) && !option (Opt_disablePasteBrackets)) |
2725 | tt_printf ("\x1b[201~"); |
2730 | tt_printf ("\x1b[201~"); |
|
|
2731 | #endif |
2726 | } |
2732 | } |
2727 | |
2733 | |
2728 | void |
2734 | void |
2729 | rxvt_term::paste (char *data, unsigned int len) noexcept |
2735 | rxvt_term::paste (char *data, unsigned int len) noexcept |
2730 | { |
2736 | { |