From: n3rdopolis Date: Mon, 20 Mar 2023 02:43:11 +0000 (-0400) Subject: script: Use new interfaces in ply-boot-splash for ply-kmsg-reader, and use ply-kmsg... X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=df538944cb8c699e31a491eecee169a869adb59c;p=thirdparty%2Fplymouth.git script: Use new interfaces in ply-boot-splash for ply-kmsg-reader, and use ply-kmsg-viewer to display the boot messages --- diff --git a/src/plugins/splash/script/plugin.c b/src/plugins/splash/script/plugin.c index 6b04fd00..64c6f660 100644 --- a/src/plugins/splash/script/plugin.c +++ b/src/plugins/splash/script/plugin.c @@ -52,6 +52,7 @@ #include "ply-pixel-display.h" #include "ply-trigger.h" #include "ply-utils.h" +#include "ply-terminal-emulator.h" #include "script.h" #include "script-parse.h" @@ -65,6 +66,8 @@ #include +#define CONSOLE_POLLS_PER_SECOND 4 + #ifndef FRAMES_PER_SECOND #define FRAMES_PER_SECOND 50 #endif @@ -90,6 +93,14 @@ struct _ply_boot_splash_plugin script_lib_string_data_t *script_string_lib; uint32_t is_animating : 1; + + char *monospace_font; + uint32_t has_new_console_messages : 1; + uint32_t should_show_console_messages : 1; + ply_list_t *console_messages; + ply_buffer_t *boot_buffer; + ply_terminal_emulator_t *terminal_emulator; + uint32_t console_text_color; }; typedef struct @@ -104,6 +115,14 @@ ply_boot_splash_plugin_interface_t *ply_boot_splash_plugin_get_interface (void); static void on_keyboard_input (ply_boot_splash_plugin_t *plugin, const char *keyboard_input, size_t character_size); +static void on_boot_output (ply_boot_splash_plugin_t *plugin, + const char *output, + size_t size); +static void toggle_console_messages (ply_boot_splash_plugin_t *plugin); +static void display_console_messages (ply_boot_splash_plugin_t *plugin); +static void on_update_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 void pause_displays (ply_boot_splash_plugin_t *plugin) @@ -179,6 +198,17 @@ create_plugin (ply_key_file_t *key_file) plugin->script_env_vars = ply_list_new (); ply_key_file_foreach_entry (key_file, add_script_env_var, plugin->script_env_vars); + /* Likely only able to set the font if the font is in the initrd */ + plugin->monospace_font = ply_key_file_get_value (key_file, "two-step", "MonospaceFont"); + + if (plugin->monospace_font == NULL) + plugin->monospace_font = strdup ("monospace 9"); + + plugin->console_text_color = + ply_key_file_get_long (key_file, "two-step", + "ConsoleLogTextColor", + PLY_CONSOLE_VIEWER_LOG_TEXT_COLOR); + plugin->displays = ply_list_new (); return plugin; } @@ -194,6 +224,12 @@ destroy_plugin (ply_boot_splash_plugin_t *plugin) if (plugin->loop != NULL) { stop_animation (plugin); + + ply_event_loop_stop_watching_for_timeout (plugin->loop, + (ply_event_loop_timeout_handler_t) + on_update_console_messages, plugin); + + ply_event_loop_stop_watching_for_exit (plugin->loop, (ply_event_loop_exit_handler_t) detach_from_event_loop, @@ -212,6 +248,7 @@ destroy_plugin (ply_boot_splash_plugin_t *plugin) ply_list_free (plugin->script_env_vars); free (plugin->script_filename); free (plugin->image_dir); + free (plugin->monospace_font); free (plugin); } @@ -248,6 +285,7 @@ on_boot_progress (ply_boot_splash_plugin_t *plugin, static bool start_script_animation (ply_boot_splash_plugin_t *plugin) { + ply_list_t *displays; ply_list_node_t *node; script_obj_t *target_obj; script_obj_t *value_obj; @@ -277,6 +315,23 @@ start_script_animation (ply_boot_splash_plugin_t *plugin) plugin->script_math_lib = script_lib_math_setup (plugin->script_state); plugin->script_string_lib = script_lib_string_setup (plugin->script_state); + + displays = script_lib_get_displays (plugin->script_sprite_lib); + node = ply_list_get_first_node (displays); + while (node != NULL) { + script_lib_display_t *display; + ply_list_node_t *next_node; + + display = ply_list_node_get_data (node); + next_node = ply_list_get_next_node (displays, node); + + display->console_viewer = ply_console_viewer_new (display->pixel_display, plugin->monospace_font); + ply_console_viewer_attach_console_messages (display->console_viewer, plugin->console_messages); + ply_console_viewer_set_text_color (display->console_viewer, plugin->console_text_color); + + node = next_node; + } + ply_trace ("executing script file"); script_return_t ret = script_execute (plugin->script_state, plugin->script_main_op); @@ -427,6 +482,17 @@ show_splash_screen (ply_boot_splash_plugin_t *plugin, plugin->loop = loop; plugin->mode = mode; + if (boot_buffer) { + plugin->boot_buffer = boot_buffer; + + ply_terminal_emulator_convert_boot_buffer (plugin->terminal_emulator, plugin->boot_buffer); + } + + ply_event_loop_watch_for_timeout (loop, + 1.0 / CONSOLE_POLLS_PER_SECOND, + (ply_event_loop_timeout_handler_t) + on_update_console_messages, plugin); + ply_event_loop_watch_for_exit (loop, (ply_event_loop_exit_handler_t) detach_from_event_loop, plugin); @@ -462,6 +528,10 @@ hide_splash_screen (ply_boot_splash_plugin_t *plugin, if (plugin->loop != NULL) { stop_animation (plugin); + ply_event_loop_stop_watching_for_timeout (plugin->loop, + (ply_event_loop_timeout_handler_t) + on_update_console_messages, plugin); + ply_event_loop_stop_watching_for_exit (plugin->loop, (ply_event_loop_exit_handler_t) detach_from_event_loop, @@ -490,6 +560,7 @@ display_normal (ply_boot_splash_plugin_t *plugin) pause_displays (plugin); script_lib_plymouth_on_display_normal (plugin->script_state, plugin->script_plymouth_lib); + unpause_displays (plugin); } @@ -524,10 +595,16 @@ validate_input (ply_boot_splash_plugin_t *plugin, const char *entry_text, const char *add_text) { - return script_lib_plymouth_on_validate_input (plugin->script_state, - plugin->script_plymouth_lib, - entry_text, - add_text); + bool ret = script_lib_plymouth_on_validate_input (plugin->script_state, + plugin->script_plymouth_lib, + entry_text, + add_text); + if (strcmp (add_text, "\e") == 0) { + toggle_console_messages (plugin); + return false; + } + + return ret; } static void @@ -567,6 +644,72 @@ hide_message (ply_boot_splash_plugin_t *plugin, unpause_displays (plugin); } +static void +toggle_console_messages (ply_boot_splash_plugin_t *plugin) +{ + if (plugin->should_show_console_messages == true) { + plugin->should_show_console_messages = false; + hide_console_messages (plugin); + } else { + plugin->should_show_console_messages = true; + unhide_console_messages (plugin); + } +} + +static void +on_update_console_messages (ply_boot_splash_plugin_t *plugin) +{ + if (plugin->loop != NULL) { + ply_event_loop_watch_for_timeout (plugin->loop, + 1.0 / CONSOLE_POLLS_PER_SECOND, + (ply_event_loop_timeout_handler_t) + on_update_console_messages, plugin); + } + + if (plugin->has_new_console_messages == false) + return; + + plugin->has_new_console_messages = false; + + if (plugin->should_show_console_messages == false) + return; + + display_console_messages (plugin); +} + +static void +display_console_messages (ply_boot_splash_plugin_t *plugin) +{ + pause_displays (plugin); + script_lib_console_viewer_show (plugin->script_sprite_lib); + unpause_displays (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) +{ + plugin->should_show_console_messages = false; + script_lib_console_viewer_hide (plugin->script_sprite_lib); +} + +static void +on_boot_output (ply_boot_splash_plugin_t *plugin, + const char *output, + size_t size) +{ + plugin->has_new_console_messages = true; + char *output_text = strndup (output, size); + + ply_terminal_emulator_parse_lines (plugin->terminal_emulator, output_text); +} + ply_boot_splash_plugin_interface_t * ply_boot_splash_plugin_get_interface (void) { @@ -591,6 +734,7 @@ ply_boot_splash_plugin_get_interface (void) .display_prompt = display_prompt, .display_message = display_message, .hide_message = hide_message, + .on_boot_output = on_boot_output, .validate_input = validate_input, }; diff --git a/src/plugins/splash/script/script-lib-sprite.c b/src/plugins/splash/script/script-lib-sprite.c index c7e83172..562c1c3b 100644 --- a/src/plugins/splash/script/script-lib-sprite.c +++ b/src/plugins/splash/script/script-lib-sprite.c @@ -449,7 +449,8 @@ static void script_lib_sprite_draw_area (script_lib_display_t *display, ((int) ply_pixel_buffer_get_height (sprite->image) + position_y) < (y + height)) script_lib_draw_brackground (pixel_buffer, &clip_area, data); } else { - script_lib_draw_brackground (pixel_buffer, &clip_area, data); + if (!data->plugin_console_messages_updating) + script_lib_draw_brackground (pixel_buffer, &clip_area, data); } for (node = ply_list_get_first_node (data->sprite_list); @@ -457,6 +458,9 @@ static void script_lib_sprite_draw_area (script_lib_display_t *display, node = ply_list_get_next_node (data->sprite_list, node)) { int position_x, position_y; + if (data->plugin_console_messages_updating) + break; + sprite = ply_list_node_get_data (node); if (!sprite->image) continue; @@ -478,6 +482,10 @@ static void script_lib_sprite_draw_area (script_lib_display_t *display, &clip_area, sprite->opacity); } + + if (data->plugin_console_messages_updating == false && display->console_viewer != NULL) { + ply_console_viewer_draw_area (display->console_viewer, pixel_buffer, x, y, width, height); + } } static void @@ -861,6 +869,7 @@ void script_lib_sprite_destroy (script_lib_sprite_data_t *data) node; node = ply_list_get_next_node (data->displays, node)) { script_lib_display_t *display = ply_list_node_get_data (node); + ply_console_viewer_free (display->console_viewer); ply_pixel_display_set_draw_handler (display->pixel_display, NULL, NULL); } @@ -882,3 +891,59 @@ void script_lib_sprite_destroy (script_lib_sprite_data_t *data) free (data); data = NULL; } + +ply_list_t * +script_lib_get_displays (script_lib_sprite_data_t *data) +{ + return data->displays; +} + +void +script_lib_console_viewer_show (script_lib_sprite_data_t *data) +{ + ply_list_node_t *node; + + data->plugin_console_messages_updating = true; + + data->full_refresh = true; + + node = ply_list_get_first_node (data->displays); + while (node != NULL) { + script_lib_display_t *display; + ply_list_node_t *next_node; + + display = ply_list_node_get_data (node); + next_node = ply_list_get_next_node (data->displays, node); + + ply_console_viewer_show (display->console_viewer, display->pixel_display); + + node = next_node; + } + + data->plugin_console_messages_updating = false; +} + +void +script_lib_console_viewer_hide (script_lib_sprite_data_t *data) +{ + ply_list_node_t *node; + + data->plugin_console_messages_updating = true; + + data->full_refresh = true; + + node = ply_list_get_first_node (data->displays); + while (node != NULL) { + script_lib_display_t *display; + ply_list_node_t *next_node; + + display = ply_list_node_get_data (node); + next_node = ply_list_get_next_node (data->displays, node); + + ply_console_viewer_hide (display->console_viewer); + + node = next_node; + } + + data->plugin_console_messages_updating = false; +} diff --git a/src/plugins/splash/script/script-lib-sprite.h b/src/plugins/splash/script/script-lib-sprite.h index 6783d25d..915e9036 100644 --- a/src/plugins/splash/script/script-lib-sprite.h +++ b/src/plugins/splash/script/script-lib-sprite.h @@ -25,6 +25,7 @@ #include "script.h" #include "ply-pixel-buffer.h" #include "ply-pixel-display.h" +#include "ply-console-viewer.h" typedef struct { @@ -37,6 +38,8 @@ typedef struct bool full_refresh; unsigned int max_width; unsigned int max_height; + + bool plugin_console_messages_updating; } script_lib_sprite_data_t; typedef struct @@ -45,6 +48,8 @@ typedef struct script_lib_sprite_data_t *data; int x; int y; + + ply_console_viewer_t *console_viewer; } script_lib_display_t; typedef struct @@ -73,5 +78,8 @@ void script_lib_sprite_pixel_display_removed (script_lib_sprite_data_t *data, ply_pixel_display_t *pixel_display); void script_lib_sprite_refresh (script_lib_sprite_data_t *data); void script_lib_sprite_destroy (script_lib_sprite_data_t *data); +ply_list_t *script_lib_get_displays (script_lib_sprite_data_t *data); +void script_lib_console_viewer_show (script_lib_sprite_data_t *data); +void script_lib_console_viewer_hide (script_lib_sprite_data_t *data); #endif /* SCRIPT_LIB_SPRITE_H */