diff options
author | Ray Strode <rstrode@redhat.com> | 2009-11-27 23:44:21 -0500 |
---|---|---|
committer | Ray Strode <rstrode@redhat.com> | 2009-11-28 00:33:06 -0500 |
commit | 5ab755153356b3f685afe87c5926969389665bb2 (patch) | |
tree | ec63f3c34c45a4345ec48641059528437ed6bb26 | |
parent | 3ab7b2c54ec811f8b802f6133bf0089b97366db4 (diff) | |
parent | d52b4efba18c4295618302fea9674e54c36e1b7e (diff) |
[branch-merge] Improve plymouth -> X hand off
This merges the "no-fbcon" branch to master.
Previously, the way to get a transition between
plymouth and X was for plymouth to quit,
leaving the tty in KD_GRAPHICS mode, and hope
X starts and picks up the peices. In this
limbo state where plymouth isn't running but X
isn't started yet the user is unable to
switch VTs or really do anything at all.
If X doesn't start then the user is hosed; they
have to reboot.
Now, instead of quitting plymouth before starting
X we "deactivate" it. This gets plymouth into a
state where X can take over the display, but
plymouth stays running. Once X has fully started
up or failed to start the display manager can
tell plymouth to quit (with --retain-splash if
X started successfully and without if X started
unsucessfully)
-rw-r--r-- | src/client/ply-boot-client.c | 12 | ||||
-rw-r--r-- | src/client/ply-boot-client.h | 4 | ||||
-rw-r--r-- | src/client/plymouth.c | 16 | ||||
-rw-r--r-- | src/libplybootsplash/ply-renderer-plugin.h | 2 | ||||
-rw-r--r-- | src/libplybootsplash/ply-renderer.c | 16 | ||||
-rw-r--r-- | src/libplybootsplash/ply-renderer.h | 2 | ||||
-rw-r--r-- | src/main.c | 57 | ||||
-rw-r--r-- | src/plugins/renderers/drm/plugin.c | 47 | ||||
-rw-r--r-- | src/plugins/renderers/frame-buffer/plugin.c | 30 | ||||
-rw-r--r-- | src/plugins/renderers/x11/plugin.c | 19 | ||||
-rw-r--r-- | src/ply-boot-protocol.h | 1 | ||||
-rw-r--r-- | src/ply-boot-server.c | 39 | ||||
-rw-r--r-- | src/ply-boot-server.h | 4 |
13 files changed, 229 insertions, 20 deletions
diff --git a/src/client/ply-boot-client.c b/src/client/ply-boot-client.c index 5f7bb54f..917a6199 100644 --- a/src/client/ply-boot-client.c +++ b/src/client/ply-boot-client.c @@ -655,2 +655,14 @@ ply_boot_client_tell_daemon_to_hide_splash (ply_boot_client_t * void +ply_boot_client_tell_daemon_to_deactivate (ply_boot_client_t *client, + ply_boot_client_response_handler_t handler, + ply_boot_client_response_handler_t failed_handler, + void *user_data) +{ + assert (client != NULL); + + ply_boot_client_queue_request (client, PLY_BOOT_PROTOCOL_REQUEST_TYPE_DEACTIVATE, + NULL, handler, failed_handler, user_data); +} + +void ply_boot_client_tell_daemon_to_quit (ply_boot_client_t *client, diff --git a/src/client/ply-boot-client.h b/src/client/ply-boot-client.h index 43684ac4..0e9122c4 100644 --- a/src/client/ply-boot-client.h +++ b/src/client/ply-boot-client.h @@ -106,2 +106,6 @@ void ply_boot_client_tell_daemon_to_hide_splash (ply_boot_client_t void *user_data); +void ply_boot_client_tell_daemon_to_deactivate (ply_boot_client_t *client, + ply_boot_client_response_handler_t handler, + ply_boot_client_response_handler_t failed_handler, + void *user_data); void ply_boot_client_tell_daemon_to_quit (ply_boot_client_t *client, diff --git a/src/client/plymouth.c b/src/client/plymouth.c index 80b0ec65..8669fd2a 100644 --- a/src/client/plymouth.c +++ b/src/client/plymouth.c @@ -596,2 +596,13 @@ on_report_error_request (state_t *state, static void +on_deactivate_request (state_t *state, + const char *command) +{ + ply_boot_client_tell_daemon_to_deactivate (state->client, + (ply_boot_client_response_handler_t) + on_success, + (ply_boot_client_response_handler_t) + on_failure, state); +} + +static void on_quit_request (state_t *state, @@ -712,2 +723,7 @@ main (int argc, ply_command_parser_add_command (state.command_parser, + "deactivate", "Tell boot daemon to deactivate", + (ply_command_handler_t) + on_deactivate_request, &state, NULL); + + ply_command_parser_add_command (state.command_parser, "quit", "Tell boot daemon to quit", diff --git a/src/libplybootsplash/ply-renderer-plugin.h b/src/libplybootsplash/ply-renderer-plugin.h index 6acb8928..e4f6b374 100644 --- a/src/libplybootsplash/ply-renderer-plugin.h +++ b/src/libplybootsplash/ply-renderer-plugin.h @@ -48,2 +48,4 @@ typedef struct void (* unmap_from_device) (ply_renderer_backend_t *backend); + void (* activate) (ply_renderer_backend_t *backend); + void (* deactivate) (ply_renderer_backend_t *backend); void (* flush_head) (ply_renderer_backend_t *backend, diff --git a/src/libplybootsplash/ply-renderer.c b/src/libplybootsplash/ply-renderer.c index 591af2c4..c34dfcfc 100644 --- a/src/libplybootsplash/ply-renderer.c +++ b/src/libplybootsplash/ply-renderer.c @@ -280,2 +280,18 @@ ply_renderer_close (ply_renderer_t *renderer) +void +ply_renderer_activate (ply_renderer_t *renderer) +{ + assert (renderer->plugin_interface != NULL); + + return renderer->plugin_interface->activate (renderer->backend); +} + +void +ply_renderer_deactivate (ply_renderer_t *renderer) +{ + assert (renderer->plugin_interface != NULL); + + return renderer->plugin_interface->deactivate (renderer->backend); +} + ply_list_t * diff --git a/src/libplybootsplash/ply-renderer.h b/src/libplybootsplash/ply-renderer.h index da03e8d8..c4bbdbe3 100644 --- a/src/libplybootsplash/ply-renderer.h +++ b/src/libplybootsplash/ply-renderer.h @@ -49,2 +49,4 @@ bool ply_renderer_open (ply_renderer_t *renderer); void ply_renderer_close (ply_renderer_t *renderer); +void ply_renderer_activate (ply_renderer_t *renderer); +void ply_renderer_deactivate (ply_renderer_t *renderer); ply_list_t *ply_renderer_get_heads (ply_renderer_t *renderer); @@ -98,2 +98,3 @@ typedef struct + ply_trigger_t *deactivate_trigger; ply_trigger_t *quit_trigger; @@ -108,2 +109,3 @@ typedef struct uint32_t should_retain_splash : 1; + uint32_t is_inactive : 1; @@ -555,5 +557,8 @@ remove_displays_and_keyboard (state_t *state) - ply_keyboard_stop_watching_for_input (state->keyboard); - ply_keyboard_free (state->keyboard); - state->keyboard = NULL; + if (state->keyboard != NULL) + { + ply_keyboard_stop_watching_for_input (state->keyboard); + ply_keyboard_free (state->keyboard); + state->keyboard = NULL; + } } @@ -692,3 +697,20 @@ on_boot_splash_idle (state_t *state) { + ply_trace ("boot splash idle"); + + if (state->deactivate_trigger != NULL) + { + ply_trace ("deactivating renderer"); + ply_renderer_deactivate (state->renderer); + + ply_trace ("quitting splash"); + quit_splash (state); + + ply_trigger_pull (state->deactivate_trigger, NULL); + state->deactivate_trigger = NULL; + state->is_inactive = true; + + return; + } + if (!state->should_retain_splash) @@ -706,2 +728,23 @@ on_boot_splash_idle (state_t *state) + +static void +on_deactivate (state_t *state, + ply_trigger_t *deactivate_trigger) +{ + ply_trace ("deactivating"); + if (state->boot_splash != NULL) + { + state->deactivate_trigger = deactivate_trigger; + ply_boot_splash_become_idle (state->boot_splash, + (ply_boot_splash_on_idle_handler_t) + on_boot_splash_idle, + state); + } + else + { + ply_trigger_pull (state->deactivate_trigger, NULL); + state->deactivate_trigger = NULL; + } +} + static void @@ -727,2 +770,6 @@ on_quit (state_t *state, } + else if (state->is_inactive && !retain_splash) + /* We've been deactivated and X failed to start + */ + dump_details_and_quit_splash (state); else @@ -749,2 +796,3 @@ start_boot_server (state_t *state) (ply_boot_server_error_handler_t) on_error, + (ply_boot_server_deactivate_handler_t) on_deactivate, (ply_boot_server_quit_handler_t) on_quit, @@ -1043,3 +1091,4 @@ add_displays_and_keyboard_to_boot_splash (state_t *state, ply_trace ("setting keyboard on boot splash"); - ply_boot_splash_set_keyboard (splash, state->keyboard); + if (state->keyboard != NULL) + ply_boot_splash_set_keyboard (splash, state->keyboard); diff --git a/src/plugins/renderers/drm/plugin.c b/src/plugins/renderers/drm/plugin.c index 3081ac8f..1115b5cc 100644 --- a/src/plugins/renderers/drm/plugin.c +++ b/src/plugins/renderers/drm/plugin.c @@ -112,2 +112,4 @@ struct _ply_renderer_backend int32_t dither_blue; + + uint32_t is_inactive : 1; }; @@ -369,3 +371,3 @@ find_driver_for_device (const char *device_name) static void -on_active_vt_changed (ply_renderer_backend_t *backend) +activate (ply_renderer_backend_t *backend) { @@ -373,8 +375,3 @@ on_active_vt_changed (ply_renderer_backend_t *backend) - if (ply_console_get_active_vt (backend->console) != - ply_terminal_get_vt_number (backend->terminal)) - { - drmDropMaster (backend->device_fd); - return; - } + backend->is_inactive = false; @@ -398,2 +395,25 @@ on_active_vt_changed (ply_renderer_backend_t *backend) +static void +deactivate (ply_renderer_backend_t *backend) +{ + ply_trace ("dropping master"); + drmDropMaster (backend->device_fd); + backend->is_inactive = true; +} + +static void +on_active_vt_changed (ply_renderer_backend_t *backend) +{ + if (ply_console_get_active_vt (backend->console) != + ply_terminal_get_vt_number (backend->terminal)) + { + ply_trace ("deactivating on vt change"); + deactivate (backend); + return; + } + + ply_trace ("activating on vt change"); + activate (backend); +} + static bool @@ -891,4 +911,8 @@ unmap_from_device (ply_renderer_backend_t *backend) - ply_renderer_head_set_scan_out_buffer_to_console (backend, head, - should_set_to_black); + if (!backend->is_inactive) + { + ply_trace ("scanning out directly to console"); + ply_renderer_head_set_scan_out_buffer_to_console (backend, head, + should_set_to_black); + } @@ -937,4 +961,3 @@ flush_head (ply_renderer_backend_t *backend, - if (ply_console_get_active_vt (backend->console) != - ply_terminal_get_vt_number (backend->terminal)) + if (backend->is_inactive) return; @@ -1081,2 +1104,4 @@ ply_renderer_backend_get_interface (void) .unmap_from_device = unmap_from_device, + .activate = activate, + .deactivate = deactivate, .flush_head = flush_head, diff --git a/src/plugins/renderers/frame-buffer/plugin.c b/src/plugins/renderers/frame-buffer/plugin.c index ce42eb3b..80b5973d 100644 --- a/src/plugins/renderers/frame-buffer/plugin.c +++ b/src/plugins/renderers/frame-buffer/plugin.c @@ -110,2 +110,4 @@ struct _ply_renderer_backend + uint32_t is_inactive : 1; + void (* flush_area) (ply_renderer_backend_t *backend, @@ -303,2 +305,17 @@ destroy_backend (ply_renderer_backend_t *backend) static void +activate (ply_renderer_backend_t *backend) +{ + backend->is_inactive = false; + + if (backend->head.map_address != MAP_FAILED) + ply_renderer_head_redraw (backend, &backend->head); +} + +static void +deactivate (ply_renderer_backend_t *backend) +{ + backend->is_inactive = true; +} + +static void on_active_vt_changed (ply_renderer_backend_t *backend) @@ -307,6 +324,8 @@ on_active_vt_changed (ply_renderer_backend_t *backend) ply_terminal_get_vt_number (backend->terminal)) - return; + { + deactivate (backend); + return; + } - if (backend->head.map_address != MAP_FAILED) - ply_renderer_head_redraw (backend, &backend->head); + activate (backend); } @@ -527,4 +546,3 @@ flush_head (ply_renderer_backend_t *backend, - if (ply_console_get_active_vt (backend->console) != - ply_terminal_get_vt_number (backend->terminal)) + if (backend->is_inactive) return; @@ -663,2 +681,4 @@ ply_renderer_backend_get_interface (void) .unmap_from_device = unmap_from_device, + .activate = activate, + .deactivate = deactivate, .flush_head = flush_head, diff --git a/src/plugins/renderers/x11/plugin.c b/src/plugins/renderers/x11/plugin.c index 9e78c069..3777b6c2 100644 --- a/src/plugins/renderers/x11/plugin.c +++ b/src/plugins/renderers/x11/plugin.c @@ -88,2 +88,4 @@ struct _ply_renderer_backend ply_fd_watch_t *display_watch; + + uint32_t is_inactive : 1; }; @@ -310,2 +312,14 @@ unmap_from_device (ply_renderer_backend_t *backend) static void +activate (ply_renderer_backend_t *backend) +{ + backend->is_inactive = false; +} + +static void +deactivate (ply_renderer_backend_t *backend) +{ + backend->is_inactive = true; +} + +static void flush_area_to_device (ply_renderer_backend_t *backend, @@ -340,2 +354,5 @@ flush_head (ply_renderer_backend_t *backend, + if (backend->is_inactive) + return; + pixel_buffer = head->pixel_buffer; @@ -518,2 +535,4 @@ ply_renderer_backend_get_interface (void) .unmap_from_device = unmap_from_device, + .activate = activate, + .deactivate = deactivate, .flush_head = flush_head, diff --git a/src/ply-boot-protocol.h b/src/ply-boot-protocol.h index 419d4810..6be72186 100644 --- a/src/ply-boot-protocol.h +++ b/src/ply-boot-protocol.h @@ -28,2 +28,3 @@ #define PLY_BOOT_PROTOCOL_REQUEST_TYPE_SYSTEM_INITIALIZED "S" +#define PLY_BOOT_PROTOCOL_REQUEST_TYPE_DEACTIVATE "D" #define PLY_BOOT_PROTOCOL_REQUEST_TYPE_QUIT "Q" diff --git a/src/ply-boot-server.c b/src/ply-boot-server.c index 9a1ed8e4..4cc579f6 100644 --- a/src/ply-boot-server.c +++ b/src/ply-boot-server.c @@ -67,2 +67,3 @@ struct _ply_boot_server ply_boot_server_progress_unpause_handler_t progress_unpause_handler; + ply_boot_server_deactivate_handler_t deactivate_handler; ply_boot_server_quit_handler_t quit_handler; @@ -87,2 +88,3 @@ 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_quit_handler_t quit_handler, @@ -110,2 +112,3 @@ ply_boot_server_new (ply_boot_server_update_handler_t update_handler, server->hide_splash_handler = hide_splash_handler; + server->deactivate_handler = deactivate_handler; server->quit_handler = quit_handler; @@ -274,2 +277,13 @@ ply_boot_connection_on_password_answer (ply_boot_connection_t *connection, static void +ply_boot_connection_on_deactivated (ply_boot_connection_t *connection) +{ + if (!ply_write (connection->fd, + PLY_BOOT_PROTOCOL_RESPONSE_TYPE_ACK, + strlen (PLY_BOOT_PROTOCOL_RESPONSE_TYPE_ACK))) + { + ply_error ("could not write bytes: %m"); + } +} + +static void ply_boot_connection_on_quit_complete (ply_boot_connection_t *connection) @@ -355,2 +369,20 @@ ply_boot_connection_on_request (ply_boot_connection_t *connection) } + else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_DEACTIVATE) == 0) + { + ply_trigger_t *deactivate_trigger; + + deactivate_trigger = ply_trigger_new (NULL); + + ply_trigger_add_handler (deactivate_trigger, + (ply_trigger_handler_t) + ply_boot_connection_on_deactivated, + connection); + + if (server->deactivate_handler != NULL) + server->deactivate_handler (server->user_data, deactivate_trigger, server); + + free (argument); + free (command); + return; + } else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_QUIT) == 0) @@ -665,2 +697,8 @@ on_hide_splash (ply_event_loop_t *loop) static void +on_deactivate (ply_event_loop_t *loop) +{ + printf ("got deactivate request\n"); +} + +static void on_quit (ply_event_loop_t *loop) @@ -756,2 +794,3 @@ main (int argc, (ply_boot_server_error_handler_t) on_error, + (ply_boot_server_deactivate_handler_t) on_deactivate, (ply_boot_server_quit_handler_t) on_quit, diff --git a/src/ply-boot-server.h b/src/ply-boot-server.h index ad145ca2..f2f815ae 100644 --- a/src/ply-boot-server.h +++ b/src/ply-boot-server.h @@ -82,2 +82,5 @@ typedef void (* ply_boot_server_error_handler_t) (void *user_data, ply_boot_server_t *server); +typedef void (* ply_boot_server_deactivate_handler_t) (void *user_data, + ply_trigger_t *deactivate_trigger, + ply_boot_server_t *server); typedef void (* ply_boot_server_quit_handler_t) (void *user_data, @@ -101,2 +104,3 @@ ply_boot_server_t *ply_boot_server_new (ply_boot_server_update_handler_t update_ ply_boot_server_error_handler_t error_handler, + ply_boot_server_deactivate_handler_t deactivate_handler, ply_boot_server_quit_handler_t quit_handler, |