expo: Provide access to the current menu item

Add functions to allow a caller to find out the current menu item and to
select a different one.

Update the event handling so that an attempt to change the current item
(e.g. by pressing the up-arrow key) is reported to the caller, since
this may be used to cancel an autoboot timeout.

Signed-off-by: Simon Glass <sjg@chromium.org>
diff --git a/boot/scene_menu.c b/boot/scene_menu.c
index 17150af..06d7e9f 100644
--- a/boot/scene_menu.c
+++ b/boot/scene_menu.c
@@ -121,12 +121,21 @@
  *
  * Sets the currently pointed-to / highlighted menu item
  */
-static void menu_point_to_item(struct scene_obj_menu *menu, uint item_id)
+static int menu_point_to_item(struct scene_obj_menu *menu, uint item_id)
 {
-	if (menu->cur_item_id)
-		update_pointers(menu, menu->cur_item_id, false);
+	int ret;
+
+	if (menu->cur_item_id) {
+		ret = update_pointers(menu, menu->cur_item_id, false);
+		if (ret)
+			return log_msg_ret("mpi", ret);
+	}
 	menu->cur_item_id = item_id;
-	update_pointers(menu, item_id, true);
+	ret = update_pointers(menu, item_id, true);
+	if (ret)
+		return log_msg_ret("mpu", ret);
+
+	return 0;
 }
 
 void scene_menu_calc_bbox(struct scene_obj_menu *menu,
@@ -483,6 +492,33 @@
 	return 0;
 }
 
+int scene_menu_select_item(struct scene *scn, uint id, uint cur_item_id)
+{
+	struct scene_obj_menu *menu;
+	int ret;
+
+	menu = scene_obj_find(scn, id, SCENEOBJT_MENU);
+	if (!menu)
+		return log_msg_ret("menu", -ENOENT);
+
+	ret = menu_point_to_item(menu, cur_item_id);
+	if (ret)
+		return log_msg_ret("msi", ret);
+
+	return 0;
+}
+
+int scene_menu_get_cur_item(struct scene *scn, uint id)
+{
+	struct scene_obj_menu *menu;
+
+	menu = scene_obj_find(scn, id, SCENEOBJT_MENU);
+	if (!menu)
+		return log_msg_ret("menu", -ENOENT);
+
+	return menu->cur_item_id;
+}
+
 int scene_menu_display(struct scene_obj_menu *menu)
 {
 	struct scene *scn = menu->obj.scene;