diff options
| author | Simon Glass <[email protected]> | 2025-05-02 08:46:16 -0600 |
|---|---|---|
| committer | Simon Glass <[email protected]> | 2025-05-30 09:49:31 +0100 |
| commit | bf9860459516d1837e92270340ca307211cd961a (patch) | |
| tree | 07a30de0e77474896d5a0f942fda3150ef14b44a /boot/bootflow_menu.c | |
| parent | 5c365ecabcac6d3218cf7e560bda01629a46d88e (diff) | |
expo: Add a function to poll for input
Both bootflow_menu and cedit use similar logic to poll an expo. Move
this into the expo library so the code can be shared.
Update bootflow_menu_run() to return -EPIPE when the user quits without
choosing anything, since -EAGAIN is ambiguous and elsewhere means that
there is no input yet.
Signed-off-by: Simon Glass <[email protected]>
Diffstat (limited to 'boot/bootflow_menu.c')
| -rw-r--r-- | boot/bootflow_menu.c | 41 |
1 files changed, 4 insertions, 37 deletions
diff --git a/boot/bootflow_menu.c b/boot/bootflow_menu.c index 43125e15832..268c93ae8e3 100644 --- a/boot/bootflow_menu.c +++ b/boot/bootflow_menu.c @@ -216,39 +216,8 @@ int bootflow_menu_run(struct bootstd_priv *std, bool text_mode, done = false; do { struct expo_action act; - int ichar, key; - ret = expo_render(exp); - if (ret) - break; - - ichar = cli_ch_process(&exp->cch, 0); - if (!ichar) { - while (!ichar && !tstc()) { - schedule(); - mdelay(2); - ichar = cli_ch_process(&exp->cch, -ETIMEDOUT); - } - if (!ichar) { - ichar = getchar(); - ichar = cli_ch_process(&exp->cch, ichar); - } - } - - key = 0; - if (ichar) { - key = bootmenu_conv_key(ichar); - if (key == BKEY_NONE) - key = ichar; - } - if (!key) - continue; - - ret = expo_send_key(exp, key); - if (ret) - break; - - ret = expo_action_get(exp, &act); + ret = expo_poll(exp, &act); if (!ret) { switch (act.type) { case EXPOACT_SELECT: @@ -256,17 +225,15 @@ int bootflow_menu_run(struct bootstd_priv *std, bool text_mode, done = true; break; case EXPOACT_QUIT: - done = true; - break; + return -EPIPE; default: break; } + } else if (ret != -EPIPE && ret != -EAGAIN) { + return log_msg_ret("bmr", ret); } } while (!done); - if (ret) - return log_msg_ret("end", ret); - if (sel_id) { struct bootflow *bflow; int i; |
