Fix behavior of backspace in multiline cmdline editing
This commit is contained in:
parent
1b3247c3a2
commit
a3a4d8c3e5
137
0007-Fix-backspace-when-editing-a-multiline-cmdline.patch
Normal file
137
0007-Fix-backspace-when-editing-a-multiline-cmdline.patch
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
From 7ebe10128eef978e99667d741ed4588d80b38441 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Robbie Harwood <rharwood@redhat.com>
|
||||||
|
Date: Thu, 21 Oct 2021 15:15:33 -0400
|
||||||
|
Subject: [PATCH] Fix backspace when editing a multiline cmdline
|
||||||
|
|
||||||
|
Once the cmdline had passed the width of the screen, adding additional
|
||||||
|
characters introduced a spurious newline, and another newline at the
|
||||||
|
width of input. Furthermore, hitting backspace would not start
|
||||||
|
redrawing at the end of input, but rather at the beginning of the
|
||||||
|
current line - resulting in extra duplicate lines scrolling the console.
|
||||||
|
|
||||||
|
First, fix the assumption that the length of cmdline is the width - it
|
||||||
|
needs to include the length of the prompt (i.e., length of input and
|
||||||
|
space).
|
||||||
|
|
||||||
|
Second, fix the behavior of single-line redraw (i.e., redraw == 1) to
|
||||||
|
move the cursor to the row the line begins at.
|
||||||
|
|
||||||
|
Third, don't scroll the cursor down when a line wrap would occur - it's
|
||||||
|
not necessary since line wrap is enabled, and results in the extra blank
|
||||||
|
line.
|
||||||
|
|
||||||
|
Finally, comment all used escape sequences so that I don't need to look
|
||||||
|
them up again.
|
||||||
|
|
||||||
|
Signed-off-by: Robbie Harwood <rharwood@redhat.com>
|
||||||
|
---
|
||||||
|
com32/elflink/ldlinux/cli.c | 33 ++++++++++++++++++---------------
|
||||||
|
1 file changed, 18 insertions(+), 15 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/com32/elflink/ldlinux/cli.c b/com32/elflink/ldlinux/cli.c
|
||||||
|
index 3119b11f..4913f038 100644
|
||||||
|
--- a/com32/elflink/ldlinux/cli.c
|
||||||
|
+++ b/com32/elflink/ldlinux/cli.c
|
||||||
|
@@ -135,6 +135,7 @@ const char *edit_cmdline(const char *input, int top /*, int width */ ,
|
||||||
|
struct cli_command *comm_counter = NULL;
|
||||||
|
clock_t kbd_to = kbdtimeout;
|
||||||
|
clock_t tto = totaltimeout;
|
||||||
|
+ int prompt_len = 1 + strlen(input);
|
||||||
|
|
||||||
|
if (!width) {
|
||||||
|
int height;
|
||||||
|
@@ -144,7 +145,7 @@ const char *edit_cmdline(const char *input, int top /*, int width */ ,
|
||||||
|
|
||||||
|
len = cursor = 0;
|
||||||
|
prev_len = 0;
|
||||||
|
- x = y = 0;
|
||||||
|
+ y = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Before we start messing with the x,y coordinates print 'input'
|
||||||
|
@@ -152,6 +153,7 @@ const char *edit_cmdline(const char *input, int top /*, int width */ ,
|
||||||
|
* previously.
|
||||||
|
*/
|
||||||
|
printf("%s ", input);
|
||||||
|
+ x = prompt_len;
|
||||||
|
|
||||||
|
while (!done) {
|
||||||
|
if (redraw > 1) {
|
||||||
|
@@ -162,8 +164,7 @@ const char *edit_cmdline(const char *input, int top /*, int width */ ,
|
||||||
|
if (pDraw_Menu)
|
||||||
|
(*pDraw_Menu) (-1, top, 1);
|
||||||
|
prev_len = 0;
|
||||||
|
- printf("\033[2J\033[H");
|
||||||
|
- // printf("\033[0m\033[2J\033[H");
|
||||||
|
+ printf("\033[2J\033[H"); /* Clear entire screen; move to 0, 0. */
|
||||||
|
}
|
||||||
|
|
||||||
|
if (redraw > 0) {
|
||||||
|
@@ -172,10 +173,14 @@ const char *edit_cmdline(const char *input, int top /*, int width */ ,
|
||||||
|
prev_len = max(len, prev_len);
|
||||||
|
|
||||||
|
/* Redraw the command line */
|
||||||
|
- printf("\033[?25l");
|
||||||
|
- printf("\033[1G%s ", input);
|
||||||
|
+ printf("\033[?25l"); /* Hide cursor. */
|
||||||
|
+ printf("\033[1G"); /* Column 1. */
|
||||||
|
+ if (y > 0)
|
||||||
|
+ printf("\033[%dA", y); /* Directly up. */
|
||||||
|
|
||||||
|
- x = strlen(input);
|
||||||
|
+ printf("%s ", input);
|
||||||
|
+
|
||||||
|
+ x = prompt_len;
|
||||||
|
y = 0;
|
||||||
|
at = 0;
|
||||||
|
while (at < prev_len) {
|
||||||
|
@@ -183,23 +188,22 @@ const char *edit_cmdline(const char *input, int top /*, int width */ ,
|
||||||
|
at++;
|
||||||
|
x++;
|
||||||
|
if (x >= width) {
|
||||||
|
- printf("\r\n");
|
||||||
|
x = 0;
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- printf("\033[K\r");
|
||||||
|
+ printf("\033[K\r"); /* Clear to end of line; go to beginning. */
|
||||||
|
|
||||||
|
- dy = y - (cursor + strlen(input) + 1) / width;
|
||||||
|
- x = (cursor + strlen(input) + 1) % width;
|
||||||
|
+ dy = y - (cursor + prompt_len) / width;
|
||||||
|
+ x = (cursor + prompt_len) % width;
|
||||||
|
|
||||||
|
if (dy) {
|
||||||
|
- printf("\033[%dA", dy);
|
||||||
|
+ printf("\033[%dA", dy); /* Cursor directly up. */
|
||||||
|
y -= dy;
|
||||||
|
}
|
||||||
|
if (x)
|
||||||
|
- printf("\033[%dC", x);
|
||||||
|
- printf("\033[?25h");
|
||||||
|
+ printf("\033[%dC", x); /* Cursor forward. */
|
||||||
|
+ printf("\033[?25h"); /* Show cursor. */
|
||||||
|
prev_len = len;
|
||||||
|
redraw = 0;
|
||||||
|
}
|
||||||
|
@@ -439,7 +443,6 @@ const char *edit_cmdline(const char *input, int top /*, int width */ ,
|
||||||
|
cursor++;
|
||||||
|
x++;
|
||||||
|
if (x >= width) {
|
||||||
|
- printf("\r\n\033[K");
|
||||||
|
y++;
|
||||||
|
x = 0;
|
||||||
|
}
|
||||||
|
@@ -459,7 +462,7 @@ const char *edit_cmdline(const char *input, int top /*, int width */ ,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- printf("\033[?7h");
|
||||||
|
+ printf("\033[?7h"); /* Enable line wrap. */
|
||||||
|
|
||||||
|
/* Add the command to the history if its length is larger than 0 */
|
||||||
|
len = strlen(ret);
|
||||||
|
--
|
||||||
|
2.33.0
|
||||||
|
|
@ -7,7 +7,7 @@ Summary: Simple kernel loader which boots from a FAT filesystem
|
|||||||
Name: syslinux
|
Name: syslinux
|
||||||
Version: 6.04
|
Version: 6.04
|
||||||
%define tarball_version 6.04-pre1
|
%define tarball_version 6.04-pre1
|
||||||
Release: 0.19%{?dist}
|
Release: 0.20%{?dist}
|
||||||
License: GPLv2+
|
License: GPLv2+
|
||||||
URL: http://syslinux.zytor.com/wiki/index.php/The_Syslinux_Project
|
URL: http://syslinux.zytor.com/wiki/index.php/The_Syslinux_Project
|
||||||
Source0: http://www.kernel.org/pub/linux/utils/boot/syslinux/%{name}-%{tarball_version}.tar.xz
|
Source0: http://www.kernel.org/pub/linux/utils/boot/syslinux/%{name}-%{tarball_version}.tar.xz
|
||||||
@ -17,6 +17,7 @@ Patch0003: 0003-include-sysmacros-h.patch
|
|||||||
Patch0004: 0004-Add-RPMOPTFLAGS-to-CFLAGS-for-some-stuff.patch
|
Patch0004: 0004-Add-RPMOPTFLAGS-to-CFLAGS-for-some-stuff.patch
|
||||||
Patch0005: 0005-Workaround-multiple-definition-of-symbol-errors.patch
|
Patch0005: 0005-Workaround-multiple-definition-of-symbol-errors.patch
|
||||||
Patch0006: 0006-Replace-builtin-strlen-that-appears-to-get-optimized.patch
|
Patch0006: 0006-Replace-builtin-strlen-that-appears-to-get-optimized.patch
|
||||||
|
Patch0007: 0007-Fix-backspace-when-editing-a-multiline-cmdline.patch
|
||||||
|
|
||||||
# this is to keep rpmbuild from thinking the .c32 / .com / .0 / memdisk files
|
# this is to keep rpmbuild from thinking the .c32 / .com / .0 / memdisk files
|
||||||
# in noarch packages are a reason to stop the build.
|
# in noarch packages are a reason to stop the build.
|
||||||
@ -256,6 +257,9 @@ fi
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu Oct 21 2021 Robbie Harwood <rharwood@redhat.com> - 6.04-0.20
|
||||||
|
- Fix behavior of backspace in multiline cmdline editing
|
||||||
|
|
||||||
* Wed Sep 01 2021 Robbie Harwood <rharwood@redhat.com> - 6.04-0.19
|
* Wed Sep 01 2021 Robbie Harwood <rharwood@redhat.com> - 6.04-0.19
|
||||||
- Place extlinux(1) in the extlinux subpackage
|
- Place extlinux(1) in the extlinux subpackage
|
||||||
- Resolves: #977004
|
- Resolves: #977004
|
||||||
|
Loading…
Reference in New Issue
Block a user