Skip site navigation (1)Skip section navigation (2)
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>