Blame SOURCES/cursor-fix.patch

ff86aa
From b96ff001587de11eaf98ace71b196cc5ab4cf007 Mon Sep 17 00:00:00 2001
ff86aa
From: Ray Strode <rstrode@redhat.com>
ff86aa
Date: Mon, 14 Jul 2014 08:04:54 -0400
ff86aa
Subject: [PATCH 1/5] seat: be a little more forgiving in the case there's no
ff86aa
 open terminal
ff86aa
ff86aa
We can end up in a situation where a seat object doesn't have a terminal
ff86aa
associated with it.  In that case we shouldn't crash, but continue on
ff86aa
with no input available for that seat.
ff86aa
ff86aa
https://bugs.freedesktop.org/show_bug.cgi?id=80553
ff86aa
---
ff86aa
 src/libply-splash-core/ply-seat.c | 23 +++++++++++++++++++----
ff86aa
 1 file changed, 19 insertions(+), 4 deletions(-)
ff86aa
ff86aa
diff --git a/src/libply-splash-core/ply-seat.c b/src/libply-splash-core/ply-seat.c
ff86aa
index 2ac8bf7..cd7e5bc 100644
ff86aa
--- a/src/libply-splash-core/ply-seat.c
ff86aa
+++ b/src/libply-splash-core/ply-seat.c
ff86aa
@@ -127,68 +127,83 @@ ply_seat_open (ply_seat_t          *seat,
ff86aa
   if (renderer_type != PLY_RENDERER_TYPE_NONE)
ff86aa
     {
ff86aa
       ply_renderer_t *renderer;
ff86aa
 
ff86aa
       renderer = ply_renderer_new (renderer_type, device, seat->terminal);
ff86aa
 
ff86aa
       if (!ply_renderer_open (renderer))
ff86aa
         {
ff86aa
           ply_trace ("could not open renderer for %s", device);
ff86aa
           ply_renderer_free (renderer);
ff86aa
 
ff86aa
           seat->renderer = NULL;
ff86aa
           seat->renderer_active = false;
ff86aa
 
ff86aa
           if (renderer_type != PLY_RENDERER_TYPE_AUTO)
ff86aa
             return false;
ff86aa
         }
ff86aa
       else
ff86aa
         {
ff86aa
           seat->renderer = renderer;
ff86aa
           seat->renderer_active = true;
ff86aa
         }
ff86aa
     }
ff86aa
 
ff86aa
   if (seat->renderer != NULL)
ff86aa
     {
ff86aa
       seat->keyboard = ply_keyboard_new_for_renderer (seat->renderer);
ff86aa
       add_pixel_displays (seat);
ff86aa
 
ff86aa
     }
ff86aa
-  else
ff86aa
+  else if (seat->terminal != NULL)
ff86aa
     {
ff86aa
       seat->keyboard = ply_keyboard_new_for_terminal (seat->terminal);
ff86aa
     }
ff86aa
-  add_text_displays (seat);
ff86aa
 
ff86aa
-  ply_keyboard_watch_for_input (seat->keyboard);
ff86aa
-  seat->keyboard_active = true;
ff86aa
+  if (seat->terminal != NULL)
ff86aa
+    {
ff86aa
+      add_text_displays (seat);
ff86aa
+    }
ff86aa
+  else
ff86aa
+    {
ff86aa
+      ply_trace ("not adding text display for seat, since seat has no associated terminal");
ff86aa
+    }
ff86aa
+
ff86aa
+  if (seat->keyboard != NULL)
ff86aa
+    {
ff86aa
+      ply_keyboard_watch_for_input (seat->keyboard);
ff86aa
+      seat->keyboard_active = true;
ff86aa
+    }
ff86aa
+  else
ff86aa
+    {
ff86aa
+      ply_trace ("not watching seat for input");
ff86aa
+    }
ff86aa
 
ff86aa
   return true;
ff86aa
 }
ff86aa
 
ff86aa
 bool
ff86aa
 ply_seat_is_open (ply_seat_t *seat)
ff86aa
 {
ff86aa
   return ply_list_get_length (seat->pixel_displays) > 0 ||
ff86aa
          ply_list_get_length (seat->text_displays) > 0;
ff86aa
 }
ff86aa
 
ff86aa
 void
ff86aa
 ply_seat_deactivate_keyboard (ply_seat_t *seat)
ff86aa
 {
ff86aa
   if (!seat->keyboard_active)
ff86aa
     return;
ff86aa
 
ff86aa
   seat->keyboard_active = false;
ff86aa
 
ff86aa
   if (seat->keyboard == NULL)
ff86aa
     return;
ff86aa
 
ff86aa
   ply_trace ("deactivating keybord");
ff86aa
   ply_keyboard_stop_watching_for_input (seat->keyboard);
ff86aa
 }
ff86aa
 
ff86aa
 void
ff86aa
 ply_seat_deactivate_renderer (ply_seat_t *seat)
ff86aa
 {
ff86aa
   if (!seat->renderer_active)
ff86aa
-- 
ff86aa
2.3.7
ff86aa
ff86aa
ff86aa
From b5ed92bc2efd0b52e901a67ea8e5afa809ca3598 Mon Sep 17 00:00:00 2001
ff86aa
From: Ray Strode <rstrode@redhat.com>
ff86aa
Date: Fri, 3 Jul 2015 09:29:39 -0400
ff86aa
Subject: [PATCH 2/5] main: show cursor on crash
ff86aa
ff86aa
---
ff86aa
 src/main.c | 3 +++
ff86aa
 1 file changed, 3 insertions(+)
ff86aa
ff86aa
diff --git a/src/main.c b/src/main.c
ff86aa
index 77fa96f..db5c281 100644
ff86aa
--- a/src/main.c
ff86aa
+++ b/src/main.c
ff86aa
@@ -2051,66 +2051,69 @@ on_error_message (ply_buffer_t *debug_buffer,
ff86aa
 {
ff86aa
   ply_buffer_append_bytes (debug_buffer, bytes, number_of_bytes);
ff86aa
 }
ff86aa
 
ff86aa
 static void
ff86aa
 dump_debug_buffer_to_file (void)
ff86aa
 {
ff86aa
   int fd;
ff86aa
   const char *bytes;
ff86aa
   size_t size;
ff86aa
 
ff86aa
   fd = open (debug_buffer_path,
ff86aa
              O_WRONLY | O_CREAT | O_TRUNC, 0600);
ff86aa
 
ff86aa
   if (fd < 0)
ff86aa
     return;
ff86aa
 
ff86aa
   size = ply_buffer_get_size (debug_buffer);
ff86aa
   bytes = ply_buffer_get_bytes (debug_buffer);
ff86aa
   ply_write (fd, bytes, size);
ff86aa
   close (fd);
ff86aa
 }
ff86aa
 
ff86aa
  #include <termios.h>
ff86aa
  #include <unistd.h>
ff86aa
 static void
ff86aa
 on_crash (int signum)
ff86aa
 {
ff86aa
     struct termios term_attributes;
ff86aa
     int fd;
ff86aa
+    static const char *show_cursor_sequence = "\033[?25h";
ff86aa
 
ff86aa
     fd = open ("/dev/tty1", O_RDWR | O_NOCTTY);
ff86aa
     if (fd < 0) fd = open ("/dev/hvc0", O_RDWR | O_NOCTTY);
ff86aa
 
ff86aa
     ioctl (fd, KDSETMODE, KD_TEXT);
ff86aa
 
ff86aa
+    write (fd, show_cursor_sequence, sizeof (show_cursor_sequence) - 1);
ff86aa
+
ff86aa
     tcgetattr (fd, &term_attributes);
ff86aa
 
ff86aa
     term_attributes.c_iflag |= BRKINT | IGNPAR | ICRNL | IXON;
ff86aa
     term_attributes.c_oflag |= OPOST;
ff86aa
     term_attributes.c_lflag |= ECHO | ICANON | ISIG | IEXTEN;
ff86aa
 
ff86aa
     tcsetattr (fd, TCSAFLUSH, &term_attributes);
ff86aa
 
ff86aa
     close (fd);
ff86aa
 
ff86aa
     if (debug_buffer != NULL)
ff86aa
       {
ff86aa
         dump_debug_buffer_to_file ();
ff86aa
         sleep (30);
ff86aa
       }
ff86aa
 
ff86aa
     if (pid_file != NULL)
ff86aa
       {
ff86aa
         unlink (pid_file);
ff86aa
         free (pid_file);
ff86aa
         pid_file = NULL;
ff86aa
       }
ff86aa
 
ff86aa
     signal (signum, SIG_DFL);
ff86aa
     raise(signum);
ff86aa
 }
ff86aa
 
ff86aa
 static void
ff86aa
 write_pid_file (const char *filename)
ff86aa
 {
ff86aa
-- 
ff86aa
2.3.7
ff86aa
ff86aa
ff86aa
From 4278596f4f5a6856aff50e97b7c0ff05aed67372 Mon Sep 17 00:00:00 2001
ff86aa
From: Frederic Crozat <fcrozat@suse.com>
ff86aa
Date: Thu, 12 Jun 2014 15:01:37 +0200
ff86aa
Subject: [PATCH 3/5] device-manager: only call ply_terminal_free
ff86aa
ff86aa
ply_terminal_free will call ply_terminal_close anyway and is guarded
ff86aa
against NULL terminal (ply_terminal_close is not).
ff86aa
---
ff86aa
 src/libply-splash-core/ply-device-manager.c | 1 -
ff86aa
 1 file changed, 1 deletion(-)
ff86aa
ff86aa
diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c
ff86aa
index 8f5360c..17607f4 100644
ff86aa
--- a/src/libply-splash-core/ply-device-manager.c
ff86aa
+++ b/src/libply-splash-core/ply-device-manager.c
ff86aa
@@ -415,61 +415,60 @@ free_seats (ply_device_manager_t *manager)
ff86aa
 {
ff86aa
   ply_list_node_t *node;
ff86aa
 
ff86aa
   ply_trace ("removing seats");
ff86aa
   node = ply_list_get_first_node (manager->seats);
ff86aa
   while (node != NULL)
ff86aa
     {
ff86aa
       ply_seat_t *seat;
ff86aa
       ply_list_node_t *next_node;
ff86aa
 
ff86aa
       seat = ply_list_node_get_data (node);
ff86aa
       next_node = ply_list_get_next_node (manager->seats, node);
ff86aa
 
ff86aa
       if (manager->seat_removed_handler != NULL)
ff86aa
         manager->seat_removed_handler (manager->seat_event_handler_data, seat);
ff86aa
 
ff86aa
       ply_seat_free (seat);
ff86aa
       ply_list_remove_node (manager->seats, node);
ff86aa
 
ff86aa
       node = next_node;
ff86aa
     }
ff86aa
 }
ff86aa
 
ff86aa
 static void
ff86aa
 free_terminal (char                 *device,
ff86aa
                ply_terminal_t       *terminal,
ff86aa
                ply_device_manager_t *manager)
ff86aa
 {
ff86aa
   ply_hashtable_remove (manager->terminals, device);
ff86aa
 
ff86aa
-  ply_terminal_close (terminal);
ff86aa
   ply_terminal_free (terminal);
ff86aa
 }
ff86aa
 
ff86aa
 static void
ff86aa
 free_terminals (ply_device_manager_t *manager)
ff86aa
 {
ff86aa
   ply_hashtable_foreach (manager->terminals,
ff86aa
                          (ply_hashtable_foreach_func_t *)
ff86aa
                          free_terminal,
ff86aa
                          manager);
ff86aa
 }
ff86aa
 
ff86aa
 static ply_terminal_t *
ff86aa
 get_terminal (ply_device_manager_t *manager,
ff86aa
               const char           *device_name)
ff86aa
 {
ff86aa
   char *full_name = NULL;
ff86aa
   ply_terminal_t *terminal;
ff86aa
 
ff86aa
   if (strncmp (device_name, "/dev/", strlen ("/dev/")) == 0)
ff86aa
     full_name = strdup (device_name);
ff86aa
   else
ff86aa
     asprintf (&full_name, "/dev/%s", device_name);
ff86aa
 
ff86aa
   if (strcmp (full_name, "/dev/tty0") == 0 ||
ff86aa
       strcmp (full_name, "/dev/tty") == 0 ||
ff86aa
       strcmp (full_name, ply_terminal_get_name (manager->local_console_terminal)) == 0)
ff86aa
     {
ff86aa
       terminal = manager->local_console_terminal;
ff86aa
 
ff86aa
-- 
ff86aa
2.3.7
ff86aa
ff86aa
ff86aa
From e7048fdd1a40ed683fc706a40816cc490a693ba9 Mon Sep 17 00:00:00 2001
ff86aa
From: Ray Strode <rstrode@redhat.com>
ff86aa
Date: Wed, 7 Jan 2015 16:24:57 -0500
ff86aa
Subject: [PATCH 4/5] device-manager: try fb device if drm device failed
ff86aa
ff86aa
If the drm device failed to work, then fall back to the fb device.
ff86aa
ff86aa
Right now, we ignore fb devices that have associated drm devices.
ff86aa
ff86aa
This may fix vmwgfx.
ff86aa
---
ff86aa
 src/libply-splash-core/ply-device-manager.c | 39 ++++++++++++++++++++++++++++-
ff86aa
 1 file changed, 38 insertions(+), 1 deletion(-)
ff86aa
ff86aa
diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c
ff86aa
index 17607f4..cc153e2 100644
ff86aa
--- a/src/libply-splash-core/ply-device-manager.c
ff86aa
+++ b/src/libply-splash-core/ply-device-manager.c
ff86aa
@@ -88,95 +88,132 @@ attach_to_event_loop (ply_device_manager_t *manager,
ff86aa
 }
ff86aa
 
ff86aa
 static bool
ff86aa
 device_is_for_local_console (ply_device_manager_t *manager,
ff86aa
                              struct udev_device   *device)
ff86aa
 {
ff86aa
   const char *device_path;
ff86aa
   struct udev_device *bus_device;
ff86aa
   char *bus_device_path;
ff86aa
   const char *boot_vga;
ff86aa
   bool for_local_console;
ff86aa
 
ff86aa
   /* Look at the associated bus device to see if this card is the
ff86aa
    * card the kernel is using for its console. */
ff86aa
   device_path = udev_device_get_syspath (device);
ff86aa
   asprintf (&bus_device_path, "%s/device", device_path);
ff86aa
   bus_device = udev_device_new_from_syspath (manager->udev_context, bus_device_path);
ff86aa
 
ff86aa
   boot_vga = udev_device_get_sysattr_value (bus_device, "boot_vga");
ff86aa
   free (bus_device_path);
ff86aa
 
ff86aa
   if (boot_vga != NULL && strcmp (boot_vga, "1") == 0)
ff86aa
     for_local_console = true;
ff86aa
   else
ff86aa
     for_local_console = false;
ff86aa
 
ff86aa
   return for_local_console;
ff86aa
 }
ff86aa
 
ff86aa
 static bool
ff86aa
+drm_device_in_use (ply_device_manager_t *manager,
ff86aa
+                   const char           *device_path)
ff86aa
+{
ff86aa
+  ply_list_node_t *node;
ff86aa
+
ff86aa
+  node = ply_list_get_first_node (manager->seats);
ff86aa
+  while (node != NULL)
ff86aa
+    {
ff86aa
+      ply_seat_t *seat;
ff86aa
+      ply_renderer_t *renderer;
ff86aa
+      ply_list_node_t *next_node;
ff86aa
+      const char *renderer_device_path;
ff86aa
+
ff86aa
+      seat = ply_list_node_get_data (node);
ff86aa
+      next_node = ply_list_get_next_node (manager->seats, node);
ff86aa
+      renderer = ply_seat_get_renderer (seat);
ff86aa
+
ff86aa
+      if (renderer != NULL)
ff86aa
+        {
ff86aa
+          renderer_device_path = ply_renderer_get_device_name (renderer);
ff86aa
+
ff86aa
+          if (renderer_device_path != NULL)
ff86aa
+            {
ff86aa
+              if (strcmp (device_path, renderer_device_path) == 0)
ff86aa
+                {
ff86aa
+                  return true;
ff86aa
+                }
ff86aa
+            }
ff86aa
+        }
ff86aa
+
ff86aa
+      node = next_node;
ff86aa
+    }
ff86aa
+
ff86aa
+  return false;
ff86aa
+}
ff86aa
+
ff86aa
+static bool
ff86aa
 fb_device_has_drm_device (ply_device_manager_t *manager,
ff86aa
                           struct udev_device   *fb_device)
ff86aa
 {
ff86aa
   struct udev_enumerate *card_matches;
ff86aa
   struct udev_list_entry *card_entry;
ff86aa
   const char *id_path;
ff86aa
   bool has_drm_device = false;
ff86aa
 
ff86aa
   /* We want to see if the framebuffer is associated with a DRM-capable
ff86aa
    * graphics card, if it is, we'll use the DRM device */
ff86aa
   card_matches = udev_enumerate_new (manager->udev_context);
ff86aa
   udev_enumerate_add_match_is_initialized(card_matches);
ff86aa
   udev_enumerate_add_match_parent (card_matches, udev_device_get_parent (fb_device));
ff86aa
   udev_enumerate_add_match_subsystem (card_matches, "drm");
ff86aa
   id_path = udev_device_get_property_value (fb_device, "ID_PATH");
ff86aa
   udev_enumerate_add_match_property (card_matches, "ID_PATH", id_path);
ff86aa
 
ff86aa
   ply_trace ("trying to find associated drm node for fb device (path: %s)", id_path);
ff86aa
 
ff86aa
   udev_enumerate_scan_devices (card_matches);
ff86aa
 
ff86aa
   /* there should only ever be at most one match so we don't iterate through
ff86aa
    * the list, but just look at the first entry */
ff86aa
   card_entry = udev_enumerate_get_list_entry (card_matches);
ff86aa
 
ff86aa
   if (card_entry != NULL)
ff86aa
     {
ff86aa
       struct udev_device *card_device = NULL;
ff86aa
       const char *card_node;
ff86aa
       const char *card_path;
ff86aa
 
ff86aa
       card_path = udev_list_entry_get_name (card_entry);
ff86aa
       card_device = udev_device_new_from_syspath (manager->udev_context, card_path);
ff86aa
       card_node = udev_device_get_devnode (card_device);
ff86aa
-      if (card_node != NULL)
ff86aa
+      if (card_node != NULL && drm_device_in_use (manager, card_node))
ff86aa
         has_drm_device = true;
ff86aa
       else
ff86aa
         ply_trace ("no card node!");
ff86aa
 
ff86aa
       udev_device_unref (card_device);
ff86aa
     }
ff86aa
   else
ff86aa
     {
ff86aa
       ply_trace ("no card entry!");
ff86aa
     }
ff86aa
 
ff86aa
   udev_enumerate_unref (card_matches);
ff86aa
   return has_drm_device;
ff86aa
 }
ff86aa
 
ff86aa
 static void
ff86aa
 create_seat_for_udev_device (ply_device_manager_t *manager,
ff86aa
                              struct udev_device   *device)
ff86aa
 {
ff86aa
   bool for_local_console;
ff86aa
   const char *device_path;
ff86aa
   ply_terminal_t *terminal = NULL;
ff86aa
 
ff86aa
   for_local_console = device_is_for_local_console (manager, device);
ff86aa
 
ff86aa
   ply_trace ("device is for local console: %s", for_local_console? "yes" : "no");
ff86aa
 
ff86aa
   if (for_local_console)
ff86aa
     terminal = manager->local_console_terminal;
ff86aa
 
ff86aa
-- 
ff86aa
2.3.7
ff86aa
ff86aa
ff86aa
From b9989b912fb394c00d3d4740eb72a25f80a8bc71 Mon Sep 17 00:00:00 2001
ff86aa
From: Ray Strode <rstrode@redhat.com>
ff86aa
Date: Fri, 3 Jul 2015 10:38:47 -0400
ff86aa
Subject: [PATCH 5/5] device-manager: don't try to load graphical splash after
ff86aa
 using text splash
ff86aa
ff86aa
We only support loading one splash at a time at the moment, so this
ff86aa
commit makes sure we don't load a graphical splash after already loading
ff86aa
a text splash
ff86aa
---
ff86aa
 src/libply-splash-core/ply-device-manager.c | 10 +++++++++-
ff86aa
 1 file changed, 9 insertions(+), 1 deletion(-)
ff86aa
ff86aa
diff --git a/src/libply-splash-core/ply-device-manager.c b/src/libply-splash-core/ply-device-manager.c
ff86aa
index cc153e2..a7890d0 100644
ff86aa
--- a/src/libply-splash-core/ply-device-manager.c
ff86aa
+++ b/src/libply-splash-core/ply-device-manager.c
ff86aa
@@ -379,61 +379,69 @@ create_seats_for_subsystem (ply_device_manager_t *manager,
ff86aa
   return found_device;
ff86aa
 }
ff86aa
 
ff86aa
 static void
ff86aa
 on_udev_event (ply_device_manager_t *manager)
ff86aa
 {
ff86aa
   struct udev_device *device;
ff86aa
   const char *action;
ff86aa
 
ff86aa
   device = udev_monitor_receive_device (manager->udev_monitor);
ff86aa
   if (device == NULL)
ff86aa
     return;
ff86aa
 
ff86aa
   action = udev_device_get_action (device);
ff86aa
 
ff86aa
   ply_trace ("got %s event for device %s", action, udev_device_get_sysname (device));
ff86aa
 
ff86aa
   if (action == NULL)
ff86aa
     return;
ff86aa
 
ff86aa
   if (strcmp (action, "add") == 0)
ff86aa
     {
ff86aa
       const char *subsystem;
ff86aa
       bool coldplug_complete = manager->udev_queue_fd_watch == NULL;
ff86aa
 
ff86aa
       subsystem = udev_device_get_subsystem (device);
ff86aa
 
ff86aa
       if (strcmp (subsystem, SUBSYSTEM_DRM) == 0 ||
ff86aa
           coldplug_complete)
ff86aa
         {
ff86aa
-          create_seat_for_udev_device (manager, device);
ff86aa
+          ply_list_t *local_pixel_displays = NULL;
ff86aa
+
ff86aa
+          if (manager->local_console_seat != NULL)
ff86aa
+            local_pixel_displays = ply_seat_get_pixel_displays (manager->local_console_seat);
ff86aa
+
ff86aa
+          if (coldplug_complete && manager->local_console_seat != NULL && local_pixel_displays == NULL)
ff86aa
+            ply_trace ("ignoring since we're already using text splash for local console");
ff86aa
+          else
ff86aa
+            create_seat_for_udev_device (manager, device);
ff86aa
         }
ff86aa
       else
ff86aa
         {
ff86aa
           ply_trace ("ignoring since we only handle subsystem %s devices after coldplug completes", subsystem);
ff86aa
         }
ff86aa
     }
ff86aa
   else if (strcmp (action, "remove") == 0)
ff86aa
     {
ff86aa
       free_seat_for_udev_device (manager, device);
ff86aa
     }
ff86aa
 
ff86aa
   udev_device_unref (device);
ff86aa
 }
ff86aa
 
ff86aa
 static void
ff86aa
 watch_for_udev_events (ply_device_manager_t *manager)
ff86aa
 {
ff86aa
   int fd;
ff86aa
   assert (manager != NULL);
ff86aa
   assert (manager->udev_monitor == NULL);
ff86aa
 
ff86aa
   ply_trace ("watching for udev graphics device add and remove events");
ff86aa
 
ff86aa
   manager->udev_monitor = udev_monitor_new_from_netlink (manager->udev_context, "udev");
ff86aa
 
ff86aa
   udev_monitor_filter_add_match_subsystem_devtype (manager->udev_monitor, SUBSYSTEM_DRM, NULL);
ff86aa
   udev_monitor_filter_add_match_subsystem_devtype (manager->udev_monitor, SUBSYSTEM_FRAME_BUFFER, NULL);
ff86aa
   udev_monitor_filter_add_match_tag (manager->udev_monitor, "seat");
ff86aa
   udev_monitor_enable_receiving (manager->udev_monitor);
ff86aa
 
ff86aa
-- 
ff86aa
2.3.7
ff86aa