Merge branch 'console-viewer-crasher-fix' into 'main'

ply-console-viewer: Handle fonts failing to load better

See merge request plymouth/plymouth!282
This commit is contained in:
Ray Strode 2023-12-28 15:01:18 +00:00
commit 8479450804
4 changed files with 77 additions and 41 deletions

View file

@ -21,6 +21,7 @@
#include <assert.h>
#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 *

View file

@ -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;
}
}

View file

@ -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)
{

View file

@ -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);
}
}