summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog41
-rw-r--r--daemon/gdm-greeter-server.h1
-rw-r--r--gui/simple-greeter/Makefile.am6
-rw-r--r--gui/simple-greeter/gdm-greeter-client.c636
-rw-r--r--gui/simple-greeter/gdm-greeter-client.h99
-rw-r--r--gui/simple-greeter/gdm-greeter-session.c418
-rw-r--r--gui/simple-greeter/gdm-greeter-session.h58
-rw-r--r--gui/simple-greeter/gdm-user-manager.c6
-rw-r--r--gui/simple-greeter/greeter-main.c447
9 files changed, 1283 insertions, 429 deletions
diff --git a/ChangeLog b/ChangeLog
index 3bfc2080..a0c9910e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,46 @@
2007-10-23 William Jon McCann <mccann@jhu.edu>
+ * daemon/gdm-greeter-server.h:
+ * gui/simple-greeter/Makefile.am:
+ * gui/simple-greeter/gdm-greeter-client.c:
+ (gdm_greeter_client_error_quark), (on_info), (on_problem),
+ (on_ready), (on_reset), (on_info_query), (on_secret_info_query),
+ (gdm_greeter_client_call_begin_verification),
+ (gdm_greeter_client_call_answer_query),
+ (gdm_greeter_client_call_select_session),
+ (gdm_greeter_client_call_select_language),
+ (gdm_greeter_client_call_select_user),
+ (gdm_greeter_client_call_select_hostname),
+ (gdm_greeter_client_call_cancel),
+ (gdm_greeter_client_call_disconnect),
+ (gdm_greeter_client_call_get_display_id), (proxy_destroyed),
+ (gdm_greeter_client_start), (gdm_greeter_client_stop),
+ (gdm_greeter_client_set_property),
+ (gdm_greeter_client_get_property),
+ (gdm_greeter_client_constructor), (gdm_greeter_client_dispose),
+ (gdm_greeter_client_class_init), (gdm_greeter_client_init),
+ (gdm_greeter_client_finalize), (gdm_greeter_client_new):
+ * gui/simple-greeter/gdm-greeter-client.h:
+ * gui/simple-greeter/gdm-greeter-session.c: (on_info),
+ (on_problem), (on_ready), (on_reset), (on_info_query),
+ (on_secret_info_query), (on_begin_verification), (on_query_answer),
+ (on_select_session), (on_select_language), (on_select_user),
+ (on_select_hostname), (on_cancelled), (on_disconnected),
+ (start_login_window), (gdm_greeter_session_set_level),
+ (gdm_greeter_session_start), (gdm_greeter_session_stop),
+ (gdm_greeter_session_set_property),
+ (gdm_greeter_session_get_property),
+ (gdm_greeter_session_constructor), (gdm_greeter_session_dispose),
+ (gdm_greeter_session_class_init), (gdm_greeter_session_init),
+ (gdm_greeter_session_finalize), (gdm_greeter_session_new):
+ * gui/simple-greeter/gdm-greeter-session.h:
+ * gui/simple-greeter/gdm-user-manager.c: (gdm_user_manager_init):
+ * gui/simple-greeter/greeter-main.c: (main):
+ Refactor some of the greeter. Break DBus client into new class.
+ Create a GdmGreeterSession that will run external apps.
+
+2007-10-23 William Jon McCann <mccann@jhu.edu>
+
* common/gdm-common.c: (gdm_signal_pid):
* common/gdm-common.h:
* daemon/Makefile.am:
diff --git a/daemon/gdm-greeter-server.h b/daemon/gdm-greeter-server.h
index 4d76f2a2..d888f609 100644
--- a/daemon/gdm-greeter-server.h
+++ b/daemon/gdm-greeter-server.h
@@ -69,6 +69,7 @@ gboolean gdm_greeter_server_start (GdmGreeterServer *gree
gboolean gdm_greeter_server_stop (GdmGreeterServer *greeter_server);
char * gdm_greeter_server_get_address (GdmGreeterServer *greeter_server);
+
gboolean gdm_greeter_server_info_query (GdmGreeterServer *greeter_server,
const char *text);
gboolean gdm_greeter_server_secret_info_query (GdmGreeterServer *greeter_server,
diff --git a/gui/simple-greeter/Makefile.am b/gui/simple-greeter/Makefile.am
index 4f83e98d..cdf481d8 100644
--- a/gui/simple-greeter/Makefile.am
+++ b/gui/simple-greeter/Makefile.am
@@ -105,13 +105,17 @@ test_user_manager_LDADD = \
$(SIMPLE_GREETER_LIBS) \
$(NULL)
-libexec_PROGRAMS = \
+libexec_PROGRAMS = \
gdm-simple-greeter
gdm_simple_greeter_SOURCES = \
greeter-main.c \
gdm-simple-greeter.c \
gdm-simple-greeter.h \
+ gdm-greeter-client.h \
+ gdm-greeter-client.c \
+ gdm-greeter-session.h \
+ gdm-greeter-session.c \
gdm-greeter-panel.h \
gdm-greeter-panel.c \
gdm-greeter-background.h \
diff --git a/gui/simple-greeter/gdm-greeter-client.c b/gui/simple-greeter/gdm-greeter-client.c
new file mode 100644
index 00000000..cf31cad8
--- /dev/null
+++ b/gui/simple-greeter/gdm-greeter-client.c
@@ -0,0 +1,636 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <glib-object.h>
+#define DBUS_API_SUBJECT_TO_CHANGE
+#include <dbus/dbus-glib.h>
+#include <dbus/dbus-glib-lowlevel.h>
+
+#include "gdm-greeter-client.h"
+
+#define GDM_GREETER_CLIENT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_GREETER_CLIENT, GdmGreeterClientPrivate))
+
+#define SERVER_DBUS_PATH "/org/gnome/DisplayManager/GreeterServer"
+#define SERVER_DBUS_INTERFACE "org.gnome.DisplayManager.GreeterServer"
+
+struct GdmGreeterClientPrivate
+{
+ DBusGConnection *connection;
+ DBusGProxy *server_proxy;
+ char *address;
+};
+
+enum {
+ PROP_0,
+};
+
+enum {
+ INFO,
+ PROBLEM,
+ INFO_QUERY,
+ SECRET_INFO_QUERY,
+ READY,
+ RESET,
+ LAST_SIGNAL
+};
+
+static guint gdm_greeter_client_signals [LAST_SIGNAL];
+
+static void gdm_greeter_client_class_init (GdmGreeterClientClass *klass);
+static void gdm_greeter_client_init (GdmGreeterClient *greeter_client);
+static void gdm_greeter_client_finalize (GObject *object);
+
+G_DEFINE_TYPE (GdmGreeterClient, gdm_greeter_client, G_TYPE_OBJECT)
+
+static gpointer client_object = NULL;
+
+GQuark
+gdm_greeter_client_error_quark (void)
+{
+ static GQuark error_quark = 0;
+
+ if (error_quark == 0)
+ error_quark = g_quark_from_static_string ("gdm-greeter-client");
+
+ return error_quark;
+}
+
+static void
+on_info (DBusGProxy *proxy,
+ const char *text,
+ GdmGreeterClient *client)
+{
+ g_debug ("GREETER INFO: %s", text);
+
+ g_signal_emit (client,
+ gdm_greeter_client_signals[INFO],
+ 0, text);
+}
+
+static void
+on_problem (DBusGProxy *proxy,
+ const char *text,
+ GdmGreeterClient *client)
+{
+ g_debug ("GREETER PROBLEM: %s", text);
+
+ g_signal_emit (client,
+ gdm_greeter_client_signals[PROBLEM],
+ 0, text);
+}
+
+static void
+on_ready (DBusGProxy *proxy,
+ GdmGreeterClient *client)
+{
+ g_debug ("GREETER SERVER READY");
+
+ g_signal_emit (client,
+ gdm_greeter_client_signals[READY],
+ 0);
+}
+
+static void
+on_reset (DBusGProxy *proxy,
+ GdmGreeterClient *client)
+{
+ g_debug ("GREETER RESET");
+
+ g_signal_emit (client,
+ gdm_greeter_client_signals[RESET],
+ 0);
+}
+
+static void
+on_info_query (DBusGProxy *proxy,
+ const char *text,
+ GdmGreeterClient *client)
+{
+ g_debug ("GREETER Info query: %s", text);
+
+ g_signal_emit (client,
+ gdm_greeter_client_signals[INFO_QUERY],
+ 0, text);
+}
+
+static void
+on_secret_info_query (DBusGProxy *proxy,
+ const char *text,
+ GdmGreeterClient *client)
+{
+ g_debug ("GREETER Secret info query: %s", text);
+
+ g_signal_emit (client,
+ gdm_greeter_client_signals[SECRET_INFO_QUERY],
+ 0, text);
+}
+
+void
+gdm_greeter_client_call_begin_verification (GdmGreeterClient *client,
+ const char *username)
+{
+ gboolean res;
+ GError *error;
+
+ g_return_if_fail (GDM_IS_GREETER_CLIENT (client));
+
+ g_debug ("GREETER begin verification");
+
+ error = NULL;
+ res = dbus_g_proxy_call (client->priv->server_proxy,
+ "BeginVerification",
+ &error,
+ G_TYPE_STRING, username,
+ G_TYPE_INVALID,
+ G_TYPE_INVALID);
+ if (! res) {
+ g_warning ("Unable to send BeginVerification: %s", error->message);
+ g_error_free (error);
+ }
+}
+
+void
+gdm_greeter_client_call_answer_query (GdmGreeterClient *client,
+ const char *text)
+{
+ gboolean res;
+ GError *error;
+
+ g_debug ("GREETER answer");
+
+ error = NULL;
+ res = dbus_g_proxy_call (client->priv->server_proxy,
+ "AnswerQuery",
+ &error,
+ G_TYPE_STRING, text,
+ G_TYPE_INVALID,
+ G_TYPE_INVALID);
+ if (! res) {
+ g_warning ("Unable to send AnswerQuery: %s", error->message);
+ g_error_free (error);
+ }
+}
+
+void
+gdm_greeter_client_call_select_session (GdmGreeterClient *client,
+ const char *text)
+{
+ gboolean res;
+ GError *error;
+
+ g_debug ("GREETER client selected: %s", text);
+
+ error = NULL;
+ res = dbus_g_proxy_call (client->priv->server_proxy,
+ "SelectSession",
+ &error,
+ G_TYPE_STRING, text,
+ G_TYPE_INVALID,
+ G_TYPE_INVALID);
+ if (! res) {
+ g_warning ("Unable to send SelectSession: %s", error->message);
+ g_error_free (error);
+ }
+}
+
+void
+gdm_greeter_client_call_select_language (GdmGreeterClient *client,
+ const char *text)
+{
+ gboolean res;
+ GError *error;
+
+ g_debug ("GREETER client selected: %s", text);
+
+ error = NULL;
+ res = dbus_g_proxy_call (client->priv->server_proxy,
+ "SelectLanguage",
+ &error,
+ G_TYPE_STRING, text,
+ G_TYPE_INVALID,
+ G_TYPE_INVALID);
+ if (! res) {
+ g_warning ("Unable to send SelectLanguage: %s", error->message);
+ g_error_free (error);
+ }
+}
+
+void
+gdm_greeter_client_call_select_user (GdmGreeterClient *client,
+ const char *text)
+{
+ gboolean res;
+ GError *error;
+
+ g_debug ("GREETER user selected: %s", text);
+
+ error = NULL;
+ res = dbus_g_proxy_call (client->priv->server_proxy,
+ "SelectUser",
+ &error,
+ G_TYPE_STRING, text,
+ G_TYPE_INVALID,
+ G_TYPE_INVALID);
+ if (! res) {
+ g_warning ("Unable to send SelectUser: %s", error->message);
+ g_error_free (error);
+ }
+}
+
+void
+gdm_greeter_client_call_select_hostname (GdmGreeterClient *client,
+ const char *text)
+{
+ gboolean res;
+ GError *error;
+
+ g_debug ("GREETER hostname selected: %s", text);
+
+ error = NULL;
+ res = dbus_g_proxy_call (client->priv->server_proxy,
+ "SelectHostname",
+ &error,
+ G_TYPE_STRING, text,
+ G_TYPE_INVALID,
+ G_TYPE_INVALID);
+ if (! res) {
+ g_warning ("Unable to send SelectHostname: %s", error->message);
+ g_error_free (error);
+ }
+}
+
+void
+gdm_greeter_client_call_cancel (GdmGreeterClient *client)
+{
+ gboolean res;
+ GError *error;
+
+ g_debug ("GREETER cancelled");
+
+ error = NULL;
+ res = dbus_g_proxy_call (client->priv->server_proxy,
+ "Cancel",
+ &error,
+ G_TYPE_INVALID,
+ G_TYPE_INVALID);
+ if (! res) {
+ g_warning ("Unable to send Cancelled: %s", error->message);
+ g_error_free (error);
+ }
+}
+
+void
+gdm_greeter_client_call_disconnect (GdmGreeterClient *client)
+{
+ gboolean res;
+ GError *error;
+
+ g_debug ("GREETER disconnected");
+
+ error = NULL;
+ res = dbus_g_proxy_call (client->priv->server_proxy,
+ "Disconnect",
+ &error,
+ G_TYPE_INVALID,
+ G_TYPE_INVALID);
+ if (! res) {
+ g_warning ("Unable to send Disconnected: %s", error->message);
+ g_error_free (error);
+ }
+}
+
+char *
+gdm_greeter_client_call_get_display_id (GdmGreeterClient *client)
+{
+ gboolean res;
+ GError *error;
+ char *id;
+
+ g_return_val_if_fail (GDM_IS_GREETER_CLIENT (client), NULL);
+
+ id = NULL;
+ error = NULL;
+ res = dbus_g_proxy_call (client->priv->server_proxy,
+ "GetDisplayId",
+ &error,
+ G_TYPE_INVALID,
+ DBUS_TYPE_G_OBJECT_PATH, &id,
+ G_TYPE_INVALID);
+ if (! res) {
+ g_warning ("Unable to GetDisplayId: %s", error->message);
+ g_error_free (error);
+ }
+
+ return id;
+}
+
+static void
+proxy_destroyed (GObject *object,
+ gpointer data)
+{
+ g_debug ("GREETER Proxy disconnected");
+}
+
+gboolean
+gdm_greeter_client_start (GdmGreeterClient *client,
+ GError **error)
+{
+ gboolean ret;
+ GError *local_error;
+
+ g_return_val_if_fail (GDM_IS_GREETER_CLIENT (client), FALSE);
+
+ ret = FALSE;
+
+ if (client->priv->address == NULL) {
+ g_warning ("GDM_GREETER_DBUS_ADDRESS not set");
+ g_set_error (error,
+ GDM_GREETER_CLIENT_ERROR,
+ GDM_GREETER_CLIENT_ERROR_GENERIC,
+ "GDM_GREETER_DBUS_ADDRESS not set");
+ goto out;
+ }
+
+ g_debug ("GREETER connecting to address: %s", client->priv->address);
+
+ local_error = NULL;
+ client->priv->connection = dbus_g_connection_open (client->priv->address, &local_error);
+ if (client->priv->connection == NULL) {
+ if (local_error != NULL) {
+ g_warning ("error opening connection: %s", local_error->message);
+ g_propagate_error (error, local_error);
+ } else {
+ g_warning ("Unable to open connection");
+ }
+ goto out;
+ }
+
+ g_debug ("GREETER creating proxy for peer: %s", SERVER_DBUS_PATH);
+ client->priv->server_proxy = dbus_g_proxy_new_for_peer (client->priv->connection,
+ SERVER_DBUS_PATH,
+ SERVER_DBUS_INTERFACE);
+ if (client->priv->server_proxy == NULL) {
+ g_warning ("Unable to create proxy for peer");
+ g_set_error (error,
+ GDM_GREETER_CLIENT_ERROR,
+ GDM_GREETER_CLIENT_ERROR_GENERIC,
+ "Unable to create proxy for peer");
+
+ /* FIXME: drop connection? */
+ goto out;
+ }
+
+ g_signal_connect (client->priv->server_proxy, "destroy", G_CALLBACK (proxy_destroyed), NULL);
+
+ /* FIXME: not sure why introspection isn't working */
+ dbus_g_proxy_add_signal (client->priv->server_proxy, "InfoQuery", G_TYPE_STRING, G_TYPE_INVALID);
+ dbus_g_proxy_add_signal (client->priv->server_proxy, "SecretInfoQuery", G_TYPE_STRING, G_TYPE_INVALID);
+ dbus_g_proxy_add_signal (client->priv->server_proxy, "Info", G_TYPE_STRING, G_TYPE_INVALID);
+ dbus_g_proxy_add_signal (client->priv->server_proxy, "Problem", G_TYPE_STRING, G_TYPE_INVALID);
+ dbus_g_proxy_add_signal (client->priv->server_proxy, "Ready", G_TYPE_INVALID);
+ dbus_g_proxy_add_signal (client->priv->server_proxy, "Reset", G_TYPE_INVALID);
+
+ dbus_g_proxy_connect_signal (client->priv->server_proxy,
+ "InfoQuery",
+ G_CALLBACK (on_info_query),
+ NULL,
+ NULL);
+ dbus_g_proxy_connect_signal (client->priv->server_proxy,
+ "SecretInfoQuery",
+ G_CALLBACK (on_secret_info_query),
+ NULL,
+ NULL);
+ dbus_g_proxy_connect_signal (client->priv->server_proxy,
+ "Info",
+ G_CALLBACK (on_info),
+ NULL,
+ NULL);
+ dbus_g_proxy_connect_signal (client->priv->server_proxy,
+ "Problem",
+ G_CALLBACK (on_problem),
+ NULL,
+ NULL);
+ dbus_g_proxy_connect_signal (client->priv->server_proxy,
+ "Ready",
+ G_CALLBACK (on_ready),
+ NULL,
+ NULL);
+ dbus_g_proxy_connect_signal (client->priv->server_proxy,
+ "Reset",
+ G_CALLBACK (on_reset),
+ NULL,
+ NULL);
+ ret = TRUE;
+
+ out:
+ return ret;
+}
+
+void
+gdm_greeter_client_stop (GdmGreeterClient *client)
+{
+ g_return_if_fail (GDM_IS_GREETER_CLIENT (client));
+
+}
+
+static void
+gdm_greeter_client_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GdmGreeterClient *self;
+
+ self = GDM_GREETER_CLIENT (object);
+
+ switch (prop_id) {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gdm_greeter_client_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GdmGreeterClient *self;
+
+ self = GDM_GREETER_CLIENT (object);
+
+ switch (prop_id) {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static GObject *
+gdm_greeter_client_constructor (GType type,
+ guint n_construct_properties,
+ GObjectConstructParam *construct_properties)
+{
+ GdmGreeterClient *greeter_client;
+ GdmGreeterClientClass *klass;
+
+ klass = GDM_GREETER_CLIENT_CLASS (g_type_class_peek (GDM_TYPE_GREETER_CLIENT));
+
+ greeter_client = GDM_GREETER_CLIENT (G_OBJECT_CLASS (gdm_greeter_client_parent_class)->constructor (type,
+ n_construct_properties,
+ construct_properties));
+
+ return G_OBJECT (greeter_client);
+}
+
+static void
+gdm_greeter_client_dispose (GObject *object)
+{
+ GdmGreeterClient *greeter_client;
+
+ greeter_client = GDM_GREETER_CLIENT (object);
+
+ g_debug ("Disposing greeter_client");
+
+ G_OBJECT_CLASS (gdm_greeter_client_parent_class)->dispose (object);
+}
+
+static void
+gdm_greeter_client_class_init (GdmGreeterClientClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->get_property = gdm_greeter_client_get_property;
+ object_class->set_property = gdm_greeter_client_set_property;
+ object_class->constructor = gdm_greeter_client_constructor;
+ object_class->dispose = gdm_greeter_client_dispose;
+ object_class->finalize = gdm_greeter_client_finalize;
+
+ g_type_class_add_private (klass, sizeof (GdmGreeterClientPrivate));
+
+ gdm_greeter_client_signals[INFO_QUERY] =
+ g_signal_new ("info-query",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GdmGreeterClientClass, info_query),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_STRING);
+
+ gdm_greeter_client_signals[SECRET_INFO_QUERY] =
+ g_signal_new ("secret-info-query",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GdmGreeterClientClass, secret_info_query),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_STRING);
+
+ gdm_greeter_client_signals[INFO] =
+ g_signal_new ("info",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GdmGreeterClientClass, info),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_STRING);
+
+ gdm_greeter_client_signals[PROBLEM] =
+ g_signal_new ("problem",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GdmGreeterClientClass, problem),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_STRING);
+
+ gdm_greeter_client_signals[READY] =
+ g_signal_new ("ready",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GdmGreeterClientClass, ready),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+}
+
+static void
+gdm_greeter_client_init (GdmGreeterClient *client)
+{
+
+ client->priv = GDM_GREETER_CLIENT_GET_PRIVATE (client);
+
+ client->priv->address = g_strdup (g_getenv ("GDM_GREETER_DBUS_ADDRESS"));
+}
+
+static void
+gdm_greeter_client_finalize (GObject *object)
+{
+ GdmGreeterClient *client;
+
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (GDM_IS_GREETER_CLIENT (object));
+
+ client = GDM_GREETER_CLIENT (object);
+
+ g_return_if_fail (client->priv != NULL);
+
+ g_free (client->priv->address);
+
+ G_OBJECT_CLASS (gdm_greeter_client_parent_class)->finalize (object);
+}
+
+GdmGreeterClient *
+gdm_greeter_client_new (void)
+{
+ if (client_object != NULL) {
+ g_object_ref (client_object);
+ } else {
+ client_object = g_object_new (GDM_TYPE_GREETER_CLIENT, NULL);
+ g_object_add_weak_pointer (client_object,
+ (gpointer *) &client_object);
+ }
+
+ return GDM_GREETER_CLIENT (client_object);
+}
diff --git a/gui/simple-greeter/gdm-greeter-client.h b/gui/simple-greeter/gdm-greeter-client.h
new file mode 100644
index 00000000..23c9861b
--- /dev/null
+++ b/gui/simple-greeter/gdm-greeter-client.h
@@ -0,0 +1,99 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#ifndef __GDM_GREETER_CLIENT_H
+#define __GDM_GREETER_CLIENT_H
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define GDM_TYPE_GREETER_CLIENT (gdm_greeter_client_get_type ())
+#define GDM_GREETER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GDM_TYPE_GREETER_CLIENT, GdmGreeterClient))
+#define GDM_GREETER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GDM_TYPE_GREETER_CLIENT, GdmGreeterClientClass))
+#define GDM_IS_GREETER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDM_TYPE_GREETER_CLIENT))
+#define GDM_IS_GREETER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GDM_TYPE_GREETER_CLIENT))
+#define GDM_GREETER_CLIENT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GDM_TYPE_GREETER_CLIENT, GdmGreeterClientClass))
+
+typedef struct GdmGreeterClientPrivate GdmGreeterClientPrivate;
+
+typedef struct
+{
+ GObject parent;
+ GdmGreeterClientPrivate *priv;
+} GdmGreeterClient;
+
+typedef struct
+{
+ GObjectClass parent_class;
+
+ void (* info_query) (GdmGreeterClient *client,
+ const char *query_text);
+
+ void (* secret_info_query) (GdmGreeterClient *client,
+ const char *query_text);
+
+ void (* info) (GdmGreeterClient *client,
+ const char *info);
+
+ void (* problem) (GdmGreeterClient *client,
+ const char *problem);
+ void (* ready) (GdmGreeterClient *client);
+ void (* reset) (GdmGreeterClient *client);
+
+} GdmGreeterClientClass;
+
+#define GDM_GREETER_CLIENT_ERROR (gdm_greeter_client_error_quark ())
+
+typedef enum _GdmGreeterClientError {
+ GDM_GREETER_CLIENT_ERROR_GENERIC = 0,
+} GdmGreeterClientError;
+
+GType gdm_greeter_client_get_type (void);
+GQuark gdm_greeter_client_error_quark (void);
+
+GdmGreeterClient * gdm_greeter_client_new (void);
+
+gboolean gdm_greeter_client_start (GdmGreeterClient *client,
+ GError **error);
+void gdm_greeter_client_stop (GdmGreeterClient *client);
+
+
+char * gdm_greeter_client_call_get_display_id (GdmGreeterClient *client);
+
+void gdm_greeter_client_call_begin_verification (GdmGreeterClient *client,
+ const char *username);
+void gdm_greeter_client_call_cancel (GdmGreeterClient *client);
+void gdm_greeter_client_call_disconnect (GdmGreeterClient *client);
+void gdm_greeter_client_call_select_hostname (GdmGreeterClient *client,
+ const char *text);
+void gdm_greeter_client_call_select_user (GdmGreeterClient *client,
+ const char *text);
+void gdm_greeter_client_call_select_language (GdmGreeterClient *client,
+ const char *text);
+void gdm_greeter_client_call_select_session (GdmGreeterClient *client,
+ const char *text);
+void gdm_greeter_client_call_answer_query (GdmGreeterClient *client,
+ const char *text);
+
+
+G_END_DECLS
+
+#endif /* __GDM_GREETER_CLIENT_H */
diff --git a/gui/simple-greeter/gdm-greeter-session.c b/gui/simple-greeter/gdm-greeter-session.c
new file mode 100644
index 00000000..28126830
--- /dev/null
+++ b/gui/simple-greeter/gdm-greeter-session.c
@@ -0,0 +1,418 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <glib-object.h>
+
+#include "gdm-greeter-session.h"
+#include "gdm-greeter-client.h"
+#include "gdm-simple-greeter.h"
+#include "gdm-greeter.h"
+
+typedef enum {
+ GDM_GREETER_SESSION_LEVEL_NONE,
+ GDM_GREETER_SESSION_LEVEL_STARTUP,
+ GDM_GREETER_SESSION_LEVEL_CONFIGURATION,
+ GDM_GREETER_SESSION_LEVEL_LOGIN_WINDOW,
+ GDM_GREETER_SESSION_LEVEL_HOST_CHOOSER,
+ GDM_GREETER_SESSION_LEVEL_REMOTE_HOST,
+ GDM_GREETER_SESSION_LEVEL_SHUTDOWN,
+} GdmGreeterSessionLevel;
+
+#define GDM_GREETER_SESSION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_GREETER_SESSION, GdmGreeterSessionPrivate))
+
+struct GdmGreeterSessionPrivate
+{
+ GdmGreeterClient *client;
+ GdmGreeter *greeter;
+};
+
+enum {
+ PROP_0,
+};
+
+static void gdm_greeter_session_class_init (GdmGreeterSessionClass *klass);
+static void gdm_greeter_session_init (GdmGreeterSession *greeter_session);
+static void gdm_greeter_session_finalize (GObject *object);
+
+G_DEFINE_TYPE (GdmGreeterSession, gdm_greeter_session, G_TYPE_OBJECT)
+
+static gpointer session_object = NULL;
+
+static void
+on_info (GdmGreeterClient *client,
+ const char *text,
+ GdmGreeterSession *session)
+{
+ g_debug ("GREETER INFO: %s", text);
+
+ gdm_greeter_info (session->priv->greeter, text);
+}
+
+static void
+on_problem (GdmGreeterClient *client,
+ const char *text,
+ GdmGreeterSession *session)
+{
+ g_debug ("GREETER PROBLEM: %s", text);
+
+ gdm_greeter_problem (session->priv->greeter, text);
+}
+
+static void
+on_ready (GdmGreeterClient *client,
+ GdmGreeterSession *session)
+{
+ g_debug ("GREETER SERVER READY");
+
+ gdm_greeter_ready (session->priv->greeter);
+}
+
+static void
+on_reset (GdmGreeterClient *client,
+ GdmGreeterSession *session)
+{
+ g_debug ("GREETER RESET");
+
+ gdm_greeter_reset (session->priv->greeter);
+}
+
+static void
+on_info_query (GdmGreeterClient *client,
+ const char *text,
+ GdmGreeterSession *session)
+{
+ g_debug ("GREETER Info query: %s", text);
+
+ gdm_greeter_info_query (session->priv->greeter, text);
+}
+
+static void
+on_secret_info_query (GdmGreeterClient *client,
+ const char *text,
+ GdmGreeterSession *session)
+{
+ g_debug ("GREETER Secret info query: %s", text);
+
+ gdm_greeter_secret_info_query (session->priv->greeter, text);
+}
+
+static void
+on_begin_verification (GdmGreeter *greeter,
+ const char *username,
+ GdmGreeterSession *session)
+{
+ gdm_greeter_client_call_begin_verification (session->priv->client,
+ username);
+}
+
+static void
+on_query_answer (GdmGreeter *greeter,
+ const char *text,
+ GdmGreeterSession *session)
+{
+ gdm_greeter_client_call_answer_query (session->priv->client,
+ text);
+}
+
+static void
+on_select_session (GdmGreeter *greeter,
+ const char *text,
+ GdmGreeterSession *session)
+{
+ gdm_greeter_client_call_select_session (session->priv->client,
+ text);
+}
+
+static void
+on_select_language (GdmGreeter *greeter,
+ const char *text,
+ GdmGreeterSession *session)
+{
+ gdm_greeter_client_call_select_language (session->priv->client,
+ text);
+}
+
+static void
+on_select_user (GdmGreeter *greeter,
+ const char *text,
+ GdmGreeterSession *session)
+{
+ gdm_greeter_client_call_select_user (session->priv->client,
+ text);
+}
+
+static void
+on_select_hostname (GdmGreeter *greeter,
+ const char *text,
+ GdmGreeterSession *session)
+{
+ gdm_greeter_client_call_select_hostname (session->priv->client,
+ text);
+}
+
+static void
+on_cancelled (GdmGreeter *greeter,
+ GdmGreeterSession *session)
+{
+ gdm_greeter_client_call_cancel (session->priv->client);
+}
+
+static void
+on_disconnected (GdmGreeter *greeter,
+ GdmGreeterSession *session)
+{
+ gdm_greeter_client_call_disconnect (session->priv->client);
+}
+
+static void
+start_login_window (GdmGreeterSession *session)
+{
+ char *display_id;
+
+ display_id = gdm_greeter_client_call_get_display_id (session->priv->client);
+ session->priv->greeter = gdm_simple_greeter_new (display_id);
+ g_free (display_id);
+
+ g_signal_connect (session->priv->greeter,
+ "begin-verification",
+ G_CALLBACK (on_begin_verification),
+ NULL);
+ g_signal_connect (session->priv->greeter,
+ "query-answer",
+ G_CALLBACK (on_query_answer),
+ NULL);
+ g_signal_connect (session->priv->greeter,
+ "session-selected",
+ G_CALLBACK (on_select_session),
+ NULL);
+ g_signal_connect (session->priv->greeter,
+ "language-selected",
+ G_CALLBACK (on_select_language),
+ NULL);
+ g_signal_connect (session->priv->greeter,
+ "user-selected",
+ G_CALLBACK (on_select_user),
+ NULL);
+ g_signal_connect (session->priv->greeter,
+ "hostname-selected",
+ G_CALLBACK (on_select_hostname),
+ NULL);
+ g_signal_connect (session->priv->greeter,
+ "cancelled",
+ G_CALLBACK (on_cancelled),
+ NULL);
+ g_signal_connect (session->priv->greeter,
+ "disconnected",
+ G_CALLBACK (on_disconnected),
+ NULL);
+}
+
+static void
+gdm_greeter_session_set_level (GdmGreeterSession *session,
+ GdmGreeterSessionLevel level)
+{
+ switch (level) {
+ case GDM_GREETER_SESSION_LEVEL_NONE:
+ break;
+ case GDM_GREETER_SESSION_LEVEL_STARTUP:
+ break;
+ case GDM_GREETER_SESSION_LEVEL_CONFIGURATION:
+ break;
+ case GDM_GREETER_SESSION_LEVEL_LOGIN_WINDOW:
+ start_login_window (session);
+ break;
+ case GDM_GREETER_SESSION_LEVEL_SHUTDOWN:
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+}
+
+gboolean
+gdm_greeter_session_start (GdmGreeterSession *session,
+ GError **error)
+{
+ gboolean res;
+
+ g_return_val_if_fail (GDM_IS_GREETER_SESSION (session), FALSE);
+
+ res = gdm_greeter_client_start (session->priv->client, error);
+
+ gdm_greeter_session_set_level (session, GDM_GREETER_SESSION_LEVEL_LOGIN_WINDOW);
+
+ return res;
+}
+
+void
+gdm_greeter_session_stop (GdmGreeterSession *session)
+{
+ g_return_if_fail (GDM_IS_GREETER_SESSION (session));
+
+}
+
+static void
+gdm_greeter_session_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GdmGreeterSession *self;
+
+ self = GDM_GREETER_SESSION (object);
+
+ switch (prop_id) {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gdm_greeter_session_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GdmGreeterSession *self;
+
+ self = GDM_GREETER_SESSION (object);
+
+ switch (prop_id) {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static GObject *
+gdm_greeter_session_constructor (GType type,
+ guint n_construct_properties,
+ GObjectConstructParam *construct_properties)
+{
+ GdmGreeterSession *greeter_session;
+ GdmGreeterSessionClass *klass;
+
+ klass = GDM_GREETER_SESSION_CLASS (g_type_class_peek (GDM_TYPE_GREETER_SESSION));
+
+ greeter_session = GDM_GREETER_SESSION (G_OBJECT_CLASS (gdm_greeter_session_parent_class)->constructor (type,
+ n_construct_properties,
+ construct_properties));
+
+ return G_OBJECT (greeter_session);
+}
+
+static void
+gdm_greeter_session_dispose (GObject *object)
+{
+ GdmGreeterSession *greeter_session;
+
+ greeter_session = GDM_GREETER_SESSION (object);
+
+ g_debug ("Disposing greeter_session");
+
+ G_OBJECT_CLASS (gdm_greeter_session_parent_class)->dispose (object);
+}
+
+static void
+gdm_greeter_session_class_init (GdmGreeterSessionClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->get_property = gdm_greeter_session_get_property;
+ object_class->set_property = gdm_greeter_session_set_property;
+ object_class->constructor = gdm_greeter_session_constructor;
+ object_class->dispose = gdm_greeter_session_dispose;
+ object_class->finalize = gdm_greeter_session_finalize;
+
+ g_type_class_add_private (klass, sizeof (GdmGreeterSessionPrivate));
+}
+
+static void
+gdm_greeter_session_init (GdmGreeterSession *session)
+{
+
+ session->priv = GDM_GREETER_SESSION_GET_PRIVATE (session);
+
+ session->priv->client = gdm_greeter_client_new ();
+ g_signal_connect (session->priv->client,
+ "info-query",
+ G_CALLBACK (on_info_query),
+ session);
+ g_signal_connect (session->priv->client,
+ "secret-info-query",
+ G_CALLBACK (on_secret_info_query),
+ session);
+ g_signal_connect (session->priv->client,
+ "info",
+ G_CALLBACK (on_info),
+ session);
+ g_signal_connect (session->priv->client,
+ "problem",
+ G_CALLBACK (on_problem),
+ session);
+ g_signal_connect (session->priv->client,
+ "ready",
+ G_CALLBACK (on_ready),
+ session);
+ g_signal_connect (session->priv->client,
+ "reset",
+ G_CALLBACK (on_reset),
+ session);
+
+}
+
+static void
+gdm_greeter_session_finalize (GObject *object)
+{
+ GdmGreeterSession *greeter_session;
+
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (GDM_IS_GREETER_SESSION (object));
+
+ greeter_session = GDM_GREETER_SESSION (object);
+
+ g_return_if_fail (greeter_session->priv != NULL);
+
+ G_OBJECT_CLASS (gdm_greeter_session_parent_class)->finalize (object);
+}
+
+GdmGreeterSession *
+gdm_greeter_session_new (void)
+{
+ if (session_object != NULL) {
+ g_object_ref (session_object);
+ } else {
+ session_object = g_object_new (GDM_TYPE_GREETER_SESSION, NULL);
+ g_object_add_weak_pointer (session_object,
+ (gpointer *) &session_object);
+ }
+
+ return GDM_GREETER_SESSION (session_object);
+}
diff --git a/gui/simple-greeter/gdm-greeter-session.h b/gui/simple-greeter/gdm-greeter-session.h
new file mode 100644
index 00000000..1a809860
--- /dev/null
+++ b/gui/simple-greeter/gdm-greeter-session.h
@@ -0,0 +1,58 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#ifndef __GDM_GREETER_SESSION_H
+#define __GDM_GREETER_SESSION_H
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define GDM_TYPE_GREETER_SESSION (gdm_greeter_session_get_type ())
+#define GDM_GREETER_SESSION(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GDM_TYPE_GREETER_SESSION, GdmGreeterSession))
+#define GDM_GREETER_SESSION_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GDM_TYPE_GREETER_SESSION, GdmGreeterSessionClass))
+#define GDM_IS_GREETER_SESSION(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDM_TYPE_GREETER_SESSION))
+#define GDM_IS_GREETER_SESSION_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GDM_TYPE_GREETER_SESSION))
+#define GDM_GREETER_SESSION_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GDM_TYPE_GREETER_SESSION, GdmGreeterSessionClass))
+
+typedef struct GdmGreeterSessionPrivate GdmGreeterSessionPrivate;
+
+typedef struct
+{
+ GObject parent;
+ GdmGreeterSessionPrivate *priv;
+} GdmGreeterSession;
+
+typedef struct
+{
+ GObjectClass parent_class;
+} GdmGreeterSessionClass;
+
+GType gdm_greeter_session_get_type (void);
+
+GdmGreeterSession * gdm_greeter_session_new (void);
+
+gboolean gdm_greeter_session_start (GdmGreeterSession *session,
+ GError **error);
+void gdm_greeter_session_stop (GdmGreeterSession *session);
+
+G_END_DECLS
+
+#endif /* __GDM_GREETER_SESSION_H */
diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c
index 73288023..67cdfa8a 100644
--- a/gui/simple-greeter/gdm-user-manager.c
+++ b/gui/simple-greeter/gdm-user-manager.c
@@ -34,7 +34,7 @@
#include <glib/gstdio.h>
#include <glib-object.h>
-#include <libgnomevfs/gnome-vfs-ops.h>
+#include <libgnomevfs/gnome-vfs.h>
#include "gdm-user-manager.h"
#include "gdm-user-private.h"
@@ -375,6 +375,10 @@ gdm_user_manager_init (GdmUserManager *manager)
int i;
const char *exclude_default[] = DEFAULT_EXCLUDE;
+ if (! gnome_vfs_initialized ()) {
+ gnome_vfs_init ();
+ }
+
manager->priv = GDM_USER_MANAGER_GET_PRIVATE (manager);
manager->priv->minimal_uid = DEFAULT_MINIMAL_UID;
diff --git a/gui/simple-greeter/greeter-main.c b/gui/simple-greeter/greeter-main.c
index afc9be19..520e8768 100644
--- a/gui/simple-greeter/greeter-main.c
+++ b/gui/simple-greeter/greeter-main.c
@@ -20,329 +20,24 @@
#include "config.h"
#include <stdlib.h>
-#include <libintl.h>
#include <locale.h>
-#include <string.h>
-#include <unistd.h>
-#include <signal.h>
-#include <errno.h>
+#include <glib.h>
#include <glib/gi18n.h>
#include <gtk/gtk.h>
-#define DBUS_API_SUBJECT_TO_CHANGE
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus-glib-lowlevel.h>
-#include <libgnomevfs/gnome-vfs-init.h>
-#include "gdm-common.h"
#include "gdm-log.h"
#include "gdm-settings-client.h"
#include "gdm-settings-keys.h"
-#include "gdm-greeter.h"
-#include "gdm-simple-greeter.h"
-
-#define SERVER_DBUS_PATH "/org/gnome/DisplayManager/GreeterServer"
-#define SERVER_DBUS_INTERFACE "org.gnome.DisplayManager.GreeterServer"
-
-#define GPM_DBUS_NAME "org.freedesktop.PowerManagement"
-#define GPM_DBUS_PATH "/org/freedesktop/PowerManagement"
-#define GPM_DBUS_INTERFACE "org.freedesktop.PowerManagement"
-
-static DBusGConnection *connection = NULL;
-static GdmGreeter *greeter = NULL;
-static DBusGProxy *server_proxy = NULL;
-
-static void
-on_info (DBusGProxy *proxy,
- const char *text,
- gpointer data)
-{
- g_debug ("GREETER INFO: %s", text);
-
- gdm_greeter_info (GDM_GREETER (greeter), text);
-}
-
-static void
-on_problem (DBusGProxy *proxy,
- const char *text,
- gpointer data)
-{
- g_debug ("GREETER PROBLEM: %s", text);
-
- gdm_greeter_problem (GDM_GREETER (greeter), text);
-}
-
-static void
-on_ready (DBusGProxy *proxy,
- gpointer data)
-{
- g_debug ("GREETER SERVER READY");
-
- gdm_greeter_ready (GDM_GREETER (greeter));
-}
-
-static void
-on_reset (DBusGProxy *proxy,
- gpointer data)
-{
- g_debug ("GREETER RESET");
-
- gdm_greeter_reset (GDM_GREETER (greeter));
-}
-
-static void
-on_info_query (DBusGProxy *proxy,
- const char *text,
- gpointer data)
-{
- g_debug ("GREETER Info query: %s", text);
-
- gdm_greeter_info_query (GDM_GREETER (greeter), text);
-}
-
-static void
-on_secret_info_query (DBusGProxy *proxy,
- const char *text,
- gpointer data)
-{
- g_debug ("GREETER Secret info query: %s", text);
-
- gdm_greeter_secret_info_query (GDM_GREETER (greeter), text);
-}
-
-static void
-on_begin_verification (GdmGreeter *greeter,
- const char *username,
- gpointer data)
-{
- gboolean res;
- GError *error;
-
- g_debug ("GREETER begin verification");
-
- error = NULL;
- res = dbus_g_proxy_call (server_proxy,
- "BeginVerification",
- &error,
- G_TYPE_STRING, username,
- G_TYPE_INVALID,
- G_TYPE_INVALID);
- if (! res) {
- g_warning ("Unable to send BeginVerification: %s", error->message);
- g_error_free (error);
- }
-}
-
-static void
-on_query_answer (GdmGreeter *greeter,
- const char *text,
- gpointer data)
-{
- gboolean res;
- GError *error;
-
- g_debug ("GREETER answer");
-
- error = NULL;
- res = dbus_g_proxy_call (server_proxy,
- "AnswerQuery",
- &error,
- G_TYPE_STRING, text,
- G_TYPE_INVALID,
- G_TYPE_INVALID);
- if (! res) {
- g_warning ("Unable to send AnswerQuery: %s", error->message);
- g_error_free (error);
- }
-}
-
-static void
-on_select_session (GdmGreeter *greeter,
- const char *text,
- gpointer data)
-{
- gboolean res;
- GError *error;
-
- g_debug ("GREETER session selected: %s", text);
-
- error = NULL;
- res = dbus_g_proxy_call (server_proxy,
- "SelectSession",
- &error,
- G_TYPE_STRING, text,
- G_TYPE_INVALID,
- G_TYPE_INVALID);
- if (! res) {
- g_warning ("Unable to send SelectSession: %s", error->message);
- g_error_free (error);
- }
-}
-
-static void
-on_select_language (GdmGreeter *greeter,
- const char *text,
- gpointer data)
-{
- gboolean res;
- GError *error;
-
- g_debug ("GREETER session selected: %s", text);
-
- error = NULL;
- res = dbus_g_proxy_call (server_proxy,
- "SelectLanguage",
- &error,
- G_TYPE_STRING, text,
- G_TYPE_INVALID,
- G_TYPE_INVALID);
- if (! res) {
- g_warning ("Unable to send SelectLanguage: %s", error->message);
- g_error_free (error);
- }
-}
-
-static void
-on_select_user (GdmGreeter *greeter,
- const char *text,
- gpointer data)
-{
- gboolean res;
- GError *error;
-
- g_debug ("GREETER user selected: %s", text);
-
- error = NULL;
- res = dbus_g_proxy_call (server_proxy,
- "SelectUser",
- &error,
- G_TYPE_STRING, text,
- G_TYPE_INVALID,
- G_TYPE_INVALID);
- if (! res) {
- g_warning ("Unable to send SelectUser: %s", error->message);
- g_error_free (error);
- }
-}
-
-static void
-on_select_hostname (GdmGreeter *greeter,
- const char *text,
- gpointer data)
-{
- gboolean res;
- GError *error;
-
- g_debug ("GREETER hostname selected: %s", text);
-
- error = NULL;
- res = dbus_g_proxy_call (server_proxy,
- "SelectHostname",
- &error,
- G_TYPE_STRING, text,
- G_TYPE_INVALID,
- G_TYPE_INVALID);
- if (! res) {
- g_warning ("Unable to send SelectHostname: %s", error->message);
- g_error_free (error);
- }
-}
-
-static void
-on_cancelled (GdmGreeter *greeter,
- gpointer data)
-{
- gboolean res;
- GError *error;
-
- g_debug ("GREETER cancelled");
-
- error = NULL;
- res = dbus_g_proxy_call (server_proxy,
- "Cancel",
- &error,
- G_TYPE_INVALID,
- G_TYPE_INVALID);
- if (! res) {
- g_warning ("Unable to send Cancelled: %s", error->message);
- g_error_free (error);
- }
-}
-
-static void
-on_disconnected (GdmGreeter *greeter,
- gpointer data)
-{
- gboolean res;
- GError *error;
-
- g_debug ("GREETER disconnected");
-
- error = NULL;
- res = dbus_g_proxy_call (server_proxy,
- "Disconnect",
- &error,
- G_TYPE_INVALID,
- G_TYPE_INVALID);
- if (! res) {
- g_warning ("Unable to send Disconnected: %s", error->message);
- g_error_free (error);
- }
-}
-
-static char *
-get_display_id (void)
-{
- gboolean res;
- GError *error;
- char *id;
-
- id = NULL;
- error = NULL;
- res = dbus_g_proxy_call (server_proxy,
- "GetDisplayId",
- &error,
- G_TYPE_INVALID,
- DBUS_TYPE_G_OBJECT_PATH, &id,
- G_TYPE_INVALID);
- if (! res) {
- g_warning ("Unable to GetDisplayId: %s", error->message);
- g_error_free (error);
- }
-
- return id;
-}
-
-static void
-proxy_destroyed (GObject *object,
- gpointer data)
-{
- g_debug ("GREETER Proxy disconnected");
-}
-
-static void
-activate_power_manager (void)
-{
- GError *error;
- gboolean res;
-
- g_debug ("Activating power management");
-
- error = NULL;
- res = g_spawn_command_line_async ("gnome-power-manager --no-daemon", &error);
- if (! res) {
- g_warning ("Unable to activate power management: %s", error->message);
- g_error_free (error);
- }
-}
+#include "gdm-greeter-session.h"
int
main (int argc, char *argv[])
{
- GError *error;
- const char *address;
- char *display_id;
+ GError *error;
+ GdmGreeterSession *session;
+ gboolean res;
bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
@@ -356,136 +51,34 @@ main (int argc, char *argv[])
exit (1);
}
- g_debug ("Greeter for display %s xauthority:%s", g_getenv ("DISPLAY"), g_getenv ("XAUTHORITY"));
-
- /*
- * gdm_common_atspi_launch () needs gdk initialized.
- * We cannot start gtk before the registry is running
- * because the atk-bridge will crash.
- */
- gdk_init (&argc, &argv);
- /*gdm_common_atspi_launch ();*/
- gtk_init (&argc, &argv);
- gnome_vfs_init ();
+ g_debug ("Greeter session for display %s xauthority:%s",
+ g_getenv ("DISPLAY"),
+ g_getenv ("XAUTHORITY"));
gdm_log_init ();
-
- /*gdm_common_log_set_debug (gdm_settings_client_get_bool (GDM_KEY_DEBUG));*/
gdm_log_set_debug (TRUE);
- address = g_getenv ("GDM_GREETER_DBUS_ADDRESS");
- if (address == NULL) {
- g_warning ("GDM_GREETER_DBUS_ADDRESS not set");
- exit (1);
- }
-
- g_debug ("GREETER connecting to address: %s", address);
+ gdk_init (&argc, &argv);
+ /*gdm_common_atspi_launch ();*/
+ gtk_init (&argc, &argv);
- error = NULL;
- connection = dbus_g_connection_open (address, &error);
- if (connection == NULL) {
- if (error != NULL) {
- g_warning ("error opening connection: %s", error->message);
- g_error_free (error);
- } else {
- g_warning ("Unable to open connection");
- }
+ session = gdm_greeter_session_new ();
+ if (session == NULL) {
+ g_critical ("Unable to create greeter session");
exit (1);
}
- g_debug ("GREETER creating proxy for peer: %s", SERVER_DBUS_PATH);
- server_proxy = dbus_g_proxy_new_for_peer (connection,
- SERVER_DBUS_PATH,
- SERVER_DBUS_INTERFACE);
- if (server_proxy == NULL) {
- g_warning ("Unable to create proxy for peer");
+ res = gdm_greeter_session_start (session, &error);
+ if (! res) {
+ g_warning ("Unable to start greeter session: %s", error->message);
+ g_error_free (error);
exit (1);
}
- g_signal_connect (server_proxy, "destroy", G_CALLBACK (proxy_destroyed), NULL);
-
- /* FIXME: not sure why introspection isn't working */
- dbus_g_proxy_add_signal (server_proxy, "InfoQuery", G_TYPE_STRING, G_TYPE_INVALID);
- dbus_g_proxy_add_signal (server_proxy, "SecretInfoQuery", G_TYPE_STRING, G_TYPE_INVALID);
- dbus_g_proxy_add_signal (server_proxy, "Info", G_TYPE_STRING, G_TYPE_INVALID);
- dbus_g_proxy_add_signal (server_proxy, "Problem", G_TYPE_STRING, G_TYPE_INVALID);
- dbus_g_proxy_add_signal (server_proxy, "Ready", G_TYPE_INVALID);
- dbus_g_proxy_add_signal (server_proxy, "Reset", G_TYPE_INVALID);
-
- dbus_g_proxy_connect_signal (server_proxy,
- "InfoQuery",
- G_CALLBACK (on_info_query),
- NULL,
- NULL);
- dbus_g_proxy_connect_signal (server_proxy,
- "SecretInfoQuery",
- G_CALLBACK (on_secret_info_query),
- NULL,
- NULL);
- dbus_g_proxy_connect_signal (server_proxy,
- "Info",
- G_CALLBACK (on_info),
- NULL,
- NULL);
- dbus_g_proxy_connect_signal (server_proxy,
- "Problem",
- G_CALLBACK (on_problem),
- NULL,
- NULL);
- dbus_g_proxy_connect_signal (server_proxy,
- "Ready",
- G_CALLBACK (on_ready),
- NULL,
- NULL);
- dbus_g_proxy_connect_signal (server_proxy,
- "Reset",
- G_CALLBACK (on_reset),
- NULL,
- NULL);
-
- display_id = get_display_id ();
- greeter = gdm_simple_greeter_new (display_id);
- g_free (display_id);
-
- g_signal_connect (greeter,
- "begin-verification",
- G_CALLBACK (on_begin_verification),
- NULL);
- g_signal_connect (greeter,
- "query-answer",
- G_CALLBACK (on_query_answer),
- NULL);
- g_signal_connect (greeter,
- "session-selected",
- G_CALLBACK (on_select_session),
- NULL);
- g_signal_connect (greeter,
- "language-selected",
- G_CALLBACK (on_select_language),
- NULL);
- g_signal_connect (greeter,
- "user-selected",
- G_CALLBACK (on_select_user),
- NULL);
- g_signal_connect (greeter,
- "hostname-selected",
- G_CALLBACK (on_select_hostname),
- NULL);
- g_signal_connect (greeter,
- "cancelled",
- G_CALLBACK (on_cancelled),
- NULL);
- g_signal_connect (greeter,
- "disconnected",
- G_CALLBACK (on_disconnected),
- NULL);
-
- activate_power_manager ();
-
gtk_main ();
- if (greeter != NULL) {
- g_object_unref (greeter);
+ if (session != NULL) {
+ g_object_unref (session);
}
return 0;