diff --git a/src/libply/ply-terminal-session.c b/src/libply/ply-terminal-session.c index 8d4850b..2e17986 100644 --- a/src/libply/ply-terminal-session.c +++ b/src/libply/ply-terminal-session.c @@ -37,7 +37,6 @@ #include #include -#include "ply-buffer.h" #include "ply-event-loop.h" #include "ply-logger.h" #include "ply-terminal.h" @@ -47,12 +46,12 @@ struct _ply_terminal_session { ply_terminal_t *terminal; ply_logger_t *logger; - ply_buffer_t *output_buffer; ply_event_loop_t *loop; char **argv; + ply_terminal_session_output_handler_t output_handler; ply_terminal_session_done_handler_t done_handler; - void *done_handler_user_data; + void *user_data; uint32_t is_running : 1; uint32_t console_is_redirected : 1; @@ -231,6 +230,7 @@ bool ply_terminal_session_run (ply_terminal_session_t *session, ply_terminal_session_flags_t flags, ply_terminal_session_begin_handler_t begin_handler, + ply_terminal_session_output_handler_t output_handler, ply_terminal_session_done_handler_t done_handler, void *user_data) { @@ -284,8 +284,9 @@ ply_terminal_session_run (ply_terminal_session_t *session, ((pid != 0) && !run_in_parent)) { session->is_running = true; + session->output_handler = output_handler; session->done_handler = done_handler; - session->done_handler_user_data = user_data; + session->user_data = user_data; ply_terminal_session_start_logging (session); return true; @@ -324,7 +325,10 @@ ply_terminal_session_log_bytes (ply_terminal_session_t *session, assert (number_of_bytes != 0); ply_logger_inject_bytes (session->logger, bytes, number_of_bytes); - ply_buffer_append_bytes (session->output_buffer, bytes, number_of_bytes); + + if (session->output_handler != NULL) + session->output_handler (session->user_data, + bytes, number_of_bytes, session); } static void @@ -355,7 +359,7 @@ ply_terminal_session_on_hangup (ply_terminal_session_t *session) session->is_running = false; if (session->done_handler != NULL) - session->done_handler (session->done_handler_user_data, session); + session->done_handler (session->user_data, session); ply_terminal_session_stop_logging (session); } @@ -421,14 +425,6 @@ ply_terminal_session_close_log (ply_terminal_session_t *session) return ply_logger_close_file (session->logger); } -void -ply_terminal_session_set_output_buffer (ply_terminal_session_t *session, - ply_buffer_t *buffer) -{ - assert (session != NULL); - session->output_buffer = buffer; -} - #ifdef PLY_TERMINAL_SESSION_ENABLE_TEST #include @@ -464,6 +460,7 @@ main (int argc, if (!ply_terminal_session_run (session, flags, (ply_terminal_session_begin_handler_t) NULL, + (ply_terminal_session_output_handler_t) NULL, (ply_terminal_session_done_handler_t) on_finished, loop)) { diff --git a/src/libply/ply-terminal-session.h b/src/libply/ply-terminal-session.h index e11b2f3..27368e3 100644 --- a/src/libply/ply-terminal-session.h +++ b/src/libply/ply-terminal-session.h @@ -34,6 +34,8 @@ typedef struct _ply_terminal_session ply_terminal_session_t; typedef void (* ply_terminal_session_begin_handler_t) (void *user_data, ply_terminal_session_t *session); +typedef void (* ply_terminal_session_output_handler_t) + (void *user_data, const char *output, size_t size, ply_terminal_session_t *session); typedef void (* ply_terminal_session_done_handler_t) (void *user_data, ply_terminal_session_t *session); @@ -48,21 +50,19 @@ typedef enum #ifndef PLY_HIDE_FUNCTION_DECLARATIONS ply_terminal_session_t *ply_terminal_session_new (const char * const *argv); - void ply_terminal_session_free (ply_terminal_session_t *session); void ply_terminal_session_attach_to_event_loop (ply_terminal_session_t *session, ply_event_loop_t *loop); bool ply_terminal_session_run (ply_terminal_session_t *session, ply_terminal_session_flags_t flags, ply_terminal_session_begin_handler_t begin_handler, + ply_terminal_session_output_handler_t output_handler, ply_terminal_session_done_handler_t done_handler, void *user_data); int ply_terminal_session_get_fd (ply_terminal_session_t *session); bool ply_terminal_session_open_log (ply_terminal_session_t *session, const char *filename); void ply_terminal_session_close_log (ply_terminal_session_t *session); -void ply_terminal_session_set_output_buffer (ply_terminal_session_t *session, - ply_buffer_t *buffer); #endif #endif /* PLY_TERMINAL_SESSION_H */ diff --git a/src/main.c b/src/main.c index da8c554..6fc40b7 100644 --- a/src/main.c +++ b/src/main.c @@ -69,6 +69,18 @@ on_session_start (state_t *state) } } +static void +on_session_output (state_t *state, + const char *output, + size_t size) +{ + ply_buffer_append_bytes (state->boot_buffer, output, size); + + if (state->boot_splash != NULL) + ply_boot_splash_update_output (state->boot_splash, + output, size); +} + static void on_session_finished (state_t *state) { @@ -228,13 +240,12 @@ spawn_session (state_t *state, ply_trace ("attaching terminal session to event loop"); ply_terminal_session_attach_to_event_loop (session, state->loop); - ply_trace ("buffering terminal session for replay if user presses escape"); - ply_terminal_session_set_output_buffer (session, state->boot_buffer); - ply_trace ("running '%s'", argv[0]); if (!ply_terminal_session_run (session, flags, (ply_terminal_session_begin_handler_t) on_session_start, + (ply_terminal_session_output_handler_t) + on_session_output, (ply_terminal_session_done_handler_t) on_session_finished, state)) { diff --git a/src/ply-boot-splash-plugin.h b/src/ply-boot-splash-plugin.h index 29aef6e..890b709 100644 --- a/src/ply-boot-splash-plugin.h +++ b/src/ply-boot-splash-plugin.h @@ -42,6 +42,9 @@ typedef struct ply_buffer_t *boot_buffer); void (* update_status) (ply_boot_splash_plugin_t *plugin, const char *status); + void (* on_boot_output) (ply_boot_splash_plugin_t *plugin, + const char *output, + size_t size); void (* hide_splash_screen) (ply_boot_splash_plugin_t *plugin, ply_window_t *window); void (* attach_to_event_loop) (ply_boot_splash_plugin_t *plugin, diff --git a/src/ply-boot-splash.c b/src/ply-boot-splash.c index 922f5f1..9d59d5d 100644 --- a/src/ply-boot-splash.c +++ b/src/ply-boot-splash.c @@ -218,6 +218,18 @@ ply_boot_splash_update_status (ply_boot_splash_t *splash, splash->plugin_interface->update_status (splash->plugin, status); } +void +ply_boot_splash_update_output (ply_boot_splash_t *splash, + const char *output, + size_t size) +{ + assert (splash != NULL); + assert (output != NULL); + + if (splash->plugin_interface->on_boot_output != NULL) + splash->plugin_interface->on_boot_output (splash->plugin, output, size); +} + char * ply_boot_splash_ask_for_password (ply_boot_splash_t *splash) { diff --git a/src/ply-boot-splash.h b/src/ply-boot-splash.h index b314378..fefb359 100644 --- a/src/ply-boot-splash.h +++ b/src/ply-boot-splash.h @@ -40,6 +40,9 @@ void ply_boot_splash_free (ply_boot_splash_t *splash); bool ply_boot_splash_show (ply_boot_splash_t *splash); void ply_boot_splash_update_status (ply_boot_splash_t *splash, const char *status); +void ply_boot_splash_update_output (ply_boot_splash_t *splash, + const char *output, + size_t size); char *ply_boot_splash_ask_for_password (ply_boot_splash_t *splash); void ply_boot_splash_hide (ply_boot_splash_t *splash); diff --git a/src/splash-plugins/details/details.c b/src/splash-plugins/details/details.c index c5142a2..6eca872 100644 --- a/src/splash-plugins/details/details.c +++ b/src/splash-plugins/details/details.c @@ -106,6 +106,15 @@ update_status (ply_boot_splash_plugin_t *plugin, ply_trace ("status update"); } +void +on_boot_output (ply_boot_splash_plugin_t *plugin, + const char *output, + size_t size) +{ + if (size > 0) + write (STDOUT_FILENO, output, size); +} + static void detach_from_event_loop (ply_boot_splash_plugin_t *plugin) { @@ -185,6 +194,7 @@ ply_boot_splash_plugin_get_interface (void) .destroy_plugin = destroy_plugin, .show_splash_screen = show_splash_screen, .update_status = update_status, + .on_boot_output = on_boot_output, .hide_splash_screen = hide_splash_screen, .attach_to_event_loop = attach_to_event_loop, .ask_for_password = ask_for_password,