[gdm/f22] actually quit plymouth at startup

Ray Strode rstrode at fedoraproject.org
Tue Mar 24 14:47:59 UTC 2015


commit ad6daf364e3156d2ed7950b08a9a977d3df68a0b
Author: Ray Strode <rstrode at redhat.com>
Date:   Tue Mar 24 10:46:53 2015 -0400

    actually quit plymouth at startup

 gdm.spec            |   8 +-
 quit-plymouth.patch | 391 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 398 insertions(+), 1 deletion(-)
---
diff --git a/gdm.spec b/gdm.spec
index a097111..63a7ca2 100644
--- a/gdm.spec
+++ b/gdm.spec
@@ -11,7 +11,7 @@
 Summary: The GNOME Display Manager
 Name: gdm
 Version: 3.16.0
-Release: 1%{?dist}
+Release: 2%{?dist}
 Epoch: 1
 License: GPLv2+
 Group: User Interface/X
@@ -79,6 +79,8 @@ Requires: system-logos
 Requires: xorg-x11-server-utils
 Requires: xorg-x11-xinit
 
+Patch0: quit-plymouth.patch
+
 Obsoletes: gdm-libs < 1:3.12.0-3
 Provides: gdm-libs%{?_isa} = %{epoch}:%{version}-%{release}
 
@@ -104,6 +106,7 @@ files needed to build custom greeters.
 
 %prep
 %setup -q
+%patch0 -p1 -b .quit-plymouth
 
 autoreconf -i -f
 intltoolize -f
@@ -294,6 +297,9 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor >&/dev/null || :
 %{_libdir}/pkgconfig/gdm.pc
 
 %changelog
+* Tue Mar 24 2015 Ray Strode <rstrode at redhat.com> 3.16.0-2
+- actually quit plymouth at startup
+
 * Mon Mar 23 2015 Kalev Lember <kalevlember at gmail.com> - 1:3.16.0-1
 - Update to 3.16.0
 
diff --git a/quit-plymouth.patch b/quit-plymouth.patch
new file mode 100644
index 0000000..b52a9bd
--- /dev/null
+++ b/quit-plymouth.patch
@@ -0,0 +1,391 @@
+From c46f1f6798088c4d0ebc809fe200e2fee50d69f6 Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode at redhat.com>
+Date: Mon, 23 Mar 2015 08:46:40 -0400
+Subject: [PATCH 1/2] Revert "manager: add hack to quit plymouth after a delay"
+
+This reverts commit 862ba1bd67ec85b5784d3e8809a405f1845b1c43.
+
+https://bugzilla.gnome.org/show_bug.cgi?id=746498
+---
+ daemon/gdm-manager.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
+index e9ed29d..8c36e06 100644
+--- a/daemon/gdm-manager.c
++++ b/daemon/gdm-manager.c
+@@ -162,61 +162,61 @@ plymouth_is_running (void)
+                 g_debug ("Could not ping plymouth: %s", error->message);
+                 g_error_free (error);
+                 return FALSE;
+         }
+ 
+         return WIFEXITED (status) && WEXITSTATUS (status) == 0;
+ }
+ 
+ static void
+ plymouth_prepare_for_transition (void)
+ {
+         gboolean res;
+         GError  *error;
+ 
+         error = NULL;
+         res = g_spawn_command_line_sync ("/bin/plymouth deactivate",
+                                          NULL, NULL, NULL, &error);
+         if (! res) {
+                 g_warning ("Could not deactivate plymouth: %s", error->message);
+                 g_error_free (error);
+         }
+ }
+ 
+ static void
+ plymouth_quit_with_transition (void)
+ {
+         gboolean res;
+         GError  *error;
+ 
+         error = NULL;
+-        res = g_spawn_command_line_async ("sleep 2; /bin/plymouth quit --retain-splash", &error);
++        res = g_spawn_command_line_async ("/bin/plymouth quit --retain-splash", &error);
+         if (! res) {
+                 g_warning ("Could not quit plymouth: %s", error->message);
+                 g_error_free (error);
+         }
+ }
+ 
+ static void
+ plymouth_quit_without_transition (void)
+ {
+         gboolean res;
+         GError  *error;
+ 
+         error = NULL;
+         res = g_spawn_command_line_async ("/bin/plymouth quit", &error);
+         if (! res) {
+                 g_warning ("Could not quit plymouth: %s", error->message);
+                 g_error_free (error);
+         }
+ }
+ #endif
+ 
+ #ifdef WITH_SYSTEMD
+ static char *
+ get_session_id_for_pid_systemd (pid_t    pid,
+                                 GError **error)
+ {
+         char *session, *gsession;
+         int ret;
+ 
+         session = NULL;
+-- 
+2.3.3
+
+
+From 2cbd7ad1f66d0a757c1d2217705436aa1beca76a Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode at redhat.com>
+Date: Thu, 19 Mar 2015 22:38:15 -0400
+Subject: [PATCH 2/2] manager: add a different hack to quit plymouth later
+
+Right now wayland sessions register with GDM before they're
+actually ready, so we quit plymouth too soon.
+
+Until we can fix that, this commit quits plymouth when the login screen
+connects to the daemon, or in the event of automatic login (where there
+is no login screen), after 20 seconds.
+
+This is like commit 862ba1bd67ec85b5784d3e8809a405f1845b1c43
+but hopefully less broken..
+
+https://bugzilla.gnome.org/show_bug.cgi?id=746498
+---
+ daemon/gdm-manager.c | 26 +++++++++++++++++++-------
+ 1 file changed, 19 insertions(+), 7 deletions(-)
+
+diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
+index 8c36e06..7b2cf65 100644
+--- a/daemon/gdm-manager.c
++++ b/daemon/gdm-manager.c
+@@ -155,72 +155,74 @@ plymouth_is_running (void)
+         gboolean res;
+         GError  *error;
+ 
+         error = NULL;
+         res = g_spawn_command_line_sync ("/bin/plymouth --ping",
+                                          NULL, NULL, &status, &error);
+         if (! res) {
+                 g_debug ("Could not ping plymouth: %s", error->message);
+                 g_error_free (error);
+                 return FALSE;
+         }
+ 
+         return WIFEXITED (status) && WEXITSTATUS (status) == 0;
+ }
+ 
+ static void
+ plymouth_prepare_for_transition (void)
+ {
+         gboolean res;
+         GError  *error;
+ 
+         error = NULL;
+         res = g_spawn_command_line_sync ("/bin/plymouth deactivate",
+                                          NULL, NULL, NULL, &error);
+         if (! res) {
+                 g_warning ("Could not deactivate plymouth: %s", error->message);
+                 g_error_free (error);
+         }
+ }
+ 
+-static void
++static gboolean
+ plymouth_quit_with_transition (void)
+ {
+         gboolean res;
+         GError  *error;
+ 
+         error = NULL;
+         res = g_spawn_command_line_async ("/bin/plymouth quit --retain-splash", &error);
+         if (! res) {
+                 g_warning ("Could not quit plymouth: %s", error->message);
+                 g_error_free (error);
+         }
++
++        return G_SOURCE_REMOVE;
+ }
+ 
+ static void
+ plymouth_quit_without_transition (void)
+ {
+         gboolean res;
+         GError  *error;
+ 
+         error = NULL;
+         res = g_spawn_command_line_async ("/bin/plymouth quit", &error);
+         if (! res) {
+                 g_warning ("Could not quit plymouth: %s", error->message);
+                 g_error_free (error);
+         }
+ }
+ #endif
+ 
+ #ifdef WITH_SYSTEMD
+ static char *
+ get_session_id_for_pid_systemd (pid_t    pid,
+                                 GError **error)
+ {
+         char *session, *gsession;
+         int ret;
+ 
+         session = NULL;
+         ret = sd_pid_get_session (pid, &session);
+         if (ret < 0) {
+                 g_set_error (error,
+                              GDM_DISPLAY_ERROR,
+@@ -1707,66 +1709,60 @@ on_display_status_changed (GdmDisplay *display,
+                       NULL);
+         quit_plymouth = display_is_local && manager->priv->plymouth_is_running;
+ #endif
+ 
+         status = gdm_display_get_status (display);
+ 
+         switch (status) {
+                 case GDM_DISPLAY_PREPARED:
+                 case GDM_DISPLAY_MANAGED:
+                         if ((display_number == -1 && status == GDM_DISPLAY_PREPARED) ||
+                             (display_number != -1 && status == GDM_DISPLAY_MANAGED)) {
+                                 char *session_class;
+ 
+                                 g_object_get (display,
+                                               "session-class", &session_class,
+                                               NULL);
+                                 if (g_strcmp0 (session_class, "greeter") == 0) {
+                                         gboolean will_autologin;
+ 
+                                         will_autologin = display_should_autologin (manager, display);
+ 
+                                         if (will_autologin) {
+                                                 set_up_automatic_login_session (manager, display);
+                                         } else {
+                                                 set_up_greeter_session (manager, display);
+                                         }
+                                 }
+                         }
+ 
+                         if (status == GDM_DISPLAY_MANAGED) {
+-#ifdef WITH_PLYMOUTH
+-                                if (quit_plymouth) {
+-                                        plymouth_quit_with_transition ();
+-                                        manager->priv->plymouth_is_running = FALSE;
+-                                }
+-#endif
+                                 greeter_display_started (manager, display);
+                         }
+                         break;
+                 case GDM_DISPLAY_FAILED:
+                 case GDM_DISPLAY_UNMANAGED:
+                 case GDM_DISPLAY_FINISHED:
+ #ifdef WITH_PLYMOUTH
+                         if (quit_plymouth) {
+                                 plymouth_quit_without_transition ();
+                                 manager->priv->plymouth_is_running = FALSE;
+                         }
+ #endif
+ 
+                         maybe_start_pending_initial_login (manager, display);
+                         break;
+                 default:
+                         break;
+         }
+ 
+ }
+ 
+ static void
+ on_display_removed (GdmDisplayStore *display_store,
+                     const char      *id,
+                     GdmManager      *manager)
+ {
+         GdmDisplay *display;
+ 
+         display = gdm_display_store_lookup (display_store, id);
+         if (display != NULL) {
+@@ -1972,60 +1968,69 @@ on_session_authentication_failed (GdmSession *session,
+ {
+         add_session_record (manager, session, conversation_pid, SESSION_RECORD_FAILED);
+ }
+ 
+ static void
+ on_user_session_opened (GdmSession       *session,
+                         const char       *service_name,
+                         const char       *session_id,
+                         GdmManager       *manager)
+ {
+         manager->priv->user_sessions = g_list_append (manager->priv->user_sessions,
+                                                       g_object_ref (session));
+         if (g_strcmp0 (service_name, "gdm-autologin") == 0 &&
+             !gdm_session_client_is_connected (session)) {
+                 /* If we're auto logging in then don't wait for the go-ahead from a greeter,
+                  * (since there is no greeter) */
+                 g_object_set_data (G_OBJECT (session), "start-when-ready", GINT_TO_POINTER (TRUE));
+         }
+ 
+         start_user_session_if_ready (manager, session, service_name);
+ }
+ 
+ static void
+ on_user_session_started (GdmSession      *session,
+                          const char      *service_name,
+                          GPid             pid,
+                          GdmManager      *manager)
+ {
+         g_debug ("GdmManager: session started %d", pid);
+         add_session_record (manager, session, pid, SESSION_RECORD_LOGIN);
++
++#ifdef WITH_PLYMOUTH
++        if (g_strcmp0 (service_name, "gdm-autologin") == 0) {
++                if (manager->priv->plymouth_is_running) {
++                        g_timeout_add_seconds (20, (GSourceFunc) plymouth_quit_with_transition, NULL);
++                        manager->priv->plymouth_is_running = FALSE;
++                }
++        }
++#endif
+ }
+ 
+ static void
+ remove_user_session (GdmManager *manager,
+                      GdmSession *session)
+ {
+         GList *node;
+         GdmDisplay *display;
+ 
+         display = get_display_for_user_session (session);
+ 
+         if (display != NULL) {
+                 gdm_display_unmanage (display);
+                 gdm_display_finish (display);
+         }
+ 
+         node = g_list_find (manager->priv->user_sessions, session);
+ 
+         if (node != NULL) {
+                 manager->priv->user_sessions = g_list_delete_link (manager->priv->user_sessions, node);
+                 gdm_session_close (session);
+                 g_object_unref (session);
+         }
+ }
+ 
+ static void
+ on_user_session_exited (GdmSession *session,
+                         int         code,
+                         GdmManager *manager)
+ {
+@@ -2141,60 +2146,67 @@ on_session_client_ready_for_session_to_start (GdmSession      *session,
+ 
+         if (client_is_ready && waiting_to_start_user_session) {
+                 start_user_session_if_ready (manager, session, service_name);
+         }
+ }
+ 
+ static void
+ on_session_client_connected (GdmSession      *session,
+                              GCredentials    *credentials,
+                              GPid             pid_of_client,
+                              GdmManager      *manager)
+ {
+         GdmDisplay *display;
+         char    *username;
+         int      delay;
+         gboolean enabled;
+         gboolean allow_timed_login = FALSE;
+ 
+         g_debug ("GdmManager: client connected");
+ 
+         display = get_display_for_user_session (session);
+ 
+         if (display == NULL) {
+                 return;
+         }
+ 
+         if (!display_is_on_seat0 (display)) {
+                 return;
+         }
+ 
++#ifdef WITH_PLYMOUTH
++        if (manager->priv->plymouth_is_running) {
++                plymouth_quit_with_transition ();
++                manager->priv->plymouth_is_running = FALSE;
++        }
++#endif
++
+         g_object_get (G_OBJECT (display), "allow-timed-login", &allow_timed_login, NULL);
+ 
+         if (!allow_timed_login) {
+                 return;
+         }
+ 
+         enabled = get_timed_login_details (manager, &username, &delay);
+ 
+         if (! enabled) {
+                 return;
+         }
+ 
+         gdm_session_set_timed_login_details (session, username, delay);
+ 
+         g_free (username);
+ 
+ }
+ 
+ static void
+ on_session_client_disconnected (GdmSession   *session,
+                                 GCredentials *credentials,
+                                 GPid          pid_of_client,
+                                 GdmManager   *manager)
+ {
+         GdmDisplay *display;
+         gboolean display_is_local;
+ 
+         g_debug ("GdmManager: client disconnected");
+ 
+         display = get_display_for_user_session (session);
+-- 
+2.3.3
+


More information about the scm-commits mailing list