summaryrefslogtreecommitdiff
path: root/lib/efi_loader
diff options
context:
space:
mode:
authorTom Rini <[email protected]>2025-10-26 07:51:18 -0600
committerTom Rini <[email protected]>2025-10-26 09:03:36 -0600
commit9094482ca7576877b2bfaa57c8e73cfeb536f8b9 (patch)
treea7ab2b7409802fe0dd3b2e36ecad3960c4b52004 /lib/efi_loader
parentfd976ff3a233ae7c6a9f5bec790b02bbbf57bb24 (diff)
parent5335f8d25b2f39b9dd954981364f3cddde01895f (diff)
Merge tag 'efi-2026-01-rc1-2' of https://source.denx.de/u-boot/custodians/u-boot-efi
Pull request efi-2026-01-rc1-2 CI: * https://source.denx.de/u-boot/custodians/u-boot-efi/-/pipelines/28024 Documentation: * develop: virtio: Fix qemu example (true/false -> on/off) * separate read and write command documentation * usage: Add general rule for `$?` * askenv: Reword and remove return value * seama: Reword return value section * usage: Use glob for all commands * Fix typos and formatting UEFI: * console: support editable input fields
Diffstat (limited to 'lib/efi_loader')
-rw-r--r--lib/efi_loader/efi_console.c55
1 files changed, 46 insertions, 9 deletions
diff --git a/lib/efi_loader/efi_console.c b/lib/efi_loader/efi_console.c
index 953f6831466..068d1a0a7b7 100644
--- a/lib/efi_loader/efi_console.c
+++ b/lib/efi_loader/efi_console.c
@@ -1384,7 +1384,9 @@ efi_status_t efi_console_get_u16_string(struct efi_simple_text_input_protocol *c
int row, int col)
{
efi_status_t ret;
- efi_uintn_t len = 0;
+ efi_uintn_t len;
+ efi_uintn_t cursor;
+ efi_uintn_t i;
struct efi_input_key key;
printf(ANSI_CURSOR_POSITION
@@ -1393,25 +1395,51 @@ efi_status_t efi_console_get_u16_string(struct efi_simple_text_input_protocol *c
efi_cin_empty_buffer();
+ len = u16_strlen(buf);
+ cursor = len;
for (;;) {
+ printf(ANSI_CURSOR_POSITION "%ls"
+ ANSI_CLEAR_LINE_TO_END ANSI_CURSOR_POSITION,
+ row, col, buf, row, col + (int)cursor);
do {
ret = EFI_CALL(cin->read_key_stroke(cin, &key));
mdelay(10);
} while (ret == EFI_NOT_READY);
if (key.unicode_char == u'\b') {
- if (len > 0)
- buf[--len] = u'\0';
-
- printf(ANSI_CURSOR_POSITION
- "%ls"
- ANSI_CLEAR_LINE_TO_END, row, col, buf);
+ if (cursor > 0) {
+ if (cursor == len) {
+ buf[--cursor] = u'\0';
+ } else {
+ for (i = cursor - 1; i < len; i++)
+ buf[i] = buf[i + 1];
+ cursor--;
+ }
+ len--;
+ }
+ continue;
+ } else if (key.scan_code == 8) { /* delete */
+ for (i = cursor; i <= len; i++)
+ buf[i] = buf[i + 1];
+ len--;
continue;
} else if (key.unicode_char == u'\r') {
buf[len] = u'\0';
return EFI_SUCCESS;
} else if (key.unicode_char == 0x3 || key.scan_code == 23) {
return EFI_ABORTED;
+ } else if (key.scan_code == 3) { /* Right arrow */
+ cursor += (cursor < len) ? 1 : 0;
+ continue;
+ } else if (key.scan_code == 4) { /* Left arrow */
+ cursor -= (cursor > 0) ? 1 : 0;
+ continue;
+ } else if (key.scan_code == 5) { /* Home */
+ cursor = 0;
+ continue;
+ } else if (key.scan_code == 6) { /* End */
+ cursor = len;
+ continue;
} else if (key.unicode_char < 0x20) {
/* ignore control codes other than Ctrl+C, '\r' and '\b' */
continue;
@@ -1428,8 +1456,17 @@ efi_status_t efi_console_get_u16_string(struct efi_simple_text_input_protocol *c
if (len >= (count - 1))
continue;
- buf[len] = key.unicode_char;
+ /*
+ * Insert the character into the middle of the buffer, shift the
+ * characters after the cursor along. The check above ensures we
+ * will never overflow the buffer.
+ * If the cursor is at the end of the string then this will
+ * do nothing.
+ */
+ for (i = len + 1; i > cursor; i--)
+ buf[i] = buf[i - 1];
+ buf[cursor] = key.unicode_char;
+ cursor++;
len++;
- printf(ANSI_CURSOR_POSITION "%ls", row, col, buf);
}
}