[gnome-initial-setup: 1/4] driver: Connect to GDM as soon as g-i-s starts
- From: Will Thompson <wjt src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-initial-setup: 1/4] driver: Connect to GDM as soon as g-i-s starts
- Date: Fri, 1 Mar 2019 15:14:39 +0000 (UTC)
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]