]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
video: Allow saving and restoring text-entry state
authorSimon Glass <sjg@chromium.org>
Mon, 2 Oct 2023 01:13:19 +0000 (19:13 -0600)
committerTom Rini <trini@konsulko.com>
Wed, 11 Oct 2023 19:43:55 +0000 (15:43 -0400)
Text entry operates within a context which includes quite a bit of
information. For example, with Truetype fonts, each character in the
text string has a position stored, so that it is possible to
backspace to that character. This information is built up as strings
are drawn on the display.

For the command line, there is just a single context. It is created
when command-line entry starts and it is destroyed (or at least not
needed anymore) when the user presses <enter> to enter the command.

By contrast, expo needs to be able to switch in and out of a text-entry
context, since it is also displaying other objects in the scene.

Add a way to save and restore the entry context for a vidconsole. This
is only needed for the truetype vidconsole, so add a method for that,
storing the information in an abuf struct.

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

index 8ed79c37676c34a463e72eb1cfff4db416f2357a..1ce01a96bb6c92d187a73af6486cf6158991ee2e 100644 (file)
@@ -4,6 +4,7 @@
  */
 
 #include <common.h>
+#include <abuf.h>
 #include <dm.h>
 #include <log.h>
 #include <malloc.h>
@@ -175,6 +176,17 @@ struct console_tt_priv {
        int pos_ptr;
 };
 
+/**
+ * struct console_tt_store - Format used for save/restore of entry information
+ *
+ * @priv: Private data
+ * @cur: Current cursor position
+ */
+struct console_tt_store {
+       struct console_tt_priv priv;
+       struct pos_info cur;
+};
+
 static int console_truetype_set_row(struct udevice *dev, uint row, int clr)
 {
        struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent);
@@ -780,6 +792,45 @@ static int truetype_nominal(struct udevice *dev, const char *name, uint size,
        return 0;
 }
 
+static int truetype_entry_save(struct udevice *dev, struct abuf *buf)
+{
+       struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev);
+       struct console_tt_priv *priv = dev_get_priv(dev);
+       struct console_tt_store store;
+       const uint size = sizeof(store);
+
+       /*
+        * store the whole priv structure as it is simpler that picking out
+        * what we need
+        */
+       if (!abuf_realloc(buf, size))
+               return log_msg_ret("sav", -ENOMEM);
+
+       store.priv = *priv;
+       store.cur.xpos_frac = vc_priv->xcur_frac;
+       store.cur.ypos  = vc_priv->ycur;
+       memcpy(abuf_data(buf), &store, size);
+
+       return 0;
+}
+
+static int truetype_entry_restore(struct udevice *dev, struct abuf *buf)
+{
+       struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev);
+       struct console_tt_priv *priv = dev_get_priv(dev);
+       struct console_tt_store store;
+
+       memcpy(&store, abuf_data(buf), sizeof(store));
+
+       vc_priv->xcur_frac = store.cur.xpos_frac;
+       vc_priv->ycur = store.cur.ypos;
+       priv->pos_ptr = store.priv.pos_ptr;
+       memcpy(priv->pos, store.priv.pos,
+              store.priv.pos_ptr * sizeof(struct pos_info));
+
+       return 0;
+}
+
 const char *console_truetype_get_font_size(struct udevice *dev, uint *sizep)
 {
        struct console_tt_priv *priv = dev_get_priv(dev);
@@ -833,6 +884,8 @@ struct vidconsole_ops console_truetype_ops = {
        .select_font    = truetype_select_font,
        .measure        = truetype_measure,
        .nominal        = truetype_nominal,
+       .entry_save     = truetype_entry_save,
+       .entry_restore  = truetype_entry_restore,
 };
 
 U_BOOT_DRIVER(vidconsole_truetype) = {
index 23b1b81731bc5c079349d2c4f2bba144ee8d61c4..07427ba346b0166f9c3acc60a303df38ae63fa37 100644 (file)
@@ -10,6 +10,7 @@
 #define LOG_CATEGORY UCLASS_VIDEO_CONSOLE
 
 #include <common.h>
+#include <abuf.h>
 #include <command.h>
 #include <console.h>
 #include <log.h>
@@ -640,6 +641,37 @@ int vidconsole_nominal(struct udevice *dev, const char *name, uint size,
        return 0;
 }
 
+int vidconsole_entry_save(struct udevice *dev, struct abuf *buf)
+{
+       struct vidconsole_ops *ops = vidconsole_get_ops(dev);
+       int ret;
+
+       if (ops->measure) {
+               ret = ops->entry_save(dev, buf);
+               if (ret != -ENOSYS)
+                       return ret;
+       }
+
+       /* no data so make sure the buffer is empty */
+       abuf_realloc(buf, 0);
+
+       return 0;
+}
+
+int vidconsole_entry_restore(struct udevice *dev, struct abuf *buf)
+{
+       struct vidconsole_ops *ops = vidconsole_get_ops(dev);
+       int ret;
+
+       if (ops->measure) {
+               ret = ops->entry_restore(dev, buf);
+               if (ret != -ENOSYS)
+                       return ret;
+       }
+
+       return 0;
+}
+
 void vidconsole_push_colour(struct udevice *dev, enum colour_idx fg,
                            enum colour_idx bg, struct vidconsole_colour *old)
 {
index 5234c85efd6f30467c4bb4f63ce3089de5c16ba5..28d65451889a96dd1a1c566c21b2abc542806659 100644 (file)
@@ -8,6 +8,7 @@
 
 #include <video.h>
 
+struct abuf;
 struct video_priv;
 
 #define VID_FRAC_DIV   256
@@ -239,6 +240,30 @@ struct vidconsole_ops {
         */
        int (*nominal)(struct udevice *dev, const char *name, uint size,
                       uint num_chars, struct vidconsole_bbox *bbox);
+
+       /**
+        * entry_save() - Save any text-entry information for later use
+        *
+        * Saves text-entry context such as a list of positions for each
+        * character in the string.
+        *
+        * @dev: Console device to use
+        * @buf: Buffer to hold saved data
+        * Return: 0 if OK, -ENOMEM if out of memory
+        */
+       int (*entry_save)(struct udevice *dev, struct abuf *buf);
+
+       /**
+        * entry_restore() - Restore text-entry information for current use
+        *
+        * Restores text-entry context such as a list of positions for each
+        * character in the string.
+        *
+        * @dev: Console device to use
+        * @buf: Buffer containing data to restore
+        * Return: 0 if OK, -ve on error
+        */
+       int (*entry_restore)(struct udevice *dev, struct abuf *buf);
 };
 
 /* Get a pointer to the driver operations for a video console device */
@@ -293,6 +318,30 @@ int vidconsole_measure(struct udevice *dev, const char *name, uint size,
 int vidconsole_nominal(struct udevice *dev, const char *name, uint size,
                       uint num_chars, struct vidconsole_bbox *bbox);
 
+/**
+ * vidconsole_entry_save() - Save any text-entry information for later use
+ *
+ * Saves text-entry context such as a list of positions for each
+ * character in the string.
+ *
+ * @dev: Console device to use
+ * @buf: Buffer to hold saved data
+ * Return: 0 if OK, -ENOMEM if out of memory
+ */
+int vidconsole_entry_save(struct udevice *dev, struct abuf *buf);
+
+/**
+ * entry_restore() - Restore text-entry information for current use
+ *
+ * Restores text-entry context such as a list of positions for each
+ * character in the string.
+ *
+ * @dev: Console device to use
+ * @buf: Buffer containing data to restore
+ * Return: 0 if OK, -ve on error
+ */
+int vidconsole_entry_restore(struct udevice *dev, struct abuf *buf);
+
 /**
  * vidconsole_push_colour() - Temporarily change the font colour
  *