From: Scott James Remnant Date: Thu, 18 Mar 2010 21:05:32 +0000 (+0000) Subject: [daemon] add "has active vt?" request X-Git-Tag: 0.8.0~29 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d54ae457214764e081b970e36faf597d22eb89b8;p=thirdparty%2Fplymouth.git [daemon] add "has active vt?" request One problem with the current deactivate/quit transition into X is that the display manager will, if Plymouth was running, re-use the currently active VT. That only works if Plymouth was actually displaying a splash screen on that VT. If --show-splash hasn't been called yet because we booted too fast, we'll be on the wrong VT. Add a request to ask whether the Plymouth VT is active; I've done it this way so the answer defaults to "yes" for Fedora who use VT1. The pseudo-code for transition is thus: if plymouth is running (ping): plymouth deactivate if plymouth has active vt: start X on current VT with -nr if X starts ok: plymouth quit --retain-splash else if X fails: plymouth quit else if plymouth doesn't have active vt: plymouth quit start X as normal else if plymouth isn't running: start X as normal --- diff --git a/src/main.c b/src/main.c index 1333d2c0..337afa65 100644 --- a/src/main.c +++ b/src/main.c @@ -896,6 +896,15 @@ on_quit (state_t *state, quit_program (state); } +static bool +on_has_active_vt (state_t *state) +{ + if (state->terminal != NULL) + return ply_terminal_is_active (state->terminal); + else + return false; +} + static ply_boot_server_t * start_boot_server (state_t *state) { @@ -917,6 +926,7 @@ start_boot_server (state_t *state) (ply_boot_server_deactivate_handler_t) on_deactivate, (ply_boot_server_reactivate_handler_t) on_reactivate, (ply_boot_server_quit_handler_t) on_quit, + (ply_boot_server_has_active_vt_handler_t) on_has_active_vt, state); if (!ply_boot_server_listen (server)) diff --git a/src/ply-boot-protocol.h b/src/ply-boot-protocol.h index f1789fa5..89db6ea3 100644 --- a/src/ply-boot-protocol.h +++ b/src/ply-boot-protocol.h @@ -40,6 +40,7 @@ #define PLY_BOOT_PROTOCOL_REQUEST_TYPE_SHOW_SPLASH "$" #define PLY_BOOT_PROTOCOL_REQUEST_TYPE_HIDE_SPLASH "H" #define PLY_BOOT_PROTOCOL_REQUEST_TYPE_NEWROOT "R" +#define PLY_BOOT_PROTOCOL_REQUEST_TYPE_HAS_ACTIVE_VT "V" #define PLY_BOOT_PROTOCOL_REQUEST_TYPE_ERROR "!" #define PLY_BOOT_PROTOCOL_RESPONSE_TYPE_ACK "\x6" diff --git a/src/ply-boot-server.c b/src/ply-boot-server.c index bd248360..42c10f77 100644 --- a/src/ply-boot-server.c +++ b/src/ply-boot-server.c @@ -68,6 +68,7 @@ struct _ply_boot_server ply_boot_server_deactivate_handler_t deactivate_handler; ply_boot_server_reactivate_handler_t reactivate_handler; ply_boot_server_quit_handler_t quit_handler; + ply_boot_server_has_active_vt_handler_t has_active_vt_handler; void *user_data; uint32_t is_listening : 1; @@ -89,7 +90,8 @@ ply_boot_server_new (ply_boot_server_update_handler_t update_handler, ply_boot_server_error_handler_t error_handler, ply_boot_server_deactivate_handler_t deactivate_handler, ply_boot_server_reactivate_handler_t reactivate_handler, - ply_boot_server_quit_handler_t quit_handler, + ply_boot_server_quit_handler_t quit_handler, + ply_boot_server_has_active_vt_handler_t has_active_vt_handler, void *user_data) { ply_boot_server_t *server; @@ -115,6 +117,7 @@ ply_boot_server_new (ply_boot_server_update_handler_t update_handler, server->deactivate_handler = deactivate_handler; server->reactivate_handler = reactivate_handler; server->quit_handler = quit_handler; + server->has_active_vt_handler = has_active_vt_handler; server->user_data = user_data; return server; @@ -582,6 +585,25 @@ ply_boot_connection_on_request (ply_boot_connection_t *connection) if (server->newroot_handler != NULL) server->newroot_handler(server->user_data, argument, server); } + else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_HAS_ACTIVE_VT) == 0) + { + bool answer = false; + + ply_trace ("got has_active vt? request"); + if (server->has_active_vt_handler != NULL) + answer = server->has_active_vt_handler(server->user_data, server); + + if (!answer) + { + if (!ply_write (connection->fd, + PLY_BOOT_PROTOCOL_RESPONSE_TYPE_NAK, + strlen (PLY_BOOT_PROTOCOL_RESPONSE_TYPE_NAK))) + ply_error ("could not write bytes: %m"); + + free(command); + return; + } + } else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_PING) != 0) { ply_error ("received unknown command '%s' from client", command); @@ -803,6 +825,13 @@ on_ignore_keystroke (ply_event_loop_t *loop) return; } +static bool +on_has_active_vt (ply_event_loop_t *loop) +{ + printf ("got has_active vt? request\n"); + return true; +} + int main (int argc, char **argv) @@ -831,6 +860,7 @@ main (int argc, (ply_boot_server_deactivate_handler_t) on_deactivate, (ply_boot_server_reactivate_handler_t) on_reactivate, (ply_boot_server_quit_handler_t) on_quit, + (ply_boot_server_has_active_vt_handler_t) on_has_active_vt, loop); if (!ply_boot_server_listen (server)) diff --git a/src/ply-boot-server.h b/src/ply-boot-server.h index 7ea8fc64..4c229f4e 100644 --- a/src/ply-boot-server.h +++ b/src/ply-boot-server.h @@ -89,6 +89,8 @@ typedef void (* ply_boot_server_quit_handler_t) (void *user_data, bool retain_splash, ply_trigger_t *quit_trigger, ply_boot_server_t *server); +typedef bool (* ply_boot_server_has_active_vt_handler_t) (void *user_data, + ply_boot_server_t *server); #ifndef PLY_HIDE_FUNCTION_DECLARATIONS ply_boot_server_t *ply_boot_server_new (ply_boot_server_update_handler_t update_handler, @@ -107,6 +109,7 @@ ply_boot_server_t *ply_boot_server_new (ply_boot_server_update_handler_t update_ ply_boot_server_deactivate_handler_t deactivate_handler, ply_boot_server_reactivate_handler_t reactivate_handler, ply_boot_server_quit_handler_t quit_handler, + ply_boot_server_has_active_vt_handler_t has_active_vt_handler, void *user_data); void ply_boot_server_free (ply_boot_server_t *server);