]> git.sur5r.net Git - u-boot/commitdiff
video: Provide a signal when a new console line is started
authorSimon Glass <sjg@chromium.org>
Fri, 15 Jan 2016 01:10:40 +0000 (18:10 -0700)
committerAnatolij Gustschin <agust@denx.de>
Sat, 30 Jan 2016 09:55:27 +0000 (10:55 +0100)
When we start a new line (due to the user pressing return), signal this to
the driver so that it can flush its buffer of character positions.

Signed-off-by: Simon Glass <sjg@chromium.org>
drivers/video/vidconsole-uclass.c
include/video_console.h

index 884db01f067eab6f64bef98b8f4d545c75a3bc4a..bea563a6c5b7ebf25334df75aab8194842b8432b 100644 (file)
@@ -47,6 +47,15 @@ int vidconsole_set_row(struct udevice *dev, uint row, int clr)
        return ops->set_row(dev, row, clr);
 }
 
+static int vidconsole_entry_start(struct udevice *dev)
+{
+       struct vidconsole_ops *ops = vidconsole_get_ops(dev);
+
+       if (!ops->entry_start)
+               return -ENOSYS;
+       return ops->entry_start(dev);
+}
+
 /* Move backwards one space */
 static void vidconsole_back(struct udevice *dev)
 {
@@ -82,6 +91,8 @@ static void vidconsole_newline(struct udevice *dev)
                                           vid_priv->colour_bg);
                priv->ycur -= rows * priv->y_charsize;
        }
+       priv->last_ch = 0;
+
        video_sync(dev->parent);
 }
 
@@ -99,6 +110,7 @@ int vidconsole_put_char(struct udevice *dev, char ch)
                break;
        case '\n':
                vidconsole_newline(dev);
+               vidconsole_entry_start(dev);
                break;
        case '\t':      /* Tab (8 chars alignment) */
                priv->xcur_frac = ((priv->xcur_frac / priv->tab_width_frac)
@@ -109,6 +121,7 @@ int vidconsole_put_char(struct udevice *dev, char ch)
                break;
        case '\b':
                vidconsole_back(dev);
+               priv->last_ch = 0;
                break;
        default:
                /*
@@ -125,6 +138,7 @@ int vidconsole_put_char(struct udevice *dev, char ch)
                if (ret < 0)
                        return ret;
                priv->xcur_frac += ret;
+               priv->last_ch = ch;
                if (priv->xcur_frac >= priv->xsize_frac)
                        vidconsole_newline(dev);
                break;
index cbbf1345f8797663df9652ea5626dfa907574e87..36c4e138122c70dac3f6080c1e81a02988b4b45b 100644 (file)
@@ -28,6 +28,7 @@
  * @tab_width_frac:    Tab width in fractional units
  * @xsize_frac:        Width of the display in fractional units
  * @xstart_frac:       Left margin for the text console in fractional units
+ * @last_ch:   Last character written to the text console on this line
  */
 struct vidconsole_priv {
        struct stdio_dev sdev;
@@ -40,6 +41,7 @@ struct vidconsole_priv {
        int tab_width_frac;
        int xsize_frac;
        int xstart_frac;
+       int last_ch;
 };
 
 /**
@@ -87,6 +89,18 @@ struct vidconsole_ops {
         * @return 0 if OK, -ve on error
         */
        int (*set_row)(struct udevice *dev, uint row, int clr);
+
+       /**
+        * entry_start() - Indicate that text entry is starting afresh
+        *
+        * Consoles which use proportional fonts need to track the position of
+        * each character output so that backspace will return to the correct
+        * place. This method signals to the console driver that a new entry
+        * line is being start (e.g. the user pressed return to start a new
+        * command). The driver can use this signal to empty its list of
+        * positions.
+        */
+       int (*entry_start)(struct udevice *dev);
 };
 
 /* Get a pointer to the driver operations for a video console device */