[gnome-initial-setup: 1/4] driver: Connect to GDM as soon as g-i-s starts



commit 6b9cca532e6ef942df8fdd3349f16d9d313a9895
Author: João Paulo Rechi Vita <jprvita endlessm com>
Date:   Mon Dec 10 18:15:04 2018 -0800

    driver: Connect to GDM as soon as g-i-s starts
    
    GDM can't tell Plymouth to quit until g-i-s connects to it, so GDM knows
    g-i-s has started successfully. Currently g-i-s only connects to GDM on
    the last page, when it logs-in the new user. This prevents accessing the
    TTY and makes systemd account the time spent in g-i-s as part of the
    boot process.
    
    Connecting to GDM as soon as g-i-s allows GDM to tell Plymouth to quit
    at the right time, avoiding the problems described above.
    
    Closes: https://gitlab.gnome.org/GNOME/gdm/issues/439

 gnome-initial-setup/gis-driver.c                   | 58 ++++++++++++++++++++++
 gnome-initial-setup/gis-driver.h                   |  5 ++
 .../pages/summary/gis-summary-page.c               | 33 +-----------
 3 files changed, 65 insertions(+), 31 deletions(-)
---
diff --git a/gnome-initial-setup/gis-driver.c b/gnome-initial-setup/gis-driver.c
index 989f47a..18366b2 100644
--- a/gnome-initial-setup/gis-driver.c
+++ b/gnome-initial-setup/gis-driver.c
@@ -25,6 +25,7 @@
 
 #include <stdlib.h>
 #include <locale.h>
+#include <gdm/gdm-client.h>
 
 #include "gis-assistant.h"
 
@@ -69,6 +70,10 @@ struct _GisDriverPrivate {
   GtkWindow *main_window;
   GisAssistant *assistant;
 
+  GdmClient *client;
+  GdmGreeter *greeter;
+  GdmUserVerifier *user_verifier;
+
   ActUser *user_account;
   gchar *user_password;
 
@@ -83,6 +88,19 @@ typedef struct _GisDriverPrivate GisDriverPrivate;
 
 G_DEFINE_TYPE_WITH_PRIVATE(GisDriver, gis_driver, GTK_TYPE_APPLICATION)
 
+static void
+gis_driver_dispose (GObject *object)
+{
+  GisDriver *driver = GIS_DRIVER (object);
+  GisDriverPrivate *priv = gis_driver_get_instance_private (driver);
+
+  g_clear_object (&priv->user_verifier);
+  g_clear_object (&priv->greeter);
+  g_clear_object (&priv->client);
+
+  G_OBJECT_CLASS (gis_driver_parent_class)->dispose (object);
+}
+
 static void
 gis_driver_finalize (GObject *object)
 {
@@ -205,6 +223,22 @@ gis_driver_get_account_mode (GisDriver *driver)
   return priv->account_mode;
 }
 
+gboolean
+gis_driver_get_gdm_objects (GisDriver        *driver,
+                            GdmGreeter      **greeter,
+                            GdmUserVerifier **user_verifier)
+{
+  GisDriverPrivate *priv = gis_driver_get_instance_private (driver);
+
+  if (priv->greeter == NULL || priv->user_verifier == NULL)
+    return FALSE;
+
+  *greeter = priv->greeter;
+  *user_verifier = priv->user_verifier;
+
+  return TRUE;
+}
+
 void
 gis_driver_add_page (GisDriver *driver,
                      GisPage   *page)
@@ -422,6 +456,26 @@ window_realize_cb (GtkWidget *widget, gpointer user_data)
   update_screen_size (GIS_DRIVER (user_data));
 }
 
+static void
+connect_to_gdm (GisDriver *driver)
+{
+  GisDriverPrivate *priv = gis_driver_get_instance_private (driver);
+  g_autoptr(GError) error = NULL;
+
+  priv->client = gdm_client_new ();
+
+  priv->greeter = gdm_client_get_greeter_sync (priv->client, NULL, &error);
+  if (error == NULL)
+    priv->user_verifier = gdm_client_get_user_verifier_sync (priv->client, NULL, &error);
+
+  if (error != NULL) {
+    g_warning ("Failed to open connection to GDM: %s", error->message);
+    g_clear_object (&priv->user_verifier);
+    g_clear_object (&priv->greeter);
+    g_clear_object (&priv->client);
+  }
+}
+
 static void
 gis_driver_startup (GApplication *app)
 {
@@ -430,6 +484,9 @@ gis_driver_startup (GApplication *app)
 
   G_APPLICATION_CLASS (gis_driver_parent_class)->startup (app);
 
+  if (priv->mode == GIS_DRIVER_MODE_NEW_USER)
+    connect_to_gdm (driver);
+
   priv->main_window = g_object_new (GTK_TYPE_APPLICATION_WINDOW,
                                     "application", app,
                                     "type", GTK_WINDOW_TOPLEVEL,
@@ -475,6 +532,7 @@ gis_driver_class_init (GisDriverClass *klass)
 
   gobject_class->get_property = gis_driver_get_property;
   gobject_class->set_property = gis_driver_set_property;
+  gobject_class->dispose = gis_driver_dispose;
   gobject_class->finalize = gis_driver_finalize;
   application_class->startup = gis_driver_startup;
   application_class->activate = gis_driver_activate;
diff --git a/gnome-initial-setup/gis-driver.h b/gnome-initial-setup/gis-driver.h
index 9eb408e..d3a52ec 100644
--- a/gnome-initial-setup/gis-driver.h
+++ b/gnome-initial-setup/gis-driver.h
@@ -25,6 +25,7 @@
 #include "gis-assistant.h"
 #include "gis-page.h"
 #include <act/act-user-manager.h>
+#include <gdm/gdm-client.h>
 
 G_BEGIN_DECLS
 
@@ -89,6 +90,10 @@ void gis_driver_set_username (GisDriver   *driver,
                               const gchar *username);
 const gchar *gis_driver_get_username (GisDriver *driver);
 
+gboolean gis_driver_get_gdm_objects (GisDriver        *driver,
+                                     GdmGreeter      **greeter,
+                                     GdmUserVerifier **user_verifier);
+
 GisDriverMode gis_driver_get_mode (GisDriver *driver);
 
 gboolean gis_driver_is_small_screen (GisDriver *driver);
diff --git a/gnome-initial-setup/pages/summary/gis-summary-page.c 
b/gnome-initial-setup/pages/summary/gis-summary-page.c
index f510f2f..4686533 100644
--- a/gnome-initial-setup/pages/summary/gis-summary-page.c
+++ b/gnome-initial-setup/pages/summary/gis-summary-page.c
@@ -51,36 +51,6 @@ typedef struct _GisSummaryPagePrivate GisSummaryPagePrivate;
 
 G_DEFINE_TYPE_WITH_PRIVATE (GisSummaryPage, gis_summary_page, GIS_TYPE_PAGE);
 
-static gboolean
-connect_to_gdm (GdmGreeter      **greeter,
-                GdmUserVerifier **user_verifier)
-{
-  GdmClient *client;
-
-  GError *error = NULL;
-  gboolean res = FALSE;
-
-  client = gdm_client_new ();
-
-  *greeter = gdm_client_get_greeter_sync (client, NULL, &error);
-  if (error != NULL)
-    goto out;
-
-  *user_verifier = gdm_client_get_user_verifier_sync (client, NULL, &error);
-  if (error != NULL)
-    goto out;
-
-  res = TRUE;
-
- out:
-  if (error != NULL) {
-    g_warning ("Failed to open connection to GDM: %s", error->message);
-    g_error_free (error);
-  }
-
-  return res;
-}
-
 static void
 request_info_query (GisSummaryPage  *page,
                     GdmUserVerifier *user_verifier,
@@ -180,7 +150,8 @@ log_user_in (GisSummaryPage *page)
   GdmGreeter *greeter;
   GdmUserVerifier *user_verifier;
 
-  if (!connect_to_gdm (&greeter, &user_verifier)) {
+  if (!gis_driver_get_gdm_objects (GIS_PAGE (page)->driver,
+                                   &greeter, &user_verifier)) {
     g_warning ("No GDM connection; not initiating login");
     return;
   }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]