[U-Boot] [PATCH 07/19] video: Provide a signal when a new console line is started

Simon Glass
2016-01-15T01:10:40Z

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 | 14 ++++++++++++++
include/video_console.h | 14 ++++++++++++++
2 files changed, 28 insertions(+)

diff --git a/drivers/video/vidconsole-uclass.c b/drivers/video/vidconsole-uclass.c
index fec4a60..182aaed 100644
--- a/drivers/video/vidconsole-uclass.c
+++ b/drivers/video/vidconsole-uclass.c
@@ -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;
diff --git a/include/video_console.h b/include/video_console.h
index 3bfc37f..80bc948 100644
--- a/include/video_console.h
+++ b/include/video_console.h
@@ -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 */
--
2.6.0.rc2.230.g3dd15c0