diff options
author | Kay Sievers <kay@vrfy.org> | 2013-08-21 00:33:05 +0200 |
---|---|---|
committer | Kay Sievers <kay@vrfy.org> | 2013-08-21 02:11:53 +0200 |
commit | a1da1ca6721f3b49cf45a7c3a08126b10b4ff772 (patch) | |
tree | a112f756e56e83f83e6ae7030f8a901c6b370001 /src | |
parent | 4a4d270c66431c6272c99ed82ad17a867ba4f04c (diff) |
support M-BS, M-d, and fix word jumping
Diffstat (limited to 'src')
-rw-r--r-- | src/efi/gummiboot.c | 55 |
1 files changed, 44 insertions, 11 deletions
diff --git a/src/efi/gummiboot.c b/src/efi/gummiboot.c index 0d338b7..6b07f97 100644 --- a/src/efi/gummiboot.c +++ b/src/efi/gummiboot.c @@ -492,11 +492,9 @@ static BOOLEAN line_edit(CHAR16 *line_in, CHAR16 **line_out, UINTN x_max, UINTN case KEYPRESS(EFI_ALT_PRESSED, 0, 'f'): case KEYPRESS(EFI_CONTROL_PRESSED, SCAN_RIGHT, 0): /* forward-word */ - while(line[first + cursor] && line[first + cursor] == ' ') + while (line[first + cursor] && line[first + cursor] == ' ') cursor_right(&cursor, &first, x_max, len); - while(line[first + cursor] && line[first + cursor] != ' ') - cursor_right(&cursor, &first, x_max, len); - while(line[first + cursor] && line[first + cursor] == ' ') + while (line[first + cursor] && line[first + cursor] != ' ') cursor_right(&cursor, &first, x_max, len); uefi_call_wrapper(ST->ConOut->SetCursorPosition, 3, ST->ConOut, cursor, y_pos); continue; @@ -505,14 +503,13 @@ static BOOLEAN line_edit(CHAR16 *line_in, CHAR16 **line_out, UINTN x_max, UINTN case KEYPRESS(EFI_ALT_PRESSED, 0, 'b'): case KEYPRESS(EFI_CONTROL_PRESSED, SCAN_LEFT, 0): /* backward-word */ - while((first + cursor) && line[first + cursor] == ' ') - cursor_left(&cursor, &first); - while((first + cursor) && line[first + cursor] != ' ') + if ((first + cursor) > 0 && line[first + cursor-1] == ' ') { cursor_left(&cursor, &first); - while((first + cursor) && line[first + cursor] == ' ') + while ((first + cursor) > 0 && line[first + cursor] == ' ') + cursor_left(&cursor, &first); + } + while ((first + cursor) > 0 && line[first + cursor-1] != ' ') cursor_left(&cursor, &first); - if (first + cursor != len && first + cursor) - cursor_right(&cursor, &first, x_max, len); uefi_call_wrapper(ST->ConOut->SetCursorPosition, 3, ST->ConOut, cursor, y_pos); continue; @@ -534,6 +531,43 @@ static BOOLEAN line_edit(CHAR16 *line_in, CHAR16 **line_out, UINTN x_max, UINTN uefi_call_wrapper(ST->ConOut->SetCursorPosition, 3, ST->ConOut, cursor, y_pos); continue; + case KEYPRESS(EFI_ALT_PRESSED, 0, 'd'): + /* kill-word */ + clear = 0; + for (i = first + cursor; i < len && line[i] == ' '; i++) + clear++; + for (; i < len && line[i] != ' '; i++) + clear++; + + for (i = first + cursor; i + clear < len; i++) + line[i] = line[i + clear]; + len -= clear; + line[len] = '\0'; + continue; + + case KEYPRESS(EFI_ALT_PRESSED, 0, CHAR_BACKSPACE): + /* backward-kill-word */ + clear = 0; + if ((first + cursor) > 0 && line[first + cursor-1] == ' ') { + cursor_left(&cursor, &first); + clear++; + while ((first + cursor) > 0 && line[first + cursor] == ' ') { + cursor_left(&cursor, &first); + clear++; + } + } + while ((first + cursor) > 0 && line[first + cursor-1] != ' ') { + cursor_left(&cursor, &first); + clear++; + } + uefi_call_wrapper(ST->ConOut->SetCursorPosition, 3, ST->ConOut, cursor, y_pos); + + for (i = first + cursor; i + clear < len; i++) + line[i] = line[i + clear]; + len -= clear; + line[len] = '\0'; + continue; + case KEYPRESS(0, SCAN_DELETE, 0): case KEYPRESS(EFI_CONTROL_PRESSED, 0, 'd'): case KEYPRESS(EFI_CONTROL_PRESSED, 0, CHAR_CTRL('d')): @@ -594,7 +628,6 @@ static BOOLEAN line_edit(CHAR16 *line_in, CHAR16 **line_out, UINTN x_max, UINTN } continue; - case KEYPRESS(0, 0, '\t'): case KEYPRESS(0, 0, ' ') ... KEYPRESS(0, 0, '~'): case KEYPRESS(0, 0, 0x80) ... KEYPRESS(0, 0, 0xffff): if (len+1 == size) |