Date: Thu, 25 Dec 2008 15:20:30 GMT From: Ed Schouten <ed@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 155277 for review Message-ID: <200812251520.mBPFKUft036882@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=155277 Change 155277 by ed@ed_dull on 2008/12/25 15:19:56 It seems my insert mode fixes were not sufficient. If line wrapping occurs, it overwrites the first character on the next line, while it should move the entire line one character. Affected files ... .. //depot/projects/mpsafetty/sys/dev/syscons/teken/teken_subr.h#18 edit Differences ... ==== //depot/projects/mpsafetty/sys/dev/syscons/teken/teken_subr.h#18 (text+ko) ==== @@ -665,6 +665,28 @@ } static void +teken_subr_do_putchar(teken_t *t, const teken_pos_t *tp, teken_char_t c, + int width) +{ + + if (t->t_stateflags & TS_INSERT && + tp->tp_col < t->t_winsize.tp_col - width) { + teken_rect_t ctr; + teken_pos_t ctp; + + /* Insert mode. Move existing characters to the right. */ + ctr.tr_begin = *tp; + ctr.tr_end.tp_row = tp->tp_row + 1; + ctr.tr_end.tp_col = t->t_winsize.tp_col - width; + ctp.tp_row = tp->tp_row; + ctp.tp_col = tp->tp_col + width; + teken_funcs_copy(t, &ctr, &ctp); + } + + teken_funcs_putchar(t, tp, c, &t->t_curattr); +} + +static void teken_subr_regular_character(teken_t *t, teken_char_t c) { int width; @@ -674,25 +696,13 @@ if (width <= 0) return; - if (t->t_stateflags & TS_INSERT && - t->t_cursor.tp_col < t->t_winsize.tp_col - width) { - teken_rect_t tr; - teken_pos_t tp; - - /* Insert mode. Move existing characters to the right. */ - tr.tr_begin = t->t_cursor; - tr.tr_end.tp_row = t->t_cursor.tp_row + 1; - tr.tr_end.tp_col = t->t_winsize.tp_col - width; - tp.tp_row = t->t_cursor.tp_row; - tp.tp_col = t->t_cursor.tp_col + width; - teken_funcs_copy(t, &tr, &tp); - } - if (t->t_cursor.tp_col == t->t_winsize.tp_col - 1 && (t->t_stateflags & (TS_WRAPPED|TS_AUTOWRAP)) == (TS_WRAPPED|TS_AUTOWRAP)) { teken_pos_t tp; + /* Perform line wrapping. */ + if (t->t_cursor.tp_row == t->t_scrollreg.ts_end - 1) { /* Perform scrolling. */ teken_subr_do_scroll(t, 1); @@ -701,25 +711,32 @@ /* No scrolling needed. */ tp.tp_row = t->t_cursor.tp_row + 1; if (tp.tp_row == t->t_winsize.tp_row) { - teken_funcs_putchar(t, &t->t_cursor, c, - &t->t_curattr); + /* + * Corner case: regular character + * outside scrolling region, but at the + * bottom of the screen. + */ + teken_subr_do_putchar(t, &t->t_cursor, + c, width); return; } } tp.tp_col = 0; - teken_funcs_putchar(t, &tp, c, &t->t_curattr); + teken_subr_do_putchar(t, &tp, c, width); t->t_cursor.tp_row = tp.tp_row; t->t_cursor.tp_col = width; t->t_stateflags &= ~TS_WRAPPED; } else { - /* No scrolling needed. */ - teken_funcs_putchar(t, &t->t_cursor, c, &t->t_curattr); - if (t->t_cursor.tp_col >= t->t_winsize.tp_col - width) { + /* No line wrapping needed. */ + teken_subr_do_putchar(t, &t->t_cursor, c, width); + t->t_cursor.tp_col += width; + + if (t->t_cursor.tp_col >= t->t_winsize.tp_col) { t->t_stateflags |= TS_WRAPPED; + t->t_cursor.tp_col = t->t_winsize.tp_col - 1; } else { - t->t_cursor.tp_col += width; t->t_stateflags &= ~TS_WRAPPED; } }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200812251520.mBPFKUft036882>