diff options
Diffstat (limited to 'firmware/2lib/2ui.c')
-rw-r--r-- | firmware/2lib/2ui.c | 70 |
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; } /*****************************************************************************/ |