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 * 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; } } 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) { 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); } }