[PATCH] password: Fix backspace in username prompt
From: Egor Ignatov Allow control characters in the bidi visual. Resolves: #60114 Signed-off-by: Egor Ignatov --- grub/grub-core/normal/charset.c | 1 + 1 file changed, 1 insertion(+) diff --git a/grub/grub-core/normal/charset.c b/grub/grub-core/normal/charset.c index b0ab47d73..30e819bdf 100644 --- a/grub/grub-core/normal/charset.c +++ b/grub/grub-core/normal/charset.c @@ -925,6 +925,7 @@ grub_bidi_line_logical_to_visual (const grub_uint32_t *logical, pop_stack (); break; case GRUB_BIDI_TYPE_BN: + visual_len++; break; case GRUB_BIDI_TYPE_R: case GRUB_BIDI_TYPE_AL: -- 2.25.4 ___ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel
[PATCH] password: Fix backspace in username prompt
From: Egor Ignatov Make backspace work in superuser login prompt. The problem was that bidi logical to visual ignored BN type, so you couldn't print control characters. Use grub_printf() 3 times, because if you print "\b \b" at once the cursor will get stuck on the second last character. Resolves: #60114 Signed-off-by: Egor Ignatov --- grub-core/normal/auth.c| 10 +- grub-core/normal/charset.c | 1 + grub-core/term/gfxterm.c | 9 - 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/grub-core/normal/auth.c b/grub-core/normal/auth.c index 6be678c0d..cf57a1b7e 100644 --- a/grub-core/normal/auth.c +++ b/grub-core/normal/auth.c @@ -177,7 +177,15 @@ grub_username_get (char buf[], unsigned buf_size) if (cur_len) { cur_len--; - grub_printf ("\b \b"); + /* NOTE(eg...@altlinux.org): +grub_printf used 3 times, because for some reason +(line wrapping I guess) if you print "\b \b" at once +the backspace key doesn't work on the second last +character. + */ + grub_printf ("\b"); + grub_printf (" "); + grub_printf ("\b"); } continue; } diff --git a/grub-core/normal/charset.c b/grub-core/normal/charset.c index 4dfcc3107..77073c12f 100644 --- a/grub-core/normal/charset.c +++ b/grub-core/normal/charset.c @@ -931,6 +931,7 @@ grub_bidi_line_logical_to_visual (const grub_uint32_t *logical, pop_stack (); break; case GRUB_BIDI_TYPE_BN: + visual_len++; break; case GRUB_BIDI_TYPE_R: case GRUB_BIDI_TYPE_AL: diff --git a/grub-core/term/gfxterm.c b/grub-core/term/gfxterm.c index af7c090a3..5b0660cd2 100644 --- a/grub-core/term/gfxterm.c +++ b/grub-core/term/gfxterm.c @@ -847,7 +847,14 @@ grub_gfxterm_putchar (struct grub_term_output *term, { case '\b': if (virtual_screen.cursor_x > 0) -virtual_screen.cursor_x--; +{ + virtual_screen.cursor_x--; +} + else if (virtual_screen.cursor_y > 0) +{ + virtual_screen.cursor_y--; + virtual_screen.cursor_x = virtual_screen.columns-2; +} break; case '\n': -- 2.25.4 ___ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel
Re: [PATCH] password: Fix backspace in username prompt
I used grub_printf 3 times, because for some reason (line wrapping I guess) if you print "\b \b" at once the backspace key doesn't work on the second last character in the terminal line. The visual cursor gets stuck there and doesn't remove characters anymore, although you can still type more. This may be irrelevant because I doubt anyone is using a username longer than one line, but it solves the problem. On 3/1/21 8:26 PM, Lennart Sorensen wrote: On Mon, Mar 01, 2021 at 10:58:40AM +0300, Egor Ignatov wrote: From: Egor Ignatov Make backspace work in superuser login prompt. The problem was that bidi logical to visual ignored BN type, so you couldn't print control characters. Use grub_printf() 3 times, because a line wrap will cause the cursor to get stuck at the end of the terminal line. Resolves: #60114 Signed-off-by: Egor Ignatov --- grub-core/normal/auth.c| 4 +++- grub-core/normal/charset.c | 1 + grub-core/term/gfxterm.c | 11 +-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/grub-core/normal/auth.c b/grub-core/normal/auth.c index 6be678c0d..ffbf6d890 100644 --- a/grub-core/normal/auth.c +++ b/grub-core/normal/auth.c @@ -177,7 +177,9 @@ grub_username_get (char buf[], unsigned buf_size) if (cur_len) { cur_len--; - grub_printf ("\b \b"); + grub_printf ("\b"); + grub_printf (" "); + grub_printf ("\b"); } continue; } Is this the part that the commit message refers to? I must admit I am not quite sure why this change makes a difference, but if it does, perhaps it is important (and non obvious) enough that the code should actually have a comment explaining it, or someone might come by and clean it up again later. ___ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel
Re: [PATCH] password: Fix backspace in username prompt
On Mon, Mar 01, 2021 at 10:58:40AM +0300, Egor Ignatov wrote: > From: Egor Ignatov > > Make backspace work in superuser login prompt. > > The problem was that bidi logical to visual ignored BN type, > so you couldn't print control characters. > > Use grub_printf() 3 times, because a line wrap will cause > the cursor to get stuck at the end of the terminal line. > > Resolves: #60114 > Signed-off-by: Egor Ignatov > --- > grub-core/normal/auth.c| 4 +++- > grub-core/normal/charset.c | 1 + > grub-core/term/gfxterm.c | 11 +-- > 3 files changed, 13 insertions(+), 3 deletions(-) > > diff --git a/grub-core/normal/auth.c b/grub-core/normal/auth.c > index 6be678c0d..ffbf6d890 100644 > --- a/grub-core/normal/auth.c > +++ b/grub-core/normal/auth.c > @@ -177,7 +177,9 @@ grub_username_get (char buf[], unsigned buf_size) > if (cur_len) > { > cur_len--; > - grub_printf ("\b \b"); > + grub_printf ("\b"); > + grub_printf (" "); > + grub_printf ("\b"); > } > continue; > } Is this the part that the commit message refers to? I must admit I am not quite sure why this change makes a difference, but if it does, perhaps it is important (and non obvious) enough that the code should actually have a comment explaining it, or someone might come by and clean it up again later. -- Len Sorensen ___ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel
[PATCH] password: Fix backspace in username prompt
Make backspace work in superuser login prompt. The problem was that bidi logical to visual ignored BN type, so you couldn't print control characters. Use grub_printf() 3 times, because a line wrap will cause the cursor to get stuck at the end of the terminal line. Resolves: #60114 Signed-off-by: Egor Ignatov --- grub-core/normal/auth.c| 4 +++- grub-core/normal/charset.c | 1 + grub-core/term/gfxterm.c | 9 - 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/grub-core/normal/auth.c b/grub-core/normal/auth.c index 6be678c0d..ffbf6d890 100644 --- a/grub-core/normal/auth.c +++ b/grub-core/normal/auth.c @@ -177,7 +177,9 @@ grub_username_get (char buf[], unsigned buf_size) if (cur_len) { cur_len--; - grub_printf ("\b \b"); + grub_printf ("\b"); + grub_printf (" "); + grub_printf ("\b"); } continue; } diff --git a/grub-core/normal/charset.c b/grub-core/normal/charset.c index 4dfcc3107..77073c12f 100644 --- a/grub-core/normal/charset.c +++ b/grub-core/normal/charset.c @@ -931,6 +931,7 @@ grub_bidi_line_logical_to_visual (const grub_uint32_t *logical, pop_stack (); break; case GRUB_BIDI_TYPE_BN: + visual_len++; break; case GRUB_BIDI_TYPE_R: case GRUB_BIDI_TYPE_AL: diff --git a/grub-core/term/gfxterm.c b/grub-core/term/gfxterm.c index af7c090a3..5b0660cd2 100644 --- a/grub-core/term/gfxterm.c +++ b/grub-core/term/gfxterm.c @@ -847,7 +847,14 @@ grub_gfxterm_putchar (struct grub_term_output *term, { case '\b': if (virtual_screen.cursor_x > 0) -virtual_screen.cursor_x--; +{ + virtual_screen.cursor_x--; +} + else if (virtual_screen.cursor_y > 0) +{ + virtual_screen.cursor_y--; + virtual_screen.cursor_x = virtual_screen.columns-2; +} break; case '\n': -- 2.25.4 ___ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel
[PATCH] password: Fix backspace in username prompt
From: Egor Ignatov Make backspace work in superuser login prompt. The problem was that bidi logical to visual ignored BN type, so you couldn't print control characters. Use grub_printf() 3 times, because a line wrap will cause the cursor to get stuck at the end of the terminal line. Resolves: #60114 Signed-off-by: Egor Ignatov --- grub-core/normal/auth.c| 4 +++- grub-core/normal/charset.c | 1 + grub-core/term/gfxterm.c | 9 - 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/grub-core/normal/auth.c b/grub-core/normal/auth.c index 6be678c0d..ffbf6d890 100644 --- a/grub-core/normal/auth.c +++ b/grub-core/normal/auth.c @@ -177,7 +177,9 @@ grub_username_get (char buf[], unsigned buf_size) if (cur_len) { cur_len--; - grub_printf ("\b \b"); + grub_printf ("\b"); + grub_printf (" "); + grub_printf ("\b"); } continue; } diff --git a/grub-core/normal/charset.c b/grub-core/normal/charset.c index 4dfcc3107..77073c12f 100644 --- a/grub-core/normal/charset.c +++ b/grub-core/normal/charset.c @@ -931,6 +931,7 @@ grub_bidi_line_logical_to_visual (const grub_uint32_t *logical, pop_stack (); break; case GRUB_BIDI_TYPE_BN: + visual_len++; break; case GRUB_BIDI_TYPE_R: case GRUB_BIDI_TYPE_AL: diff --git a/grub-core/term/gfxterm.c b/grub-core/term/gfxterm.c index af7c090a3..5b0660cd2 100644 --- a/grub-core/term/gfxterm.c +++ b/grub-core/term/gfxterm.c @@ -847,7 +847,14 @@ grub_gfxterm_putchar (struct grub_term_output *term, { case '\b': if (virtual_screen.cursor_x > 0) -virtual_screen.cursor_x--; +{ + virtual_screen.cursor_x--; +} + else if (virtual_screen.cursor_y > 0) +{ + virtual_screen.cursor_y--; + virtual_screen.cursor_x = virtual_screen.columns-2; +} break; case '\n': -- 2.25.4 ___ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel
[PATCH] password: Fix backspace in username prompt
From: Egor Ignatov Make backspace work in superuser login prompt. The problem was that bidi logical to visual ignored BN type, so you couldn't print control characters. Use grub_printf() 3 times, because a line wrap will cause the cursor to get stuck at the end of the terminal line. Resolves: #60114 Signed-off-by: Egor Ignatov --- grub-core/normal/auth.c| 4 +++- grub-core/normal/charset.c | 1 + grub-core/term/gfxterm.c | 11 +-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/grub-core/normal/auth.c b/grub-core/normal/auth.c index 6be678c0d..ffbf6d890 100644 --- a/grub-core/normal/auth.c +++ b/grub-core/normal/auth.c @@ -177,7 +177,9 @@ grub_username_get (char buf[], unsigned buf_size) if (cur_len) { cur_len--; - grub_printf ("\b \b"); + grub_printf ("\b"); + grub_printf (" "); + grub_printf ("\b"); } continue; } diff --git a/grub-core/normal/charset.c b/grub-core/normal/charset.c index 4dfcc3107..77073c12f 100644 --- a/grub-core/normal/charset.c +++ b/grub-core/normal/charset.c @@ -931,6 +931,7 @@ grub_bidi_line_logical_to_visual (const grub_uint32_t *logical, pop_stack (); break; case GRUB_BIDI_TYPE_BN: + visual_len++; break; case GRUB_BIDI_TYPE_R: case GRUB_BIDI_TYPE_AL: diff --git a/grub-core/term/gfxterm.c b/grub-core/term/gfxterm.c index af7c090a3..b6f384796 100644 --- a/grub-core/term/gfxterm.c +++ b/grub-core/term/gfxterm.c @@ -846,8 +846,15 @@ grub_gfxterm_putchar (struct grub_term_output *term, switch (c->base) { case '\b': - if (virtual_screen.cursor_x > 0) -virtual_screen.cursor_x--; + if (virtual_screen.cursor_x > 0) + { + virtual_screen.cursor_x--; + } + else if (virtual_screen.cursor_y > 0) + { + virtual_screen.cursor_y--; + virtual_screen.cursor_x = virtual_screen.columns-2; + } break; case '\n': -- 2.25.4 ___ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel