提交 58c733a7 编写于 作者: S Simon Glass 提交者: Anatolij Gustschin

video: Provide a signal when a new console line is started

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: NSimon Glass <sjg@chromium.org>
上级 c5b77d01
...@@ -47,6 +47,15 @@ int vidconsole_set_row(struct udevice *dev, uint row, int clr) ...@@ -47,6 +47,15 @@ int vidconsole_set_row(struct udevice *dev, uint row, int clr)
return ops->set_row(dev, row, 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 */ /* Move backwards one space */
static void vidconsole_back(struct udevice *dev) static void vidconsole_back(struct udevice *dev)
{ {
...@@ -82,6 +91,8 @@ static void vidconsole_newline(struct udevice *dev) ...@@ -82,6 +91,8 @@ static void vidconsole_newline(struct udevice *dev)
vid_priv->colour_bg); vid_priv->colour_bg);
priv->ycur -= rows * priv->y_charsize; priv->ycur -= rows * priv->y_charsize;
} }
priv->last_ch = 0;
video_sync(dev->parent); video_sync(dev->parent);
} }
...@@ -99,6 +110,7 @@ int vidconsole_put_char(struct udevice *dev, char ch) ...@@ -99,6 +110,7 @@ int vidconsole_put_char(struct udevice *dev, char ch)
break; break;
case '\n': case '\n':
vidconsole_newline(dev); vidconsole_newline(dev);
vidconsole_entry_start(dev);
break; break;
case '\t': /* Tab (8 chars alignment) */ case '\t': /* Tab (8 chars alignment) */
priv->xcur_frac = ((priv->xcur_frac / priv->tab_width_frac) priv->xcur_frac = ((priv->xcur_frac / priv->tab_width_frac)
...@@ -109,6 +121,7 @@ int vidconsole_put_char(struct udevice *dev, char ch) ...@@ -109,6 +121,7 @@ int vidconsole_put_char(struct udevice *dev, char ch)
break; break;
case '\b': case '\b':
vidconsole_back(dev); vidconsole_back(dev);
priv->last_ch = 0;
break; break;
default: default:
/* /*
...@@ -125,6 +138,7 @@ int vidconsole_put_char(struct udevice *dev, char ch) ...@@ -125,6 +138,7 @@ int vidconsole_put_char(struct udevice *dev, char ch)
if (ret < 0) if (ret < 0)
return ret; return ret;
priv->xcur_frac += ret; priv->xcur_frac += ret;
priv->last_ch = ch;
if (priv->xcur_frac >= priv->xsize_frac) if (priv->xcur_frac >= priv->xsize_frac)
vidconsole_newline(dev); vidconsole_newline(dev);
break; break;
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
* @tab_width_frac: Tab width in fractional units * @tab_width_frac: Tab width in fractional units
* @xsize_frac: Width of the display in fractional units * @xsize_frac: Width of the display in fractional units
* @xstart_frac: Left margin for the text console 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 vidconsole_priv {
struct stdio_dev sdev; struct stdio_dev sdev;
...@@ -40,6 +41,7 @@ struct vidconsole_priv { ...@@ -40,6 +41,7 @@ struct vidconsole_priv {
int tab_width_frac; int tab_width_frac;
int xsize_frac; int xsize_frac;
int xstart_frac; int xstart_frac;
int last_ch;
}; };
/** /**
...@@ -87,6 +89,18 @@ struct vidconsole_ops { ...@@ -87,6 +89,18 @@ struct vidconsole_ops {
* @return 0 if OK, -ve on error * @return 0 if OK, -ve on error
*/ */
int (*set_row)(struct udevice *dev, uint row, int clr); 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 */ /* Get a pointer to the driver operations for a video console device */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册