* console_cursor_fix - fix cursor position (check for out of screen)
 * console_cursor_up, console_cursor_down, console_cursor_left,
   console_cursor_right, console_cursor_set_position for change cursor position
 * console_newline - added param to specify count of creating new lines
 * console_previewsline - opposite of console_newline

Signed-off-by: Pali Rohár <pali.ro...@gmail.com>
---
Changes since original version:
   - Fixed commit message

 drivers/video/cfb_console.c |   64 +++++++++++++++++++++++++++++++++++++++----
 1 file changed, 58 insertions(+), 6 deletions(-)

diff --git a/drivers/video/cfb_console.c b/drivers/video/cfb_console.c
index 0d1e6b2..43eb994 100644
--- a/drivers/video/cfb_console.c
+++ b/drivers/video/cfb_console.c
@@ -771,9 +771,54 @@ static void console_back(void)
        }
 }
 
-static void console_newline(void)
+static void console_cursor_fix(void)
 {
-       console_row++;
+       if (console_row < 0)
+               console_row = 0;
+       if (console_row >= CONSOLE_ROWS)
+               console_row = CONSOLE_ROWS-1;
+       if (console_col < 0)
+               console_col = 0;
+       if (console_col >= CONSOLE_COLS)
+               console_col = CONSOLE_COLS-1;
+}
+
+static void console_cursor_up(int n)
+{
+       console_row -= n;
+       console_cursor_fix();
+}
+
+static void console_cursor_down(int n)
+{
+       console_row += n;
+       console_cursor_fix();
+}
+
+static void console_cursor_left(int n)
+{
+       console_col -= n;
+       console_cursor_fix();
+}
+
+static void console_cursor_right(int n)
+{
+       console_col += n;
+       console_cursor_fix();
+}
+
+static void console_cursor_set_position(int row, int col)
+{
+       if (console_row != -1)
+               console_row = row;
+       if (console_col != -1)
+               console_col = col;
+       console_cursor_fix();
+}
+
+static void console_newline(int n)
+{
+       console_row += n;
        console_col = 0;
 
        /* Check if we need to scroll the terminal */
@@ -782,10 +827,17 @@ static void console_newline(void)
                console_scrollup();
 
                /* Decrement row number */
-               console_row--;
+               console_row = CONSOLE_ROWS-1;
        }
 }
 
+static void console_previewsline(int n)
+{
+       /* FIXME: also scroll terminal ? */
+       console_row -= n;
+       console_cursor_fix();
+}
+
 static void console_cr(void)
 {
        console_col = 0;
@@ -804,7 +856,7 @@ void video_putc(const char c)
 
        case '\n':              /* next line */
                if (console_col || (!console_col && nl))
-                       console_newline();
+                       console_newline(1);
                nl = 1;
                break;
 
@@ -813,7 +865,7 @@ void video_putc(const char c)
                console_col &= ~0x0007;
 
                if (console_col >= CONSOLE_COLS)
-                       console_newline();
+                       console_newline(1);
                break;
 
        case 8:         /* backspace */
@@ -827,7 +879,7 @@ void video_putc(const char c)
 
                /* check for newline */
                if (console_col >= CONSOLE_COLS) {
-                       console_newline();
+                       console_newline(1);
                        nl = 0;
                }
        }
-- 
1.7.9.5

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to