summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2009-11-27 23:44:21 -0500
committerRay Strode <rstrode@redhat.com>2009-11-28 00:33:06 -0500
commit5ab755153356b3f685afe87c5926969389665bb2 (patch)
treeec63f3c34c45a4345ec48641059528437ed6bb26
parent3ab7b2c54ec811f8b802f6133bf0089b97366db4 (diff)
parentd52b4efba18c4295618302fea9674e54c36e1b7e (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.c12
-rw-r--r--src/client/ply-boot-client.h4
-rw-r--r--src/client/plymouth.c16
-rw-r--r--src/libplybootsplash/ply-renderer-plugin.h2
-rw-r--r--src/libplybootsplash/ply-renderer.c16
-rw-r--r--src/libplybootsplash/ply-renderer.h2
-rw-r--r--src/main.c57
-rw-r--r--src/plugins/renderers/drm/plugin.c47
-rw-r--r--src/plugins/renderers/frame-buffer/plugin.c30
-rw-r--r--src/plugins/renderers/x11/plugin.c19
-rw-r--r--src/ply-boot-protocol.h1
-rw-r--r--src/ply-boot-server.c39
-rw-r--r--src/ply-boot-server.h4
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);
diff --git a/src/main.c b/src/main.c
index 3b27edff..95dc9fe3 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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,