You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
2.6 KiB
71 lines
2.6 KiB
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
|
From: Hans de Goede <hdegoede@redhat.com> |
|
Date: Fri, 28 Jan 2022 12:43:49 +0100 |
|
Subject: [PATCH] EFI: console: Do not set cursor until the first text output |
|
|
|
To allow flickerfree boot the EFI console code does not call |
|
grub_efi_set_text_mode (1) until some text is actually output. |
|
|
|
Depending on if the output text is because of an error loading |
|
e.g. the .cfg file; or because of showing the menu the cursor needs |
|
to be on or off when the first text is shown. |
|
|
|
So far the cursor was hardcoded to being on, but this is causing |
|
drawing artifacts + slow drawing of the menu as reported here: |
|
https://bugzilla.redhat.com/show_bug.cgi?id=1946969 |
|
|
|
Handle the cursorstate in the same way as the colorstate to fix this, |
|
when no text has been output yet, just cache the cursorstate and |
|
then use the last set value when the first text is output. |
|
|
|
Fixes: 2d7c3abd871f ("efi/console: Do not set text-mode until we actually need it") |
|
Signed-off-by: Hans de Goede <hdegoede@redhat.com> |
|
--- |
|
grub-core/term/efi/console.c | 19 ++++++++++++++++--- |
|
1 file changed, 16 insertions(+), 3 deletions(-) |
|
|
|
diff --git a/grub-core/term/efi/console.c b/grub-core/term/efi/console.c |
|
index c44b2ac318..a3622e4fe5 100644 |
|
--- a/grub-core/term/efi/console.c |
|
+++ b/grub-core/term/efi/console.c |
|
@@ -31,7 +31,15 @@ typedef enum { |
|
} |
|
grub_text_mode; |
|
|
|
+typedef enum { |
|
+ GRUB_CURSOR_MODE_UNDEFINED = -1, |
|
+ GRUB_CURSOR_MODE_OFF = 0, |
|
+ GRUB_CURSUR_MODE_ON |
|
+} |
|
+grub_cursor_mode; |
|
+ |
|
static grub_text_mode text_mode = GRUB_TEXT_MODE_UNDEFINED; |
|
+static grub_cursor_mode cursor_mode = GRUB_CURSOR_MODE_UNDEFINED; |
|
static grub_term_color_state text_colorstate = GRUB_TERM_COLOR_UNDEFINED; |
|
|
|
static grub_uint32_t |
|
@@ -119,8 +127,12 @@ grub_console_setcursor (struct grub_term_output *term __attribute__ ((unused)), |
|
{ |
|
grub_efi_simple_text_output_interface_t *o; |
|
|
|
- if (grub_efi_is_finished) |
|
- return; |
|
+ if (grub_efi_is_finished || text_mode != GRUB_TEXT_MODE_AVAILABLE) |
|
+ { |
|
+ /* Cache cursor changes before the first text-output */ |
|
+ cursor_mode = on; |
|
+ return; |
|
+ } |
|
|
|
o = grub_efi_system_table->con_out; |
|
efi_call_2 (o->enable_cursor, o, on); |
|
@@ -143,7 +155,8 @@ grub_prepare_for_text_output (struct grub_term_output *term) |
|
return GRUB_ERR_BAD_DEVICE; |
|
} |
|
|
|
- grub_console_setcursor (term, 1); |
|
+ if (cursor_mode != GRUB_CURSOR_MODE_UNDEFINED) |
|
+ grub_console_setcursor (term, cursor_mode); |
|
if (text_colorstate != GRUB_TERM_COLOR_UNDEFINED) |
|
grub_console_setcolorstate (term, text_colorstate); |
|
text_mode = GRUB_TEXT_MODE_AVAILABLE;
|
|
|