[PATCH 2/6] expo: Indicate with the pointed-to item has changed
Simon Glass
sjg at chromium.org
Sat May 24 17:41:08 CEST 2025
Allow the caller to detect when a keypress has actually resulted in a
change of the item that is pointed to.
Signed-off-by: Simon Glass <sjg at chromium.org>
---
boot/scene_menu.c | 22 ++++++++++++++++------
include/expo.h | 3 +++
2 files changed, 19 insertions(+), 6 deletions(-)
diff --git a/boot/scene_menu.c b/boot/scene_menu.c
index fd16cad6521..fe44bd42133 100644
--- a/boot/scene_menu.c
+++ b/boot/scene_menu.c
@@ -410,6 +410,7 @@ int scene_menu_send_key(struct scene *scn, struct scene_obj_menu *menu, int key,
{
const bool open = menu->obj.flags & SCENEOF_OPEN;
struct scene_menitem *item, *cur, *key_item;
+ bool changed = false;
cur = NULL;
key_item = NULL;
@@ -433,19 +434,28 @@ int scene_menu_send_key(struct scene *scn, struct scene_obj_menu *menu, int key,
struct scene_menitem, sibling)) {
item = list_entry(item->sibling.prev,
struct scene_menitem, sibling);
- event->type = EXPOACT_POINT_ITEM;
- event->select.id = item->id;
- log_debug("up to item %d\n", event->select.id);
+ changed = true;
}
+ /*
+ * issue an event even if the pointer did not move, so the
+ * caller knows that an attempt was made, e.g. to cancel an
+ * autoboot timeout
+ */
+ event->type = EXPOACT_POINT_ITEM;
+ event->select.id = item->id;
+ event->select.changed = changed;
+ log_debug("up to item %d\n", event->select.id);
break;
case BKEY_DOWN:
if (!list_is_last(&item->sibling, &menu->item_head)) {
item = list_entry(item->sibling.next,
struct scene_menitem, sibling);
- event->type = EXPOACT_POINT_ITEM;
- event->select.id = item->id;
- log_debug("down to item %d\n", event->select.id);
+ changed = true;
}
+ event->type = EXPOACT_POINT_ITEM;
+ event->select.id = item->id;
+ event->select.changed = changed;
+ log_debug("down to item %d\n", event->select.id);
break;
case BKEY_SELECT:
event->type = EXPOACT_SELECT;
diff --git a/include/expo.h b/include/expo.h
index 5eb3299284c..6acbc54c648 100644
--- a/include/expo.h
+++ b/include/expo.h
@@ -65,12 +65,15 @@ enum expoact_type {
* @type: Action type (EXPOACT_NONE if there is no action)
* @select: Used for EXPOACT_POINT_ITEM and EXPOACT_SELECT
* @select.id: ID number of the object affected.
+ * @select.changed: true if the selection has changed since last time (only
+ * valid for EXPOACT_POINT_ITEM)
*/
struct expo_action {
enum expoact_type type;
union {
struct {
int id;
+ bool changed;
} select;
};
};
--
2.43.0
base-commit: e3ced530e543c9f24cbc66430abc6109ce8df015
branch: expa
More information about the U-Boot
mailing list