File plymouth-lite-vtswitch.patch of Package plymouth-lite

--- a/ply-image.c
+++ b/ply-image.c
@@ -39,6 +39,7 @@
 #include <sys/types.h>
 #include <unistd.h>
 #include <math.h>
+#include <linux/vt.h>
 
 #include <png.h>
 
@@ -390,20 +391,6 @@
 #define FRAMES_PER_SECOND 50
 #endif
 
-static int console_fd;
-
-static bool
-hide_cursor (void)
-{
-  static const char invisible_cursor[] = "\033[?25l\033[?1c";
-
-  if (write (STDOUT_FILENO, invisible_cursor, 
-             sizeof (invisible_cursor) - 1) != sizeof (invisible_cursor) - 1)
-    return false;
-
-  return true;
-}
-
 static void
 animate_at_time (ply_frame_buffer_t *buffer,
                  ply_image_t        *image)
@@ -429,6 +416,58 @@
 
 }
 
+static void
+switch_to_vt (int vt)
+{
+  static const char *ttys[] = {
+    "/dev/tty",
+    "/dev/tty0",
+    "/proc/self/fd/0",
+    "/dev/console",
+    NULL
+  };
+  int i;
+
+  for (i = 0; ttys[i] != NULL; i++)
+    {
+      int fd = open (ttys[i], O_RDWR);
+      if (fd < 0)
+	continue;
+      
+      if (!isatty (fd))
+	goto next_iter;
+      
+      if (ioctl (fd, VT_ACTIVATE, vt))
+	{
+	  perror("vt activation failed");
+	  goto next_iter;
+	}
+      if (ioctl (fd, VT_WAITACTIVE, vt))
+	{
+	  perror ("wait for vt activation failed");
+	  goto next_iter;
+	}
+      close (fd);
+      break;
+    next_iter:
+      close (fd);
+    }
+}
+
+static void
+hide_cursor (void)
+{
+  int fd = open ("/sys/devices/virtual/graphics/fbcon/cursor_blink", O_WRONLY);
+  char zero[] = "0";
+  if (fd < 0)
+    perror ("failed to open fbcon");
+  else
+    {
+      write (fd, zero, sizeof (zero));
+      close (fd);
+    }
+}
+
 int
 main (int    argc,
       char **argv)
@@ -439,13 +478,16 @@
 
   exit_code = 0;
 
-//  hide_cursor ();
-
   if (argc == 1)
     image = ply_image_new ("/usr/share/plymouth/splash.png");
   else
     image = ply_image_new (argv[1]);
 
+  if (argc > 2)
+    switch_to_vt (atoi (argv[2]));
+
+  hide_cursor ();
+
   if (!ply_image_load (image))
     {
       exit_code = errno;
@@ -453,8 +495,6 @@
       return exit_code;
     }
 
-  console_fd = open ("/dev/tty0", O_RDWR);
-
   buffer = ply_frame_buffer_new (NULL);
 
   if (!ply_frame_buffer_open (buffer))
openSUSE Build Service is sponsored by