[Concept,07/36] expo: Move and generalise scene_textline_send_key()

Message ID 20260120231814.2033069-8-sjg@u-boot.org
State New
Headers
Series video: Add multiple-context support to vidconsole (part F) |

Commit Message

Simon Glass Jan. 20, 2026, 11:17 p.m. UTC
  From: Simon Glass <simon.glass@canonical.com>

Move scene_textline_send_key() from scene_textline.c to scene_txtin.c
and rename it to scene_txtin_send_key(). Change the signature to take
a scene_obj and scene_txtin instead of scene_obj_textline, allowing it
to be used for both textline and textedit objects.

The scene is now obtained from obj->scene rather than being passed as
a separate parameter.

Co-developed-by: Claude Opus 4.5 <noreply@anthropic.com>
Signed-off-by: Simon Glass <simon.glass@canonical.com>
---

 boot/scene.c          | 22 +++++++------------
 boot/scene_internal.h | 10 ++++-----
 boot/scene_textline.c | 47 -----------------------------------------
 boot/scene_txtin.c    | 49 +++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 62 insertions(+), 66 deletions(-)
  

Patch

diff --git a/boot/scene.c b/boot/scene.c
index 16814d53b65..2627335c0e8 100644
--- a/boot/scene.c
+++ b/boot/scene.c
@@ -1176,27 +1176,21 @@  int scene_send_key(struct scene *scn, int key, struct expo_action *event)
 				return log_msg_ret("key", ret);
 			break;
 		}
-		case SCENEOBJT_TEXTLINE: {
-			struct scene_obj_textline *tline;
-
-			tline = (struct scene_obj_textline *)cur,
-			ret = scene_textline_send_key(scn, tline, key, event);
+		case SCENEOBJT_TEXTLINE:
+		case SCENEOBJT_TEXTEDIT:
+			ret = scene_txtin_send_key(cur, scene_obj_txtin(cur),
+						   key, event);
 			if (ret)
 				return log_msg_ret("key", ret);
 			break;
 		}
-		case SCENEOBJT_TEXTEDIT:
-			/* TODO(sjg@chromium.org): Implement this */
-			break;
-		}
 		return 0;
 	}
 
-	if (cur && cur->type == SCENEOBJT_TEXTLINE) {
-		struct scene_obj_textline *tline;
-
-		tline = (struct scene_obj_textline *)cur;
-		ret = scene_textline_send_key(scn, tline, key, event);
+	if (cur && (cur->type == SCENEOBJT_TEXTLINE ||
+		    cur->type == SCENEOBJT_TEXTEDIT)) {
+		ret = scene_txtin_send_key(cur, scene_obj_txtin(cur),
+					   key, event);
 		if (ret)
 			return log_msg_ret("key", ret);
 		return 0;
diff --git a/boot/scene_internal.h b/boot/scene_internal.h
index e732650b99f..733f0c0f6ca 100644
--- a/boot/scene_internal.h
+++ b/boot/scene_internal.h
@@ -227,16 +227,16 @@  int scene_menu_send_click(struct scene *scn, struct scene_obj_menu *menu, int x,
 			  int y, struct expo_action *event);
 
 /**
- * scene_textline_send_key() - Send a key to a textline for processing
+ * scene_txtin_send_key() - Send a key to a text-input object for processing
  *
- * @scn: Scene to use
- * @tline: textline to use
+ * @obj: Object to use
+ * @tin: Text-input info
  * @key: Key code to send (KEY_...)
  * @event: Place to put any event which is generated by the key
  * Returns: 0 if OK (always)
  */
-int scene_textline_send_key(struct scene *scn, struct scene_obj_textline *tline,
-			    int key, struct expo_action *event);
+int scene_txtin_send_key(struct scene_obj *obj, struct scene_txtin *tin,
+			 int key, struct expo_action *event);
 
 /**
  * scene_menu_destroy() - Destroy a menu in a scene
diff --git a/boot/scene_textline.c b/boot/scene_textline.c
index 9b5c40462fd..304a6d914cd 100644
--- a/boot/scene_textline.c
+++ b/boot/scene_textline.c
@@ -98,53 +98,6 @@  int scene_textline_arrange(struct scene *scn, struct expo_arrange_info *arr,
 	return 0;
 }
 
-int scene_textline_send_key(struct scene *scn, struct scene_obj_textline *tline,
-			    int key, struct expo_action *event)
-{
-	const bool open = tline->obj.flags & SCENEOF_OPEN;
-
-	log_debug("key=%d\n", key);
-	switch (key) {
-	case BKEY_QUIT:
-		if (open) {
-			event->type = EXPOACT_CLOSE;
-			event->select.id = tline->obj.id;
-
-			/* Copy the backup text from the scene buffer */
-			memcpy(abuf_data(&tline->tin.buf), abuf_data(&scn->buf),
-			       abuf_size(&scn->buf));
-
-			scene_txtin_close(scn);
-		} else {
-			event->type = EXPOACT_QUIT;
-			log_debug("menu quit\n");
-		}
-		break;
-	case BKEY_SELECT:
-		if (!open)
-			break;
-		event->type = EXPOACT_CLOSE;
-		event->select.id = tline->obj.id;
-		key = '\n';
-		fallthrough;
-	default: {
-		struct udevice *cons = scn->expo->cons;
-		int ret;
-
-		ret = vidconsole_entry_restore(cons, &scn->entry_save);
-		if (ret)
-			return log_msg_ret("sav", ret);
-		ret = cread_line_process_ch(&scn->cls, key);
-		ret = vidconsole_entry_save(cons, &scn->entry_save);
-		if (ret)
-			return log_msg_ret("sav", ret);
-		break;
-	}
-	}
-
-	return 0;
-}
-
 bool scene_textline_within(const struct scene *scn,
 			   struct scene_obj_textline *tline, int x, int y)
 {
diff --git a/boot/scene_txtin.c b/boot/scene_txtin.c
index 3944bce9a96..d08b9e4ff0f 100644
--- a/boot/scene_txtin.c
+++ b/boot/scene_txtin.c
@@ -8,6 +8,7 @@ 
 
 #define LOG_CATEGORY	LOGC_EXPO
 
+#include <cli.h>
 #include <expo.h>
 #include <log.h>
 #include <menu.h>
@@ -157,3 +158,51 @@  void scene_txtin_calc_bbox(struct scene_obj *obj, struct scene_txtin *tin,
 	edit_bbox->valid = false;
 	scene_bbox_union(scn, tin->edit_id, inset, edit_bbox);
 }
+
+int scene_txtin_send_key(struct scene_obj *obj, struct scene_txtin *tin,
+			 int key, struct expo_action *event)
+{
+	const bool open = obj->flags & SCENEOF_OPEN;
+	struct scene *scn = obj->scene;
+
+	log_debug("key=%d\n", key);
+	switch (key) {
+	case BKEY_QUIT:
+		if (open) {
+			event->type = EXPOACT_CLOSE;
+			event->select.id = obj->id;
+
+			/* Copy the backup text from the scene buffer */
+			memcpy(abuf_data(&tin->buf), abuf_data(&scn->buf),
+			       abuf_size(&scn->buf));
+
+			scene_txtin_close(scn);
+		} else {
+			event->type = EXPOACT_QUIT;
+			log_debug("menu quit\n");
+		}
+		break;
+	case BKEY_SELECT:
+		if (!open)
+			break;
+		event->type = EXPOACT_CLOSE;
+		event->select.id = obj->id;
+		key = '\n';
+		fallthrough;
+	default: {
+		struct udevice *cons = scn->expo->cons;
+		int ret;
+
+		ret = vidconsole_entry_restore(cons, &scn->entry_save);
+		if (ret)
+			return log_msg_ret("sav", ret);
+		ret = cread_line_process_ch(&scn->cls, key);
+		ret = vidconsole_entry_save(cons, &scn->entry_save);
+		if (ret)
+			return log_msg_ret("sav", ret);
+		break;
+	}
+	}
+
+	return 0;
+}