From f281978ce8835624e6d5e45a5ed72f95f2de23b8 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Thu, 28 Dec 2023 08:03:03 -0500 Subject: [PATCH 1/4] ply-console-viewer: Handle fonts failing to load better Right now we divide by zero if the font metrics can't be determined and tank. This commit attempts to detect the situation and fall back to using kernel fb console in that case. --- .../ply-console-viewer.c | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/src/libply-splash-graphics/ply-console-viewer.c b/src/libply-splash-graphics/ply-console-viewer.c index dbcf3eca..c60214e3 100644 --- a/src/libply-splash-graphics/ply-console-viewer.c +++ b/src/libply-splash-graphics/ply-console-viewer.c @@ -21,6 +21,7 @@ #include #include "ply-label.h" +#include "ply-logger.h" #include "ply-array.h" #include "ply-pixel-display.h" #include "ply-image.h" @@ -56,9 +57,39 @@ struct _ply_console_viewer static void update_console_messages (ply_console_viewer_t *console_viewer); static void on_terminal_emulator_output (ply_console_viewer_t *console_viewer); -bool ply_console_viewer_preferred (void) +bool +ply_console_viewer_preferred (void) { - return !ply_kernel_command_line_has_argument ("plymouth.prefer-fbcon"); + static enum { PLY_CONSOLE_VIEWER_PREFERENCE_UNKNOWN = -1, + PLY_CONSOLE_VIEWER_PREFERENCE_NO_VIEWER, + PLY_CONSOLE_VIEWER_PREFERENCE_VIEWER } preference = PLY_CONSOLE_VIEWER_PREFERENCE_UNKNOWN; + ply_label_t *label = NULL; + + if (preference != PLY_CONSOLE_VIEWER_PREFERENCE_UNKNOWN) + goto out; + + if (ply_kernel_command_line_has_argument ("plymouth.prefer-fbcon")) { + ply_trace ("Not using console viewer because plymouth.prefer-fbcon is on kernel command line"); + preference = PLY_CONSOLE_VIEWER_PREFERENCE_NO_VIEWER; + goto out; + } + + label = ply_label_new (); + ply_label_set_text (label, " "); + + if (ply_label_get_width (label) <= 1 || ply_label_get_height (label) <= 1) { + ply_trace ("Not using console viewer because text renderering isn't working"); + preference = PLY_CONSOLE_VIEWER_PREFERENCE_NO_VIEWER; + goto out; + } else { + ply_trace ("Using console viewer instead of kernel framebuffer console"); + preference = PLY_CONSOLE_VIEWER_PREFERENCE_NO_VIEWER; + goto out; + } + +out: + ply_label_free (label); + return (bool) preference; } ply_console_viewer_t * From 6359b6715ed89d84e5c8066236f233a18ef790ef Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Thu, 28 Dec 2023 09:31:08 -0500 Subject: [PATCH 2/4] fade-throbber: Be more tolerant when there's no console viewer There are still a number of places in the code where a console viewer is expected, when it's totally possible that there won't be one. This commit runs through them, and does a few other style cleanups on the way. --- src/plugins/splash/fade-throbber/plugin.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/plugins/splash/fade-throbber/plugin.c b/src/plugins/splash/fade-throbber/plugin.c index 1d0a6e82..44729a07 100644 --- a/src/plugins/splash/fade-throbber/plugin.c +++ b/src/plugins/splash/fade-throbber/plugin.c @@ -209,10 +209,12 @@ view_hide_prompt (view_t *view) plugin = view->plugin; /* Obscure the password length in the scroll back */ - if (plugin->state == PLY_BOOT_SPLASH_DISPLAY_PASSWORD_ENTRY) - ply_console_viewer_clear_line (view->console_viewer); + if (view->console_viewer != NULL) { + if (plugin->state == PLY_BOOT_SPLASH_DISPLAY_PASSWORD_ENTRY) + ply_console_viewer_clear_line (view->console_viewer); - ply_console_viewer_print (view->console_viewer, "\n"); + ply_console_viewer_print (view->console_viewer, "\n"); + } if (ply_entry_is_hidden (view->entry)) return; @@ -350,8 +352,7 @@ view_free (view_t *view) ply_label_free (view->message_label); free_stars (view); - if (view->console_viewer) - ply_console_viewer_free (view->console_viewer); + ply_console_viewer_free (view->console_viewer); ply_pixel_display_set_draw_handler (view->display, NULL, NULL); @@ -850,9 +851,8 @@ on_draw (view_t *view, x, y, width, height); } - if (plugin->plugin_console_messages_updating == false && view->console_viewer) { + if (!plugin->plugin_console_messages_updating && view->console_viewer != NULL) ply_console_viewer_draw_area (view->console_viewer, pixel_buffer, x, y, width, height); - } } static void @@ -926,7 +926,8 @@ show_splash_screen (ply_boot_splash_plugin_t *plugin, view = ply_list_node_get_data (node); next_node = ply_list_get_next_node (plugin->views, node); - ply_console_viewer_convert_boot_buffer (view->console_viewer, plugin->boot_buffer); + if (view->console_viewer != NULL) + ply_console_viewer_convert_boot_buffer (view->console_viewer, plugin->boot_buffer); node = next_node; } @@ -1081,7 +1082,8 @@ show_message (ply_boot_splash_plugin_t *plugin, ply_label_get_height (view->message_label)); - ply_console_viewer_print (view->console_viewer, "\n%s\n", message); + if (view->console_viewer != NULL) + ply_console_viewer_print (view->console_viewer, "\n%s\n", message); node = next_node; } } From 0c62d4a0cf69a36335409419774d682ec849665d Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Thu, 28 Dec 2023 09:31:08 -0500 Subject: [PATCH 3/4] space-flares: Be more tolerant when there's no console viewer There are still a number of places in the code where a console viewer is expected, when it's totally possible that there won't be one. This commit runs through them, and does a few other style cleanups on the way. --- src/plugins/splash/space-flares/plugin.c | 35 +++++++++++------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/src/plugins/splash/space-flares/plugin.c b/src/plugins/splash/space-flares/plugin.c index 9a4fb7e4..9b200633 100644 --- a/src/plugins/splash/space-flares/plugin.c +++ b/src/plugins/splash/space-flares/plugin.c @@ -224,7 +224,6 @@ static void on_boot_output (ply_boot_splash_plugin_t *plugin, static void toggle_console_messages (ply_boot_splash_plugin_t *plugin); static void display_console_messages (ply_boot_splash_plugin_t *plugin); static void hide_console_messages (ply_boot_splash_plugin_t *plugin); -static void unhide_console_messages (ply_boot_splash_plugin_t *plugin); static view_t * view_new (ply_boot_splash_plugin_t *plugin, @@ -266,8 +265,7 @@ view_free (view_t *view) view_free_sprites (view); ply_list_free (view->sprites); - if (view->console_viewer) - ply_console_viewer_free (view->console_viewer); + ply_console_viewer_free (view->console_viewer); ply_image_free (view->scaled_background_image); @@ -541,10 +539,12 @@ view_hide_prompt (view_t *view) plugin = view->plugin; /* Obscure the password length in the scroll back */ - if (plugin->state == PLY_BOOT_SPLASH_DISPLAY_PASSWORD_ENTRY) - ply_console_viewer_clear_line (view->console_viewer); + if (view->console_viewer != NULL) { + if (plugin->state == PLY_BOOT_SPLASH_DISPLAY_PASSWORD_ENTRY) + ply_console_viewer_clear_line (view->console_viewer); - ply_console_viewer_print (view->console_viewer, "\n"); + ply_console_viewer_print (view->console_viewer, "\n"); + } ply_entry_hide (view->entry); ply_label_hide (view->label); @@ -1450,9 +1450,8 @@ on_draw (view_t *view, pixel_buffer, x, y, width, height); - if (plugin->plugin_console_messages_updating == false && view->console_viewer) { + if (!plugin->plugin_console_messages_updating && view->console_viewer != NULL) ply_console_viewer_draw_area (view->console_viewer, pixel_buffer, x, y, width, height); - } } static void @@ -1754,7 +1753,8 @@ show_splash_screen (ply_boot_splash_plugin_t *plugin, view = ply_list_node_get_data (node); next_node = ply_list_get_next_node (plugin->views, node); - ply_console_viewer_convert_boot_buffer (view->console_viewer, plugin->boot_buffer); + if (view->console_viewer != NULL) + ply_console_viewer_convert_boot_buffer (view->console_viewer, plugin->boot_buffer); node = next_node; } @@ -1912,7 +1912,9 @@ show_message (ply_boot_splash_plugin_t *plugin, next_node = ply_list_get_next_node (plugin->views, node); ply_label_set_text (view->message_label, message); ply_label_show (view->message_label, view->display, 10, 10); - ply_console_viewer_print (view->console_viewer, "\n%s\n", message); + + if (view->console_viewer != NULL) + ply_console_viewer_print (view->console_viewer, "\n%s\n", message); ply_pixel_display_draw_area (view->display, 10, 10, ply_label_get_width (view->message_label), @@ -2011,7 +2013,8 @@ toggle_console_messages (ply_boot_splash_plugin_t *plugin) plugin->should_show_console_messages = false; hide_console_messages (plugin); } else { - unhide_console_messages (plugin); + plugin->should_show_console_messages = true; + display_console_messages (plugin); } } @@ -2030,7 +2033,8 @@ display_console_messages (ply_boot_splash_plugin_t *plugin) node = ply_list_get_first_node (plugin->views); while (node != NULL) { view = ply_list_node_get_data (node); - ply_console_viewer_show (view->console_viewer, view->display); + if (view->console_viewer != NULL) + ply_console_viewer_show (view->console_viewer, view->display); node = ply_list_get_next_node (plugin->views, node); } plugin->plugin_console_messages_updating = false; @@ -2040,13 +2044,6 @@ display_console_messages (ply_boot_splash_plugin_t *plugin) unpause_views (plugin); } -static void -unhide_console_messages (ply_boot_splash_plugin_t *plugin) -{ - plugin->should_show_console_messages = true; - display_console_messages (plugin); -} - static void hide_console_messages (ply_boot_splash_plugin_t *plugin) { From 1a3251c43fee90e7549459e74b5d7be82f9081e0 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Thu, 28 Dec 2023 09:31:08 -0500 Subject: [PATCH 4/4] two-step: Be more tolerant when there's no console viewer There are still a number of places in the code where a console viewer is expected, when it's totally possible that there won't be one. This commit runs through them, and does a few other style cleanups on the way. --- src/plugins/splash/two-step/plugin.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/plugins/splash/two-step/plugin.c b/src/plugins/splash/two-step/plugin.c index c7c0f81c..802400a4 100644 --- a/src/plugins/splash/two-step/plugin.c +++ b/src/plugins/splash/two-step/plugin.c @@ -291,8 +291,7 @@ view_free (view_t *view) ply_label_free (view->title_label); ply_label_free (view->subtitle_label); - if (view->console_viewer) - ply_console_viewer_free (view->console_viewer); + ply_console_viewer_free (view->console_viewer); if (view->background_buffer != NULL) ply_pixel_buffer_free (view->background_buffer); @@ -1098,10 +1097,12 @@ view_hide_prompt (view_t *view) plugin = view->plugin; /* Obscure the password length in the scroll back */ - if (plugin->state == PLY_BOOT_SPLASH_DISPLAY_PASSWORD_ENTRY) - ply_console_viewer_clear_line (view->console_viewer); + if (view->console_viewer != NULL) { + if (plugin->state == PLY_BOOT_SPLASH_DISPLAY_PASSWORD_ENTRY) + ply_console_viewer_clear_line (view->console_viewer); - ply_console_viewer_print (view->console_viewer, "\n"); + ply_console_viewer_print (view->console_viewer, "\n"); + } ply_entry_hide (view->entry); @@ -1759,7 +1760,7 @@ on_draw (view_t *view, pixel_buffer, x, y, width, height); - if (!plugin->plugin_console_messages_updating && view->console_viewer) + if (!plugin->plugin_console_messages_updating && view->console_viewer != NULL) ply_console_viewer_draw_area (view->console_viewer, pixel_buffer, x, y, width, height); } @@ -1838,7 +1839,8 @@ show_splash_screen (ply_boot_splash_plugin_t *plugin, view = ply_list_node_get_data (node); next_node = ply_list_get_next_node (plugin->views, node); - ply_console_viewer_convert_boot_buffer (view->console_viewer, plugin->boot_buffer); + if (view->console_viewer != NULL) + ply_console_viewer_convert_boot_buffer (view->console_viewer, plugin->boot_buffer); node = next_node; } @@ -2144,7 +2146,8 @@ view_show_message (view_t *view, ply_label_show (view->message_label, view->display, x, y); ply_pixel_display_draw_area (view->display, x, y, width, height); - ply_console_viewer_print (view->console_viewer, "\n%s\n", message); + if (view->console_viewer != NULL) + ply_console_viewer_print (view->console_viewer, "\n%s\n", message); } static void @@ -2290,7 +2293,8 @@ display_console_messages (ply_boot_splash_plugin_t *plugin) node = ply_list_get_first_node (plugin->views); while (node != NULL) { view = ply_list_node_get_data (node); - ply_console_viewer_show (view->console_viewer, view->display); + if (view->console_viewer != NULL) + ply_console_viewer_show (view->console_viewer, view->display); node = ply_list_get_next_node (plugin->views, node); } plugin->plugin_console_messages_updating = false; @@ -2320,7 +2324,8 @@ hide_console_messages (ply_boot_splash_plugin_t *plugin) node = ply_list_get_first_node (plugin->views); while (node != NULL) { view = ply_list_node_get_data (node); - ply_console_viewer_hide (view->console_viewer); + if (view->console_viewer != NULL) + ply_console_viewer_hide (view->console_viewer); node = ply_list_get_next_node (plugin->views, node); } plugin->plugin_console_messages_updating = false; @@ -2346,7 +2351,8 @@ on_boot_output (ply_boot_splash_plugin_t *plugin, node = ply_list_get_first_node (plugin->views); while (node != NULL) { view = ply_list_node_get_data (node); - ply_console_viewer_write (view->console_viewer, output, size); + if (view->console_viewer != NULL) + ply_console_viewer_write (view->console_viewer, output, size); node = ply_list_get_next_node (plugin->views, node); } }