video: Provide a backspace method
authorSimon Glass <sjg@chromium.org>
Fri, 15 Jan 2016 01:10:41 +0000 (18:10 -0700)
committerAnatolij Gustschin <agust@denx.de>
Sat, 30 Jan 2016 09:55:37 +0000 (10:55 +0100)
With proportional fonts the vidconsole uclass cannot itself erase the
previous character. Provide an optional method so that the driver can
handle this operation.

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

index bea563a..f6326b6 100644 (file)
@@ -57,9 +57,17 @@ static int vidconsole_entry_start(struct udevice *dev)
 }
 
 /* Move backwards one space */
-static void vidconsole_back(struct udevice *dev)
+static int vidconsole_back(struct udevice *dev)
 {
        struct vidconsole_priv *priv = dev_get_uclass_priv(dev);
+       struct vidconsole_ops *ops = vidconsole_get_ops(dev);
+       int ret;
+
+       if (ops->backspace) {
+               ret = ops->backspace(dev);
+               if (ret != -ENOSYS)
+                       return ret;
+       }
 
        priv->xcur_frac -= VID_TO_POS(priv->x_charsize);
        if (priv->xcur_frac < priv->xstart_frac) {
@@ -69,6 +77,8 @@ static void vidconsole_back(struct udevice *dev)
                if (priv->ycur < 0)
                        priv->ycur = 0;
        }
+
+       return 0;
 }
 
 /* Move to a newline, scrolling the display if necessary */
index 36c4e13..2604793 100644 (file)
@@ -101,6 +101,20 @@ struct vidconsole_ops {
         * positions.
         */
        int (*entry_start)(struct udevice *dev);
+
+       /**
+        * backspace() - Handle erasing the last character
+        *
+        * With proportional fonts the vidconsole uclass cannot itself erase
+        * the previous character. This optional method will be called when
+        * a backspace is needed. The driver should erase the previous
+        * character and update the cursor position (xcur_frac, ycur) to the
+        * start of the previous character.
+        *
+        * If not implement, default behaviour will work for fixed-width
+        * characters.
+        */
+       int (*backspace)(struct udevice *dev);
 };
 
 /* Get a pointer to the driver operations for a video console device */