]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
boot-server: defer show-splash reply until splash shown
authorRay Strode <rstrode@redhat.com>
Fri, 10 Jan 2014 15:13:35 +0000 (10:13 -0500)
committerRay Strode <rstrode@redhat.com>
Fri, 10 Jan 2014 19:16:36 +0000 (14:16 -0500)
Right now if a client calls show-splash it will return
immediately, before the splash screen may be necessarily
shown.

From this point on, init thinks the splash screen is up
and does things like asking for a password, which will
subsequently fail.

This commit makes 'plymouth show-splash' block until the
splash screen is actually shown.

src/main.c
src/ply-boot-server.c
src/ply-boot-server.h

index e7c701d45ae6bc2fafd2f3e8b92cf865f2130c02..fd81f7243cd26fae2f067af0709015d3b8d0250a 100644 (file)
@@ -99,6 +99,7 @@ typedef struct
   ply_terminal_t *local_console_terminal;
   ply_device_manager_t *device_manager;
 
+  ply_trigger_t *show_trigger;
   ply_trigger_t *deactivate_trigger;
   ply_trigger_t *quit_trigger;
 
@@ -816,7 +817,8 @@ plymouth_should_show_default_splash (state_t *state)
 }
 
 static void
-on_show_splash (state_t *state)
+on_show_splash (state_t       *state,
+                ply_trigger_t *show_trigger)
 {
   bool has_open_seats;
 
@@ -839,6 +841,7 @@ on_show_splash (state_t *state)
       return;
     }
 
+  state->show_trigger = show_trigger;
   state->is_shown = true;
   has_open_seats = ply_device_manager_has_open_seats (state->device_manager);
 
@@ -901,6 +904,13 @@ show_splash (state_t *state)
       show_detailed_splash (state);
       state->showing_details = true;
     }
+
+  if (state->show_trigger != NULL)
+    {
+      ply_trace ("telling boot server about completed show operation");
+      ply_trigger_pull (state->show_trigger, NULL);
+      state->show_trigger = NULL;
+    }
 }
 
 static void
index 3e67bfbf2fa7de00e507a2914b4ada3bc4a534b1..78c9c52e5d6f020963901e45877424ffdf946b28 100644 (file)
@@ -309,6 +309,18 @@ ply_boot_connection_on_password_answer (ply_boot_connection_t *connection,
 
 }
 
+static void
+ply_boot_connection_on_splash_shown (ply_boot_connection_t *connection)
+{
+  ply_trace ("shown");
+  if (!ply_write (connection->fd,
+                  PLY_BOOT_PROTOCOL_RESPONSE_TYPE_ACK,
+                  strlen (PLY_BOOT_PROTOCOL_RESPONSE_TYPE_ACK)))
+    {
+      ply_trace ("could not finish writing deactivate reply: %m");
+    }
+}
+
 static void
 ply_boot_connection_on_deactivated (ply_boot_connection_t *connection)
 {
@@ -477,9 +489,23 @@ ply_boot_connection_on_request (ply_boot_connection_t *connection)
     }
   else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_SHOW_SPLASH) == 0)
     {
+      ply_trigger_t *show_trigger;
+
       ply_trace ("got show splash request");
+
+      show_trigger = ply_trigger_new (NULL);
+
+      ply_trigger_add_handler (show_trigger,
+                               (ply_trigger_handler_t)
+                               ply_boot_connection_on_splash_shown,
+                               connection);
+
       if (server->show_splash_handler != NULL)
-        server->show_splash_handler (server->user_data, server);
+        server->show_splash_handler (server->user_data, show_trigger, server);
+
+      free (argument);
+      free (command);
+      return;
     }
   else if (strcmp (command, PLY_BOOT_PROTOCOL_REQUEST_TYPE_HIDE_SPLASH) == 0)
     {
index b885a81fd8a91c1fa5db7fd9a14172ac1a83a429..4436be85058d3259189a5ba1aade893784967d54 100644 (file)
@@ -49,6 +49,7 @@ typedef void (* ply_boot_server_newroot_handler_t) (void              *user_data
                                                     ply_boot_server_t *server);
 
 typedef void (* ply_boot_server_show_splash_handler_t) (void              *user_data,
+                                                        ply_trigger_t     *show_trigger,
                                                         ply_boot_server_t *server);
 
 typedef void (* ply_boot_server_hide_splash_handler_t) (void              *user_data,