mirror of
https://gitlab.freedesktop.org/plymouth/plymouth.git
synced 2026-05-06 07:58:10 +02:00
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:
commit
8479450804
4 changed files with 77 additions and 41 deletions
|
|
@ -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 *
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue