Add hook to ply-terminal-session to notify on boot output.

Drop set_output_buffer api and propagate boot output to splash plugins
calculate-0.9.5
Ray Strode 16 years ago
parent 2103fb014f
commit b8781ead84

@ -37,7 +37,6 @@
#include <termios.h>
#include <unistd.h>
#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 <stdio.h>
@ -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))
{

@ -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 */

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

@ -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,

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

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

@ -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,

Loading…
Cancel
Save