summaryrefslogtreecommitdiff
path: root/firmware/2lib/2ui.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/2lib/2ui.c')
-rw-r--r--firmware/2lib/2ui.c70
1 files changed, 41 insertions, 29 deletions
diff --git a/firmware/2lib/2ui.c b/firmware/2lib/2ui.c
index 800f06a3..71734507 100644
--- a/firmware/2lib/2ui.c
+++ b/firmware/2lib/2ui.c
@@ -24,7 +24,7 @@
* shutdown is required.
*
* @param ui UI context pointer
- * @return VB2_REQUEST_SHUTDOWN if shutdown needed, or VB2_REQUEST_UI_CONTINUE
+ * @return VB2_REQUEST_SHUTDOWN if shutdown needed, or VB2_SUCCESS
*/
vb2_error_t check_shutdown_request(struct vb2_ui_context *ui)
{
@@ -64,7 +64,7 @@ vb2_error_t check_shutdown_request(struct vb2_ui_context *ui)
if (shutdown_request)
return VB2_REQUEST_SHUTDOWN;
- return VB2_REQUEST_UI_CONTINUE;
+ return VB2_SUCCESS;
}
/*****************************************************************************/
@@ -81,7 +81,7 @@ vb2_error_t error_exit_action(struct vb2_ui_context *ui)
ui->error_code = VB2_UI_ERROR_NONE;
ui->key = 0;
}
- return VB2_REQUEST_UI_CONTINUE;
+ return VB2_SUCCESS;
}
/*****************************************************************************/
@@ -131,7 +131,7 @@ vb2_error_t menu_navigation_action(struct vb2_ui_context *ui)
ui->key, ui->key_trusted);
}
- return VB2_REQUEST_UI_CONTINUE;
+ return VB2_SUCCESS;
}
vb2_error_t vb2_ui_menu_prev(struct vb2_ui_context *ui)
@@ -139,7 +139,7 @@ vb2_error_t vb2_ui_menu_prev(struct vb2_ui_context *ui)
int item;
if (!DETACHABLE && ui->key == VB_BUTTON_VOL_UP_SHORT_PRESS)
- return VB2_REQUEST_UI_CONTINUE;
+ return VB2_SUCCESS;
item = ui->state->selected_item - 1;
while (item >= 0 && VB2_GET_BIT(ui->state->hidden_item_mask, item))
@@ -148,7 +148,7 @@ vb2_error_t vb2_ui_menu_prev(struct vb2_ui_context *ui)
if (item >= 0)
ui->state->selected_item = item;
- return VB2_REQUEST_UI_CONTINUE;
+ return VB2_SUCCESS;
}
vb2_error_t vb2_ui_menu_next(struct vb2_ui_context *ui)
@@ -157,7 +157,7 @@ vb2_error_t vb2_ui_menu_next(struct vb2_ui_context *ui)
const struct vb2_menu *menu;
if (!DETACHABLE && ui->key == VB_BUTTON_VOL_DOWN_SHORT_PRESS)
- return VB2_REQUEST_UI_CONTINUE;
+ return VB2_SUCCESS;
menu = get_menu(ui);
item = ui->state->selected_item + 1;
@@ -168,7 +168,7 @@ vb2_error_t vb2_ui_menu_next(struct vb2_ui_context *ui)
if (item < menu->num_items)
ui->state->selected_item = item;
- return VB2_REQUEST_UI_CONTINUE;
+ return VB2_SUCCESS;
}
vb2_error_t vb2_ui_menu_select(struct vb2_ui_context *ui)
@@ -177,11 +177,11 @@ vb2_error_t vb2_ui_menu_select(struct vb2_ui_context *ui)
const struct vb2_menu_item *menu_item;
if (!DETACHABLE && ui->key == VB_BUTTON_POWER_SHORT_PRESS)
- return VB2_REQUEST_UI_CONTINUE;
+ return VB2_SUCCESS;
menu = get_menu(ui);
if (menu->num_items == 0)
- return VB2_REQUEST_UI_CONTINUE;
+ return VB2_SUCCESS;
menu_item = &menu->items[ui->state->selected_item];
@@ -190,7 +190,7 @@ vb2_error_t vb2_ui_menu_select(struct vb2_ui_context *ui)
ui->state->selected_item)) {
VB2_DEBUG("Menu item <%s> disabled; ignoring\n",
menu_item->text);
- return VB2_REQUEST_UI_CONTINUE;
+ return VB2_SUCCESS;
}
if (menu_item->action) {
@@ -204,7 +204,7 @@ vb2_error_t vb2_ui_menu_select(struct vb2_ui_context *ui)
VB2_DEBUG("Menu item <%s> no action or target screen\n",
menu_item->text);
- return VB2_REQUEST_UI_CONTINUE;
+ return VB2_SUCCESS;
}
/*****************************************************************************/
@@ -219,7 +219,7 @@ vb2_error_t vb2_ui_screen_back(struct vb2_ui_context *ui)
free(ui->state);
ui->state = tmp;
if (ui->state->screen->reinit)
- return ui->state->screen->reinit(ui);
+ VB2_TRY(ui->state->screen->reinit(ui));
} else {
VB2_DEBUG("ERROR: No previous screen; ignoring\n");
}
@@ -233,7 +233,7 @@ static vb2_error_t default_screen_init(struct vb2_ui_context *ui)
ui->state->selected_item = 0;
if (menu->num_items > 1 && menu->items[0].is_language_select)
ui->state->selected_item = 1;
- return VB2_REQUEST_UI_CONTINUE;
+ return VB2_SUCCESS;
}
vb2_error_t vb2_ui_screen_change(struct vb2_ui_context *ui, enum vb2_screen id)
@@ -266,7 +266,7 @@ vb2_error_t vb2_ui_screen_change(struct vb2_ui_context *ui, enum vb2_screen id)
free(cur_state);
}
if (ui->state->screen->reinit)
- return ui->state->screen->reinit(ui);
+ VB2_TRY(ui->state->screen->reinit(ui));
} else {
/* Allocate the requested screen on top of the stack. */
cur_state = malloc(sizeof(*ui->state));
@@ -279,9 +279,9 @@ vb2_error_t vb2_ui_screen_change(struct vb2_ui_context *ui, enum vb2_screen id)
cur_state->screen = new_screen_info;
ui->state = cur_state;
if (ui->state->screen->init)
- return ui->state->screen->init(ui);
+ VB2_TRY(ui->state->screen->init(ui));
else
- return default_screen_init(ui);
+ VB2_TRY(default_screen_init(ui));
}
return VB2_REQUEST_UI_CONTINUE;
@@ -290,8 +290,9 @@ vb2_error_t vb2_ui_screen_change(struct vb2_ui_context *ui, enum vb2_screen id)
/*****************************************************************************/
/* Core UI loop */
-vb2_error_t ui_loop(struct vb2_context *ctx, enum vb2_screen root_screen_id,
- vb2_error_t (*global_action)(struct vb2_ui_context *ui))
+static vb2_error_t ui_loop_impl(
+ struct vb2_context *ctx, enum vb2_screen root_screen_id,
+ vb2_error_t (*global_action)(struct vb2_ui_context *ui))
{
struct vb2_ui_context ui;
struct vb2_screen_state prev_state;
@@ -309,9 +310,11 @@ vb2_error_t ui_loop(struct vb2_context *ctx, enum vb2_screen root_screen_id,
if (root_info == NULL)
VB2_DIE("Root screen not found.\n");
ui.locale_id = vb2_nv_get(ctx, VB2_NV_LOCALIZATION_INDEX);
+
rv = vb2_ui_screen_change(&ui, root_screen_id);
- if (rv != VB2_REQUEST_UI_CONTINUE)
+ if (rv && rv != VB2_REQUEST_UI_CONTINUE)
return rv;
+
memset(&prev_state, 0, sizeof(prev_state));
prev_disable_timer = 0;
prev_error_code = VB2_UI_ERROR_NONE;
@@ -365,32 +368,32 @@ vb2_error_t ui_loop(struct vb2_context *ctx, enum vb2_screen root_screen_id,
/* Check for shutdown request. */
rv = check_shutdown_request(&ui);
- if (rv != VB2_REQUEST_UI_CONTINUE) {
+ if (rv && rv != VB2_REQUEST_UI_CONTINUE) {
VB2_DEBUG("Shutdown requested!\n");
return rv;
}
/* Check if we need to exit an error box. */
rv = error_exit_action(&ui);
- if (rv != VB2_REQUEST_UI_CONTINUE)
+ if (rv && rv != VB2_REQUEST_UI_CONTINUE)
return rv;
/* Run screen action. */
if (ui.state->screen->action) {
rv = ui.state->screen->action(&ui);
- if (rv != VB2_REQUEST_UI_CONTINUE)
+ if (rv && rv != VB2_REQUEST_UI_CONTINUE)
return rv;
}
/* Run menu navigation action. */
rv = menu_navigation_action(&ui);
- if (rv != VB2_REQUEST_UI_CONTINUE)
+ if (rv && rv != VB2_REQUEST_UI_CONTINUE)
return rv;
/* Run global action function if available. */
if (global_action) {
rv = global_action(&ui);
- if (rv != VB2_REQUEST_UI_CONTINUE)
+ if (rv && rv != VB2_REQUEST_UI_CONTINUE)
return rv;
}
@@ -403,6 +406,15 @@ vb2_error_t ui_loop(struct vb2_context *ctx, enum vb2_screen root_screen_id,
return VB2_SUCCESS;
}
+vb2_error_t ui_loop(struct vb2_context *ctx, enum vb2_screen root_screen_id,
+ vb2_error_t (*global_action)(struct vb2_ui_context *ui))
+{
+ vb2_error_t rv = ui_loop_impl(ctx, root_screen_id, global_action);
+ if (rv == VB2_REQUEST_UI_EXIT)
+ return VB2_SUCCESS;
+ return rv;
+}
+
/*****************************************************************************/
/* Developer mode */
@@ -437,7 +449,7 @@ vb2_error_t developer_action(struct vb2_ui_context *ui)
if (ui->key == VB_KEY_CTRL('L')) /* L for aLtfw (formerly Legacy) */
return vb2_ui_developer_mode_boot_altfw_action(ui);
- return VB2_REQUEST_UI_CONTINUE;
+ return VB2_SUCCESS;
}
/*****************************************************************************/
@@ -454,7 +466,7 @@ vb2_error_t broken_recovery_action(struct vb2_ui_context *ui)
if (ui->key == '\t')
return vb2_ui_screen_change(ui, VB2_SCREEN_DEBUG_INFO);
- return VB2_REQUEST_UI_CONTINUE;
+ return VB2_SUCCESS;
}
/*****************************************************************************/
@@ -470,7 +482,7 @@ vb2_error_t manual_recovery_action(struct vb2_ui_context *ui)
/* See if we have a recovery kernel available yet. */
vb2_error_t rv = VbTryLoadKernel(ui->ctx, VB_DISK_FLAG_REMOVABLE);
if (rv == VB2_SUCCESS)
- return rv;
+ return VB2_REQUEST_UI_EXIT;
/* If disk validity state changed, switch to appropriate screen. */
if (ui->recovery_rv != rv) {
@@ -491,7 +503,7 @@ vb2_error_t manual_recovery_action(struct vb2_ui_context *ui)
if (ui->key == '\t')
return vb2_ui_screen_change(ui, VB2_SCREEN_DEBUG_INFO);
- return VB2_REQUEST_UI_CONTINUE;
+ return VB2_SUCCESS;
}
/*****************************************************************************/