Skip to contentSkip to conversation

Make the software cursor non-destructive

PATCH Superseded Gabe Black 5 participants 11 messages Nov 8, 2011 – Mar 18, 2012 Framebuffer layer

lore
Share & tools
lore

Gabe Black

author
#0 lore raw

PATCH 1/1 Make the software cursor non-destructive

When printing the string "\r\n" to the framebuffer console, the first character of the current line was being replaced with a space. The "boot" prompt would become the "oot" prompt. This change makes the cursor non-destructive so that no matter where it goes on its way to where it's supposed to be, the end result is that the cursor is where it's supposed to be with the other text preserved intact.

---
 drivers/video/cfb_console.c |   92 ++++++++++++++++++++++---------------------
 1 files changed, 47 insertions(+), 45 deletions(-)
drivers/video/cfb_console.c +47 -45
index 561883a..06de04e 100644
@@ -221,8 +221,7 @@
 /*
  * Cursor definition:
  * CONFIG_CONSOLE_CURSOR:  Uses a timer function (see drivers/input/i8042.c)
- *			   to let the cursor blink. Uses the macros
- *			   CURSOR_OFF and CURSOR_ON.
+ *			   to let the cursor blink.
  * CONFIG_VIDEO_SW_CURSOR: Draws a cursor after the last character. No
  *			   blinking is provided. Uses the macros CURSOR_SET
  *			   and CURSOR_OFF.
@@ -248,9 +247,9 @@
 #endif
 void console_cursor(int state);
 
-#define CURSOR_ON  console_cursor(1)
+#define CURSOR_ON console_cursor(1)
 #define CURSOR_OFF console_cursor(0)
-#define CURSOR_SET
+#define CURSOR_SET video_set_cursor()
 #ifndef CONFIG_I8042_KBD
 #warning Cursor drawing on/off needs timer function s.a. drivers/input/i8042.c
 #endif
@@ -265,9 +264,9 @@ void console_cursor(int state);
 #error	only one of CONFIG_CONSOLE_CURSOR, CONFIG_VIDEO_SW_CURSOR, \
 	or CONFIG_VIDEO_HW_CURSOR can be defined
 #endif
-#define CURSOR_ON
-#define CURSOR_OFF video_putchar(console_col * VIDEO_FONT_WIDTH,\
-				 console_row * VIDEO_FONT_HEIGHT, ' ')
+void	console_cursor (int state);
+#define CURSOR_ON console_cursor(1)
+#define CURSOR_OFF console_cursor(0)
 #define CURSOR_SET video_set_cursor()
 #endif /* CONFIG_VIDEO_SW_CURSOR */
 
@@ -374,6 +373,10 @@ static void *video_console_address;	/* console buffer start address */
 
 static int video_logo_height = VIDEO_LOGO_HEIGHT;
 
+static int cursor_state = 0;
+static int old_col = 0;
+static int old_row = 0;
+
 static int console_col;		/* cursor col */
 static int console_row;		/* cursor row */
 
@@ -433,6 +436,22 @@ static const int video_font_draw_table32[16][4] = {
 };
 
 
+static void video_invertchar (int xx, int yy)
+{
+	int firstx = xx * VIDEO_PIXEL_SIZE;
+	int lastx = (xx + VIDEO_FONT_WIDTH) * VIDEO_PIXEL_SIZE;
+	int firsty = yy * VIDEO_LINE_LEN;
+	int lasty = (yy + VIDEO_FONT_HEIGHT) * VIDEO_LINE_LEN;
+	int x, y;
+	for (y = firsty; y < lasty; y += VIDEO_LINE_LEN) {
+		for (x = firstx; x < lastx; x++) {
+			u8 *dest = (u8 *)(video_fb_address) + x + y;
+			*dest = ~*dest;
+		}
+	}
+}
+
+
 static void video_drawchars(int xx, int yy, unsigned char *s, int count)
 {
 	u8 *cdat, *dest, *dest0;
@@ -608,27 +627,15 @@ static void video_putchar(int xx, int yy, unsigned char c)
 #if defined(CONFIG_CONSOLE_CURSOR) || defined(CONFIG_VIDEO_SW_CURSOR)
 static void video_set_cursor(void)
 {
-	/* swap drawing colors */
-	eorx = fgx;
-	fgx = bgx;
-	bgx = eorx;
-	eorx = fgx ^ bgx;
-	/* draw cursor */
-	video_putchar(console_col * VIDEO_FONT_WIDTH,
-		      console_row * VIDEO_FONT_HEIGHT, ' ');
-	/* restore drawing colors */
-	eorx = fgx;
-	fgx = bgx;
-	bgx = eorx;
-	eorx = fgx ^ bgx;
+	if (cursor_state)
+		console_cursor(0);
+	console_cursor(1);
 }
-#endif
 
-#ifdef CONFIG_CONSOLE_CURSOR
+
+
 void console_cursor(int state)
 {
-	static int last_state = 0;
-
 #ifdef CONFIG_CONSOLE_TIME
 	struct rtc_time tm;
 	char info[16];
@@ -650,17 +657,20 @@ void console_cursor(int state)
 	}
 #endif
 
-	if (state && (last_state != state)) {
-		video_set_cursor();
-	}
-
-	if (!state && (last_state != state)) {
-		/* clear cursor */
-		video_putchar(console_col * VIDEO_FONT_WIDTH,
-			      console_row * VIDEO_FONT_HEIGHT, ' ');
+	if (cursor_state != state) {
+		if (cursor_state) {
+			/* turn off the cursor */
+			video_invertchar(old_col * VIDEO_FONT_WIDTH,
+			                 old_row * VIDEO_FONT_HEIGHT);
+		} else {
+			/* turn off the cursor and record where it is */
+			video_invertchar(console_col * VIDEO_FONT_WIDTH,
+				         console_row * VIDEO_FONT_HEIGHT);
+			old_col = console_col;
+			old_row = console_row;
+		}
+		cursor_state = state;
 	}
-
-	last_state = state;
 }
 #endif
 
@@ -727,19 +737,11 @@ static void console_back(void)
 		if (console_row < 0)
 			console_row = 0;
 	}
-	video_putchar(console_col * VIDEO_FONT_WIDTH,
-		      console_row * VIDEO_FONT_HEIGHT, ' ');
+	CURSOR_SET;
 }
 
 static void console_newline(void)
 {
-	/* Check if last character in the line was just drawn. If so, cursor was
-	   overwriten and need not to be cleared. Cursor clearing without this
-	   check causes overwriting the 1st character of the line if line lenght
-	   is >= CONSOLE_COLS
-	 */
-	if (console_col < CONSOLE_COLS)
-		CURSOR_OFF;
 	console_row++;
 	console_col = 0;
 
@@ -755,7 +757,6 @@ static void console_newline(void)
 
 static void console_cr(void)
 {
-	CURSOR_OFF;
 	console_col = 0;
 }
 
@@ -763,6 +764,8 @@ void video_putc(const char c)
 {
 	static int nl = 1;
 
+	CURSOR_OFF;
+
 	switch (c) {
 	case 13:		/* back to first column */
 		console_cr();
@@ -775,7 +778,6 @@ void video_putc(const char c)
 		break;
 
 	case 9:		/* tab 8 */
-		CURSOR_OFF;
 		console_col |= 0x0008;
 		console_col &= ~0x0007;
 
Signature · 1 line
1.7.3.1
#1 lore raw

PATCH 1/1 Make the software cursor non-destructive

Quoted 6 lines · On Tuesday 08 November 2011 03:59:29 Gabe Black wrote:

When printing the string "\r\n" to the framebuffer console, the first character of the current line was being replaced with a space. The "boot" prompt would become the "oot" prompt. This change makes the cursor non-destructive so that no matter where it goes on its way to where it's supposed to be, the end result is that the cursor is where it's supposed to be with the other text preserved intact.

"preserved intact" ... word for word verbose redundant ? ;)

Quoted 10 lines
drivers/video/cfb_console.c +0 -0
 
 /*
  * Cursor definition:
  * CONFIG_CONSOLE_CURSOR:  Uses a timer function (see

drivers/input/i8042.c)

- *			   to let the cursor blink. Uses the macros
- *			   CURSOR_OFF and CURSOR_ON.
+ *			   to let the cursor blink.

is this intentional ? seems like the existing doc strings are fine ...

drivers/video/cfb_console.c line 248

Quoted 4 lines
drivers/video/cfb_console.c +1 -1
@@ -248,9 +247,9 @@
 
-#define CURSOR_ON  console_cursor(1)
+#define CURSOR_ON console_cursor(1)

unrelated whitespace change

drivers/video/cfb_console.c void console_cursor(int state); · line 270

Quoted 7 lines
drivers/video/cfb_console.c +3 -3
-#define CURSOR_ON
-#define CURSOR_OFF video_putchar(console_col * VIDEO_FONT_WIDTH,\
-				 console_row * VIDEO_FONT_HEIGHT, ' ')
+void	console_cursor (int state);
+#define CURSOR_ON console_cursor(1)
+#define CURSOR_OFF console_cursor(0)
 #define CURSOR_SET video_set_cursor()

so now the CONFIG_CONSOLE_CURSOR and CONFIG_VIDEO_SW_CURSOR code paths wrt CURSOR_* definitions are the same. seems like they should be unified.

drivers/video/cfb_console.c static const int video_font_draw_table32[16][4] = { · line 439

Quoted 1 line
drivers/video/cfb_console.c +1 -0
+static void video_invertchar (int xx, int yy)

no space before that "("

the rest looks fine to me, but let's CC the video maintainer ...
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20111108/1281fd0e/attachment.pgp

author
#2 lore raw

PATCH v2 1/1 Make the software cursor non-destructive

In reply to Gabe Black

When printing the string "\r\n" to the framebuffer console, the first character of the current line was being replaced with a space. The "boot" prompt would become the "oot" prompt. This change makes the cursor non-destructive so that no matter where it goes on its way to where it's supposed to be, the end result is that the cursor is where it's supposed to be with the other text preserved.

---
Changes in v2:
- Tidy up commit message wording.
- Undo change to documenting comment.
- Undo minor whitespace tweak.
- Consolidate CONFIG_CONSOLE_CURSOR and CONFIG_VIDEO_SW_CURSOR.
- Get rid of a space between video_invertchar and its (.

 drivers/video/cfb_console.c |  107 ++++++++++++++++++++----------------------
 1 files changed, 51 insertions(+), 56 deletions(-)
drivers/video/cfb_console.c +51 -56
index 561883a..fe80866 100644
@@ -241,8 +241,9 @@
 #define CURSOR_SET
 #endif
 
-#ifdef	CONFIG_CONSOLE_CURSOR
-#ifdef	CURSOR_ON
+#if defined(CONFIG_CONSOLE_CURSOR) || defined(CONFIG_VIDEO_SW_CURSOR)
+#if defined(CURSOR_ON) || \
+	(defined(CONFIG_CONSOLE_CURSOR) && defined(CONFIG_VIDEO_SW_CURSOR))
 #error	only one of CONFIG_CONSOLE_CURSOR, CONFIG_VIDEO_SW_CURSOR, \
 	or CONFIG_VIDEO_HW_CURSOR can be defined
 #endif
@@ -250,27 +251,18 @@ void console_cursor(int state);
 
 #define CURSOR_ON  console_cursor(1)
 #define CURSOR_OFF console_cursor(0)
-#define CURSOR_SET
+#define CURSOR_SET video_set_cursor()
+#endif /* CONFIG_CONSOLE_CURSOR || CONFIG_VIDEO_SW_CURSOR */
+
+#ifdef	CONFIG_CONSOLE_CURSOR
+#ifndef	CONFIG_CONSOLE_TIME
+#error	CONFIG_CONSOLE_CURSOR must be defined for CONFIG_CONSOLE_TIME
+#endif
 #ifndef CONFIG_I8042_KBD
 #warning Cursor drawing on/off needs timer function s.a. drivers/input/i8042.c
 #endif
-#else
-#ifdef	CONFIG_CONSOLE_TIME
-#error	CONFIG_CONSOLE_CURSOR must be defined for CONFIG_CONSOLE_TIME
-#endif
 #endif /* CONFIG_CONSOLE_CURSOR */
 
-#ifdef	CONFIG_VIDEO_SW_CURSOR
-#ifdef	CURSOR_ON
-#error	only one of CONFIG_CONSOLE_CURSOR, CONFIG_VIDEO_SW_CURSOR, \
-	or CONFIG_VIDEO_HW_CURSOR can be defined
-#endif
-#define CURSOR_ON
-#define CURSOR_OFF video_putchar(console_col * VIDEO_FONT_WIDTH,\
-				 console_row * VIDEO_FONT_HEIGHT, ' ')
-#define CURSOR_SET video_set_cursor()
-#endif /* CONFIG_VIDEO_SW_CURSOR */
-
 
 #ifdef CONFIG_VIDEO_HW_CURSOR
 #ifdef	CURSOR_ON
@@ -374,6 +366,10 @@ static void *video_console_address;	/* console buffer start address */
 
 static int video_logo_height = VIDEO_LOGO_HEIGHT;
 
+static int cursor_state = 0;
+static int old_col = 0;
+static int old_row = 0;
+
 static int console_col;		/* cursor col */
 static int console_row;		/* cursor row */
 
@@ -433,6 +429,22 @@ static const int video_font_draw_table32[16][4] = {
 };
 
 
+static void video_invertchar(int xx, int yy)
+{
+	int firstx = xx * VIDEO_PIXEL_SIZE;
+	int lastx = (xx + VIDEO_FONT_WIDTH) * VIDEO_PIXEL_SIZE;
+	int firsty = yy * VIDEO_LINE_LEN;
+	int lasty = (yy + VIDEO_FONT_HEIGHT) * VIDEO_LINE_LEN;
+	int x, y;
+	for (y = firsty; y < lasty; y += VIDEO_LINE_LEN) {
+		for (x = firstx; x < lastx; x++) {
+			u8 *dest = (u8 *)(video_fb_address) + x + y;
+			*dest = ~*dest;
+		}
+	}
+}
+
+
 static void video_drawchars(int xx, int yy, unsigned char *s, int count)
 {
 	u8 *cdat, *dest, *dest0;
@@ -608,27 +620,15 @@ static void video_putchar(int xx, int yy, unsigned char c)
 #if defined(CONFIG_CONSOLE_CURSOR) || defined(CONFIG_VIDEO_SW_CURSOR)
 static void video_set_cursor(void)
 {
-	/* swap drawing colors */
-	eorx = fgx;
-	fgx = bgx;
-	bgx = eorx;
-	eorx = fgx ^ bgx;
-	/* draw cursor */
-	video_putchar(console_col * VIDEO_FONT_WIDTH,
-		      console_row * VIDEO_FONT_HEIGHT, ' ');
-	/* restore drawing colors */
-	eorx = fgx;
-	fgx = bgx;
-	bgx = eorx;
-	eorx = fgx ^ bgx;
+	if (cursor_state)
+		console_cursor(0);
+	console_cursor(1);
 }
-#endif
 
-#ifdef CONFIG_CONSOLE_CURSOR
+
+
 void console_cursor(int state)
 {
-	static int last_state = 0;
-
 #ifdef CONFIG_CONSOLE_TIME
 	struct rtc_time tm;
 	char info[16];
@@ -650,17 +650,20 @@ void console_cursor(int state)
 	}
 #endif
 
-	if (state && (last_state != state)) {
-		video_set_cursor();
-	}
-
-	if (!state && (last_state != state)) {
-		/* clear cursor */
-		video_putchar(console_col * VIDEO_FONT_WIDTH,
-			      console_row * VIDEO_FONT_HEIGHT, ' ');
+	if (cursor_state != state) {
+		if (cursor_state) {
+			/* turn off the cursor */
+			video_invertchar(old_col * VIDEO_FONT_WIDTH,
+			                 old_row * VIDEO_FONT_HEIGHT);
+		} else {
+			/* turn off the cursor and record where it is */
+			video_invertchar(console_col * VIDEO_FONT_WIDTH,
+				         console_row * VIDEO_FONT_HEIGHT);
+			old_col = console_col;
+			old_row = console_row;
+		}
+		cursor_state = state;
 	}
-
-	last_state = state;
 }
 #endif
 
@@ -727,19 +730,11 @@ static void console_back(void)
 		if (console_row < 0)
 			console_row = 0;
 	}
-	video_putchar(console_col * VIDEO_FONT_WIDTH,
-		      console_row * VIDEO_FONT_HEIGHT, ' ');
+	CURSOR_SET;
 }
 
 static void console_newline(void)
 {
-	/* Check if last character in the line was just drawn. If so, cursor was
-	   overwriten and need not to be cleared. Cursor clearing without this
-	   check causes overwriting the 1st character of the line if line lenght
-	   is >= CONSOLE_COLS
-	 */
-	if (console_col < CONSOLE_COLS)
-		CURSOR_OFF;
 	console_row++;
 	console_col = 0;
 
@@ -755,7 +750,6 @@ static void console_newline(void)
 
 static void console_cr(void)
 {
-	CURSOR_OFF;
 	console_col = 0;
 }
 
@@ -763,6 +757,8 @@ void video_putc(const char c)
 {
 	static int nl = 1;
 
+	CURSOR_OFF;
+
 	switch (c) {
 	case 13:		/* back to first column */
 		console_cr();
@@ -775,7 +771,6 @@ void video_putc(const char c)
 		break;
 
 	case 9:		/* tab 8 */
-		CURSOR_OFF;
 		console_col |= 0x0008;
 		console_col &= ~0x0007;
 
Signature · 1 line
1.7.3.1
#3 lore raw

PATCH v2 1/1 Make the software cursor non-destructive

i don't know the video code all that well, but i don't see anything wrong with this patch ...

-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20111109/9295545e/attachment.pgp

#4 lore raw

PATCH v2 1/1 Make the software cursor non-destructive

Quoted 7 lines · Mike Frysinger

i don't know the video code all that well, but i don't see anything wrong with
this patch ...

-mike

Bump.

#5 lore raw

PATCH v2 1/1 Make the software cursor non-destructive

Hi,

Quoted 11 lines · On Wed, 30 Nov 2011 04:55:52 -0500 Gabe Black <[email protected]> wrote:
Quoted 7 lines · Mike Frysinger

i don't know the video code all that well, but i don't see anything wrong with
this patch ...

-mike

Bump.

This patch is on my TODO list. I'll look at it later today.

Thanks,
Anatolij

#6 lore raw

PATCH v3 1/1 video: cfb_console: Make the software cursor non-destructive

In reply to Gabe Black

From: Gabe Black <[email protected]>

When printing the string "\r\n" to the framebuffer console, the first character of the current line was being replaced with a space. The "boot" prompt would become the "oot" prompt. This change makes the cursor non-destructive so that no matter where it goes on its way to where it's supposed to be, the end result is that the cursor is where it's supposed to be with the other text preserved.

---
Changes in v3:
- fixed checkpatch errors
- slightly modified subject line
- fixed cursor position if video logo is used

Changes in v2:
- Tidy up commit message wording.
- Undo change to documenting comment.
- Undo minor whitespace tweak.
- Consolidate CONFIG_CONSOLE_CURSOR and CONFIG_VIDEO_SW_CURSOR.
- Get rid of a space between video_invertchar and its (.

 drivers/video/cfb_console.c |  109 +++++++++++++++++++++----------------------
 1 files changed, 53 insertions(+), 56 deletions(-)
drivers/video/cfb_console.c +53 -56
index 480df64..9be6166 100644
@@ -242,8 +242,9 @@
 #define CURSOR_SET
 #endif
 
-#ifdef	CONFIG_CONSOLE_CURSOR
-#ifdef	CURSOR_ON
+#if defined(CONFIG_CONSOLE_CURSOR) || defined(CONFIG_VIDEO_SW_CURSOR)
+#if defined(CURSOR_ON) || \
+	(defined(CONFIG_CONSOLE_CURSOR) && defined(CONFIG_VIDEO_SW_CURSOR))
 #error	only one of CONFIG_CONSOLE_CURSOR, CONFIG_VIDEO_SW_CURSOR, \
 	or CONFIG_VIDEO_HW_CURSOR can be defined
 #endif
@@ -251,27 +252,18 @@ void console_cursor(int state);
 
 #define CURSOR_ON  console_cursor(1)
 #define CURSOR_OFF console_cursor(0)
-#define CURSOR_SET
+#define CURSOR_SET video_set_cursor()
+#endif /* CONFIG_CONSOLE_CURSOR || CONFIG_VIDEO_SW_CURSOR */
+
+#ifdef	CONFIG_CONSOLE_CURSOR
+#ifndef	CONFIG_CONSOLE_TIME
+#error	CONFIG_CONSOLE_CURSOR must be defined for CONFIG_CONSOLE_TIME
+#endif
 #ifndef CONFIG_I8042_KBD
 #warning Cursor drawing on/off needs timer function s.a. drivers/input/i8042.c
 #endif
-#else
-#ifdef	CONFIG_CONSOLE_TIME
-#error	CONFIG_CONSOLE_CURSOR must be defined for CONFIG_CONSOLE_TIME
-#endif
 #endif /* CONFIG_CONSOLE_CURSOR */
 
-#ifdef	CONFIG_VIDEO_SW_CURSOR
-#ifdef	CURSOR_ON
-#error	only one of CONFIG_CONSOLE_CURSOR, CONFIG_VIDEO_SW_CURSOR, \
-	or CONFIG_VIDEO_HW_CURSOR can be defined
-#endif
-#define CURSOR_ON
-#define CURSOR_OFF video_putchar(console_col * VIDEO_FONT_WIDTH,\
-				 console_row * VIDEO_FONT_HEIGHT, ' ')
-#define CURSOR_SET video_set_cursor()
-#endif /* CONFIG_VIDEO_SW_CURSOR */
-
 
 #ifdef CONFIG_VIDEO_HW_CURSOR
 #ifdef	CURSOR_ON
@@ -376,6 +368,10 @@ static void *video_console_address;	/* console buffer start address */
 
 static int video_logo_height = VIDEO_LOGO_HEIGHT;
 
+static int cursor_state;
+static int old_col;
+static int old_row;
+
 static int console_col;		/* cursor col */
 static int console_row;		/* cursor row */
 
@@ -435,6 +431,22 @@ static const int video_font_draw_table32[16][4] = {
 };
 
 
+static void video_invertchar(int xx, int yy)
+{
+	int firstx = xx * VIDEO_PIXEL_SIZE;
+	int lastx = (xx + VIDEO_FONT_WIDTH) * VIDEO_PIXEL_SIZE;
+	int firsty = yy * VIDEO_LINE_LEN;
+	int lasty = (yy + VIDEO_FONT_HEIGHT) * VIDEO_LINE_LEN;
+	int x, y;
+	for (y = firsty; y < lasty; y += VIDEO_LINE_LEN) {
+		for (x = firstx; x < lastx; x++) {
+			u8 *dest = (u8 *)(video_fb_address) + x + y;
+			*dest = ~*dest;
+		}
+	}
+}
+
+
 static void video_drawchars(int xx, int yy, unsigned char *s, int count)
 {
 	u8 *cdat, *dest, *dest0;
@@ -610,27 +622,15 @@ static void video_putchar(int xx, int yy, unsigned char c)
 #if defined(CONFIG_CONSOLE_CURSOR) || defined(CONFIG_VIDEO_SW_CURSOR)
 static void video_set_cursor(void)
 {
-	/* swap drawing colors */
-	eorx = fgx;
-	fgx = bgx;
-	bgx = eorx;
-	eorx = fgx ^ bgx;
-	/* draw cursor */
-	video_putchar(console_col * VIDEO_FONT_WIDTH,
-		      console_row * VIDEO_FONT_HEIGHT, ' ');
-	/* restore drawing colors */
-	eorx = fgx;
-	fgx = bgx;
-	bgx = eorx;
-	eorx = fgx ^ bgx;
+	if (cursor_state)
+		console_cursor(0);
+	console_cursor(1);
 }
-#endif
 
-#ifdef CONFIG_CONSOLE_CURSOR
+
+
 void console_cursor(int state)
 {
-	static int last_state = 0;
-
 #ifdef CONFIG_CONSOLE_TIME
 	struct rtc_time tm;
 	char info[16];
@@ -652,17 +652,22 @@ void console_cursor(int state)
 	}
 #endif
 
-	if (state && (last_state != state)) {
-		video_set_cursor();
-	}
-
-	if (!state && (last_state != state)) {
-		/* clear cursor */
-		video_putchar(console_col * VIDEO_FONT_WIDTH,
-			      console_row * VIDEO_FONT_HEIGHT, ' ');
+	if (cursor_state != state) {
+		if (cursor_state) {
+			/* turn off the cursor */
+			video_invertchar(old_col * VIDEO_FONT_WIDTH,
+					 old_row * VIDEO_FONT_HEIGHT +
+					 video_logo_height);
+		} else {
+			/* turn off the cursor and record where it is */
+			video_invertchar(console_col * VIDEO_FONT_WIDTH,
+					 console_row * VIDEO_FONT_HEIGHT +
+					 video_logo_height);
+			old_col = console_col;
+			old_row = console_row;
+		}
+		cursor_state = state;
 	}
-
-	last_state = state;
 }
 #endif
 
@@ -729,19 +734,11 @@ static void console_back(void)
 		if (console_row < 0)
 			console_row = 0;
 	}
-	video_putchar(console_col * VIDEO_FONT_WIDTH,
-		      console_row * VIDEO_FONT_HEIGHT, ' ');
+	CURSOR_SET;
 }
 
 static void console_newline(void)
 {
-	/* Check if last character in the line was just drawn. If so, cursor was
-	   overwriten and need not to be cleared. Cursor clearing without this
-	   check causes overwriting the 1st character of the line if line lenght
-	   is >= CONSOLE_COLS
-	 */
-	if (console_col < CONSOLE_COLS)
-		CURSOR_OFF;
 	console_row++;
 	console_col = 0;
 
@@ -757,7 +754,6 @@ static void console_newline(void)
 
 static void console_cr(void)
 {
-	CURSOR_OFF;
 	console_col = 0;
 }
 
@@ -765,6 +761,8 @@ void video_putc(const char c)
 {
 	static int nl = 1;
 
+	CURSOR_OFF;
+
 	switch (c) {
 	case 13:		/* back to first column */
 		console_cr();
@@ -777,7 +775,6 @@ void video_putc(const char c)
 		break;
 
 	case 9:		/* tab 8 */
-		CURSOR_OFF;
 		console_col |= 0x0008;
 		console_col &= ~0x0007;
 
Signature · 1 line
1.7.1
#7 lore raw

PATCH v3 1/1 video: cfb_console: Make the software cursor non-destructive

Quoted 25 lines · On Thu, 1 Dec 2011 00:50:50 +0100 Anatolij Gustschin <[email protected]> wrote:

From: Gabe Black <[email protected]>

When printing the string "\r\n" to the framebuffer console, the first character of the current line was being replaced with a space. The "boot" prompt would become the "oot" prompt. This change makes the cursor non-destructive so that no matter where it goes on its way to where it's supposed to be, the end result is that the cursor is where it's supposed to be with the other text preserved.

---
Changes in v3:
- fixed checkpatch errors
- slightly modified subject line
- fixed cursor position if video logo is used

Changes in v2:
- Tidy up commit message wording.
- Undo change to documenting comment.
- Undo minor whitespace tweak.
- Consolidate CONFIG_CONSOLE_CURSOR and CONFIG_VIDEO_SW_CURSOR.
- Get rid of a space between video_invertchar and its (.

Quoted 2 lines
 drivers/video/cfb_console.c |  109 +++++++++++++++++++++----------------------
 1 files changed, 53 insertions(+), 56 deletions(-)

Applied to u-boot-video/master. Thanks!

Anatolij

#8 lore raw

PATCH v3 1/1 video: cfb_console: Make the software cursor non-destructive

Dear Anatolij Gustschin,

Quoted 28 lines · In message <20111205220742.18ed6e2f@wker> you wrote:
Quoted 25 lines · On Thu, 1 Dec 2011 00:50:50 +0100 Anatolij Gustschin <[email protected]> wrote:

From: Gabe Black <[email protected]>

When printing the string "\r\n" to the framebuffer console, the first character of the current line was being replaced with a space. The "boot" prompt would become the "oot" prompt. This change makes the cursor non-destructive so that no matter where it goes on its way to where it's supposed to be, the end result is that the cursor is where it's supposed to be with the other text preserved.

---
Changes in v3:
- fixed checkpatch errors
- slightly modified subject line
- fixed cursor position if video logo is used

Changes in v2:
- Tidy up commit message wording.
- Undo change to documenting comment.
- Undo minor whitespace tweak.
- Consolidate CONFIG_CONSOLE_CURSOR and CONFIG_VIDEO_SW_CURSOR.
- Get rid of a space between video_invertchar and its (.

Quoted 4 lines
Quoted 2 lines
 drivers/video/cfb_console.c |  109 +++++++++++++++++++++----------------------
 1 files changed, 53 insertions(+), 56 deletions(-)

Applied to u-boot-video/master. Thanks!

It appears this has not made it into mainline yet.

Is it still queued in your repo? Do you intend to send a pull request any time soon?

Best regards,

Wolfgang Denk

Signature · 4 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
Why is an average signature file longer than an average Perl script??
#9 lore raw

PATCH v3 1/1 video: cfb_console: Make the software cursor non-destructive

Hello Wolfgang,

On Sun, 18 Mar 2012 19:38:57 +0100
Wolfgang Denk <[email protected]> wrote:
...

Quoted 9 lines
Quoted 4 lines
Quoted 2 lines
 drivers/video/cfb_console.c |  109 +++++++++++++++++++++----------------------
 1 files changed, 53 insertions(+), 56 deletions(-)

Applied to u-boot-video/master. Thanks!

It appears this has not made it into mainline yet.

Is it still queued in your repo? Do you intend to send a pull request any time soon?

This patch was included in my last pull request and is already in mainline [1]. Unfortunately it caused some issues on N900 as reported by Pali Roh?r. He already tested my another testing patch for fixing these issues and I'm working on a final patch for mainline and intend to submit this final patch for inclusion into upcoming release.

Best regards,
Anatolij

[1] http://git.denx.de/?p=u-boot.git;a=commit;h=03d31fcf4c37d90a00e66f06b38742960139f090

#10 lore raw

PATCH v3 1/1 video: cfb_console: Make the software cursor non-destructive

Dear Anatolij Gustschin,

Quoted 3 lines · In message <20120318200142.5b4d5dba@wker> you wrote:

This patch was included in my last pull request and is already in mainline [1]. Unfortunately it caused some issues on N900 as reported

Strange. I don;t know how I missed it. Thanks.

Quoted 3 lines

by Pali Roh?r. He already tested my another testing patch for fixing these issues and I'm working on a final patch for mainline and intend to submit this final patch for inclusion into upcoming release.

Thanks.

Best regards,

Wolfgang Denk

Signature · 8 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
A UNIX saleslady, Lenore,
Enjoys work, but she likes the beach more.
        She found a good way
        To combine work and play:
She sells C shells by the seashore.