From: Simon Glass <sjg@chromium.org>
It is sometimes useful to be able to click on an image (sometimes called
an icon). Allow this within expo and return new click action.
Signed-off-by: Simon Glass <sjg@chromium.org>
---
boot/bootflow_menu.c | 1 +
boot/cedit.c | 3 +++
boot/scene.c | 14 +++++++++++---
include/expo.h | 2 ++
4 files changed, 17 insertions(+), 3 deletions(-)
@@ -313,6 +313,7 @@ int bootflow_menu_poll(struct expo *exp, int *seqp)
}
case EXPOACT_QUIT:
return -EPIPE;
+ case EXPOACT_CLICK:
default:
return -EAGAIN;
}
@@ -220,6 +220,9 @@ int cedit_do_action(struct expo *exp, struct scene *scn,
log_debug("quitting\n");
exp->done = true;
break;
+ case EXPOACT_CLICK:
+ /* not supported by cedit */
+ break;
}
return 0;
@@ -1167,9 +1167,11 @@ bool scene_obj_within(const struct scene *scn, struct scene_obj *obj, int x,
switch (obj->type) {
case SCENEOBJT_NONE:
+ break;
case SCENEOBJT_IMAGE:
case SCENEOBJT_TEXT:
case SCENEOBJT_BOX:
+ within = is_within(obj, x, y);
break;
case SCENEOBJT_MENU: {
struct scene_obj_menu *menu;
@@ -1344,15 +1346,21 @@ int scene_send_click(struct scene *scn, int x, int y, struct expo_action *event)
obj = scene_find_obj_within(scn, x, y, false, false);
log_debug("non-popup obj %d '%s'\n", obj ? obj->id : -1,
obj ? obj->name : "(none)");
- if (!obj)
- return 0;
+ if (!obj) {
+ obj = scene_find_obj_within(scn, x, y, true, true);
+ log_debug("non-popup any obj %d '%s'\n", obj ? obj->id : -1,
+ obj ? obj->name : "(none)");
+ if (!obj)
+ return 0;
+ }
switch (obj->type) {
case SCENEOBJT_NONE:
case SCENEOBJT_IMAGE:
case SCENEOBJT_TEXT:
case SCENEOBJT_BOX:
- /* These objects don't handle clicks directly */
+ event->type = EXPOACT_CLICK;
+ event->select.id = obj->id;
break;
case SCENEOBJT_MENU: {
struct scene_obj_menu *menu;
@@ -56,6 +56,7 @@ enum expo_id_t {
* @EXPOACT_REPOINT_OPEN: menu closed, another menu opened (@prev_id indicates
* the menu closed, @id indicates menu opened)
* @EXPOACT_QUIT: request to exit the menu
+ * @EXPOACT_CLICK: click on an object
*/
enum expoact_type {
EXPOACT_NONE,
@@ -68,6 +69,7 @@ enum expoact_type {
EXPOACT_POINT_CLOSE,
EXPOACT_REPOINT_OPEN,
EXPOACT_QUIT,
+ EXPOACT_CLICK,
};
/**