File plymouth-use-device-timeout-instead-of-udev-coldplug.patch of Package plymouth

diff -Nura plymouth-0.9.0/src/libply-splash-core/ply-device-manager.c plymouth-0.9.0_new/src/libply-splash-core/ply-device-manager.c
--- plymouth-0.9.0/src/libply-splash-core/ply-device-manager.c	2017-06-09 18:32:05.041360243 +0800
+++ plymouth-0.9.0_new/src/libply-splash-core/ply-device-manager.c	2017-06-09 18:15:28.992207320 +0800
@@ -41,6 +41,8 @@
 #define SUBSYSTEM_DRM "drm"
 #define SUBSYSTEM_FRAME_BUFFER "graphics"
 
+static void create_seats_from_udev (ply_device_manager_t *manager);
+
 static void create_seat_for_terminal_and_renderer_type (ply_device_manager_t *manager,
                                                         const char           *device_path,
                                                         ply_terminal_t       *terminal,
@@ -54,16 +56,15 @@
   ply_seat_t                 *local_console_seat;
   ply_list_t                 *seats;
   struct udev                *udev_context;
-  struct udev_queue          *udev_queue;
-  int                         udev_queue_fd;
-  ply_fd_watch_t             *udev_queue_fd_watch;
   struct udev_monitor        *udev_monitor;
   bool                       has_serial_consoles;
 
-
   ply_seat_added_handler_t    seat_added_handler;
   ply_seat_removed_handler_t  seat_removed_handler;
   void                       *seat_event_handler_data;
+
+  uint32_t                    local_console_managed : 1;
+  uint32_t                    local_console_is_text : 1;
 };
 
 static void
@@ -367,26 +368,28 @@
     return;
 
   if (strcmp (action, "add") == 0)
-    {
+  {
       const char *subsystem;
-      bool coldplug_complete = manager->udev_queue_fd_watch == NULL;
 
       subsystem = udev_device_get_subsystem (device);
 
-      if (strcmp (subsystem, SUBSYSTEM_DRM) == 0 ||
-          coldplug_complete)
-        {
-          create_seat_for_udev_device (manager, device);
-        }
-      else
-        {
-          ply_trace ("ignoring since we only handle subsystem %s devices after coldplug completes", subsystem);
-        }
-    }
+      if (strcmp (subsystem, SUBSYSTEM_DRM) == 0) 
+      {
+						if (manager->local_console_managed && manager->local_console_is_text)
+									ply_trace ("ignoring since we're already using text splash for local console");
+						else
+									create_seat_for_udev_device (manager, device);
+      }
+      else 
+      {
+						ply_trace ("ignoring since we only handle subsystem %s devices after timeout", subsystem);
+      }
+
+  }
   else if (strcmp (action, "remove") == 0)
-    {
+  {
       free_seat_for_udev_device (manager, device);
-    }
+  }
 
   udev_device_unref (device);
 }
@@ -530,6 +533,10 @@
   if (manager == NULL)
     return;
 
+  ply_event_loop_stop_watching_for_timeout (manager->loop,
+                                           (ply_event_loop_timeout_handler_t)
+                                           create_seats_from_udev, manager);
+
   ply_event_loop_stop_watching_for_exit (manager->loop,
                                          (ply_event_loop_exit_handler_t)
                                          detach_from_event_loop,
@@ -707,7 +714,7 @@
 {
   bool found_drm_device, found_fb_device;
 
-  ply_trace ("Looking for devices from udev");
+  ply_trace ("Timeout elapsed, looking for devices from udev");
 
   found_drm_device = create_seats_for_subsystem (manager, SUBSYSTEM_DRM);
   found_fb_device = create_seats_for_subsystem (manager, SUBSYSTEM_FRAME_BUFFER);
@@ -731,67 +738,9 @@
                                               PLY_RENDERER_TYPE_AUTO);
 }
 
-static void
-on_udev_queue_changed (ply_device_manager_t *manager)
-{
-
-  if (!udev_queue_get_queue_is_empty (manager->udev_queue))
-    return;
-
-  ply_trace ("udev coldplug complete");
-  ply_event_loop_stop_watching_fd (manager->loop, manager->udev_queue_fd_watch);
-  manager->udev_queue_fd_watch = NULL;
-  udev_queue_unref (manager->udev_queue);
-
-  close (manager->udev_queue_fd);
-  manager->udev_queue_fd = -1;
-
-  manager->udev_queue = NULL;
-
-  create_seats_from_udev (manager);
-}
-
-static void
-watch_for_coldplug_completion (ply_device_manager_t *manager)
-{
-  int fd;
-  int result;
-
-  manager->udev_queue = udev_queue_new (manager->udev_context);
-
-  if (udev_queue_get_queue_is_empty (manager->udev_queue))
-    {
-      ply_trace ("udev coldplug completed already ");
-      create_seats_from_udev (manager);
-      return;
-    }
-
-  fd = inotify_init1 (IN_CLOEXEC);
-  result = inotify_add_watch (fd, "/run/udev", IN_MOVED_TO);
-
-  if (result < 0)
-    {
-      ply_trace ("could not watch for udev to show up: %m");
-      close (fd);
-
-      create_fallback_seat (manager);
-      return;
-    }
-
-  manager->udev_queue_fd = fd;
-
-  manager->udev_queue_fd_watch = ply_event_loop_watch_fd (manager->loop,
-                                                          fd,
-                                                          PLY_EVENT_LOOP_FD_STATUS_HAS_DATA,
-                                                          (ply_event_handler_t)
-                                                          on_udev_queue_changed,
-                                                          NULL,
-                                                          manager);
-
-}
-
 void
 ply_device_manager_watch_seats (ply_device_manager_t       *manager,
+                                double                      device_timeout,
                                 ply_seat_added_handler_t    seat_added_handler,
                                 ply_seat_removed_handler_t  seat_removed_handler,
                                 void                       *data)
@@ -817,7 +766,11 @@
     }
 
   watch_for_udev_events (manager);
-  watch_for_coldplug_completion (manager);
+  create_seats_for_subsystem (manager, SUBSYSTEM_DRM);
+  ply_event_loop_watch_for_timeout (manager->loop,
+                                    device_timeout,
+                                    (ply_event_loop_timeout_handler_t)
+                                    create_seats_from_udev, manager);
 }
 
 bool
diff -Nura plymouth-0.9.0/src/libply-splash-core/ply-device-manager.h plymouth-0.9.0_new/src/libply-splash-core/ply-device-manager.h
--- plymouth-0.9.0/src/libply-splash-core/ply-device-manager.h	2017-06-09 18:32:05.041360243 +0800
+++ plymouth-0.9.0_new/src/libply-splash-core/ply-device-manager.h	2017-06-09 18:15:21.845191870 +0800
@@ -38,6 +38,7 @@
 ply_device_manager_t *ply_device_manager_new (const char                 *default_tty,
                                               ply_device_manager_flags_t  flags);
 void ply_device_manager_watch_seats (ply_device_manager_t *manager,
+                                     double                device_timeout,
                                      ply_seat_added_handler_t seat_added_handler,
                                      ply_seat_removed_handler_t seat_removed_handler,
                                      void *data);
diff -Nura plymouth-0.9.0/src/main.c plymouth-0.9.0_new/src/main.c
--- plymouth-0.9.0/src/main.c	2017-06-09 18:32:05.048360258 +0800
+++ plymouth-0.9.0_new/src/main.c	2017-06-09 18:14:52.048127465 +0800
@@ -106,6 +106,7 @@
 
   double start_time;
   double splash_delay;
+  double device_timeout;
 
   char kernel_command_line[PLY_MAX_COMMAND_LINE_SIZE];
   uint32_t kernel_command_line_is_set : 1;
@@ -266,7 +267,6 @@
                char       **theme_path)
 {
   ply_key_file_t *key_file = NULL;
-  const char *delay_string;
   bool settings_loaded = false;
   const char *splash_string;
 
@@ -287,6 +287,7 @@
 
   if (isnan (state->splash_delay))
     {
+      const char *delay_string;
       delay_string = ply_key_file_get_value (key_file, "Daemon", "ShowDelay");
 
       if (delay_string != NULL)
@@ -296,6 +297,17 @@
         }
     }
 
+   if (isnan (state->device_timeout)) {
+	   const char *timeout_string;
+
+	timeout_string = ply_key_file_get_value (key_file, "Daemon", "DeviceTimeout");
+
+		if (timeout_string != NULL) {
+			state->device_timeout = atof (timeout_string);
+        	ply_trace ("Device timeout is set to %lf", state->device_timeout);
+		}
+	}
+
   settings_loaded = true;
 out:
   ply_key_file_free (key_file);
@@ -1053,6 +1065,7 @@
   manager = state->device_manager;
 
   ply_device_manager_watch_seats (state->device_manager,
+                                  state->device_timeout,
                                   (ply_seat_added_handler_t)
                                   on_seat_added,
                                   (ply_seat_removed_handler_t)
@@ -2317,6 +2330,7 @@
 
   state.progress = ply_progress_new ();
   state.splash_delay = NAN;
+  state.device_timeout = NAN;
 
   ply_progress_load_cache (state.progress,
                            get_cache_file_for_mode (state.mode));
diff -Nura plymouth-0.9.0/src/plymouthd.defaults plymouth-0.9.0_new/src/plymouthd.defaults
--- plymouth-0.9.0/src/plymouthd.defaults	2017-06-09 18:34:30.761675213 +0800
+++ plymouth-0.9.0_new/src/plymouthd.defaults	2017-06-09 18:30:04.874100505 +0800
@@ -3,3 +3,4 @@
 [Daemon]
 Theme=spinner
 ShowDelay=5
+DeviceTimeout=5
openSUSE Build Service is sponsored by