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>

index | next in thread | raw e-mail

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;
 		}
 	}


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200812251520.mBPFKUft036882>