diff options
-rw-r--r-- | ChangeLog | 41 | ||||
-rw-r--r-- | daemon/gdm-greeter-server.h | 1 | ||||
-rw-r--r-- | gui/simple-greeter/Makefile.am | 6 | ||||
-rw-r--r-- | gui/simple-greeter/gdm-greeter-client.c | 636 | ||||
-rw-r--r-- | gui/simple-greeter/gdm-greeter-client.h | 99 | ||||
-rw-r--r-- | gui/simple-greeter/gdm-greeter-session.c | 418 | ||||
-rw-r--r-- | gui/simple-greeter/gdm-greeter-session.h | 58 | ||||
-rw-r--r-- | gui/simple-greeter/gdm-user-manager.c | 6 | ||||
-rw-r--r-- | gui/simple-greeter/greeter-main.c | 447 |
9 files changed, 1283 insertions, 429 deletions
@@ -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; |