summaryrefslogtreecommitdiff
path: root/daemon
diff options
context:
space:
mode:
authorWilliam Jon McCann <mccann@jhu.edu>2007-07-24 14:28:45 +0000
committerWilliam Jon McCann <mccann@src.gnome.org>2007-07-24 14:28:45 +0000
commit466d7376ec05b05e82efb5c359006cfb225cf653 (patch)
tree91499185afb8145e11ed2f41acd0af09e96eff5e /daemon
parent6a71e2f569f1bec860d0967d1c91d87eb602c5c8 (diff)
downloadgdm-466d7376ec05b05e82efb5c359006cfb225cf653.tar.gz
Dogfood static display. Make static display work. Add a finished state to
2007-07-24 William Jon McCann <mccann@jhu.edu> * daemon/gdm-display.c: (finish_idle), (queue_finish), (slave_exited), (slave_died), (gdm_display_manage), (gdm_display_real_finish), (gdm_display_finish), (gdm_display_dispose), (gdm_display_class_init): * daemon/gdm-display.h: * daemon/gdm-manager.c: (load_static_displays_from_file): * daemon/gdm-product-display.c: (gdm_product_display_finish), (gdm_product_display_class_init): * daemon/gdm-simple-slave.c: (on_session_exited), (on_session_died), (on_opened), (create_new_session), (on_greeter_start), (on_greeter_stop), (on_greeter_user_selected), (on_greeter_cancel), (on_greeter_connected), (run_greeter), (gdm_simple_slave_finalize): * daemon/gdm-slave-proxy.c: (child_watch), (gdm_slave_proxy_dispose), (gdm_slave_proxy_class_init): * daemon/gdm-static-display.c: (gdm_static_display_finish), (gdm_static_display_class_init): * daemon/gdm-static-factory-display.c: (gdm_static_factory_display_finish), (gdm_static_factory_display_class_init): Dogfood static display. Make static display work. Add a finished state to the Display. Always restart static displays on finish. svn path=/branches/mccann-gobject/; revision=5085
Diffstat (limited to 'daemon')
-rw-r--r--daemon/gdm-display.c57
-rw-r--r--daemon/gdm-display.h5
-rw-r--r--daemon/gdm-manager.c3
-rw-r--r--daemon/gdm-product-display.c14
-rw-r--r--daemon/gdm-simple-slave.c205
-rw-r--r--daemon/gdm-slave-proxy.c78
-rw-r--r--daemon/gdm-static-display.c15
-rw-r--r--daemon/gdm-static-factory-display.c15
8 files changed, 279 insertions, 113 deletions
diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c
index a10136ec..902d599f 100644
--- a/daemon/gdm-display.c
+++ b/daemon/gdm-display.c
@@ -59,6 +59,7 @@ struct GdmDisplayPrivate
char *slave_command;
gboolean is_local;
+ guint finish_idle_id;
GdmSlaveProxy *slave_proxy;
DBusGConnection *connection;
@@ -201,12 +202,30 @@ gdm_display_get_number (GdmDisplay *display,
return TRUE;
}
+static gboolean
+finish_idle (GdmDisplay *display)
+{
+ gdm_display_finish (display);
+ display->priv->finish_idle_id = 0;
+ return FALSE;
+}
+
+static void
+queue_finish (GdmDisplay *display)
+{
+ if (display->priv->finish_idle_id == 0) {
+ display->priv->finish_idle_id = g_idle_add ((GSourceFunc)finish_idle, display);
+ }
+}
+
static void
slave_exited (GdmSlaveProxy *proxy,
int code,
GdmDisplay *display)
{
g_debug ("Slave exited: %d", code);
+
+ queue_finish (display);
}
static void
@@ -215,6 +234,8 @@ slave_died (GdmSlaveProxy *proxy,
GdmDisplay *display)
{
g_debug ("Slave died: %d", signum);
+
+ queue_finish (display);
}
static gboolean
@@ -259,7 +280,7 @@ gdm_display_manage (GdmDisplay *display)
g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
- g_debug ("Unmanaging display: %s", display->priv->id);
+ g_debug ("Managing display: %s", display->priv->id);
g_object_ref (display);
ret = GDM_DISPLAY_GET_CLASS (display)->manage (display);
@@ -269,6 +290,34 @@ gdm_display_manage (GdmDisplay *display)
}
static gboolean
+gdm_display_real_finish (GdmDisplay *display)
+{
+ g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
+
+ display->priv->status = GDM_DISPLAY_FINISHED;
+
+ g_debug ("GdmDisplay finish display");
+
+ return TRUE;
+}
+
+gboolean
+gdm_display_finish (GdmDisplay *display)
+{
+ gboolean ret;
+
+ g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
+
+ g_debug ("Finishing display: %s", display->priv->id);
+
+ g_object_ref (display);
+ ret = GDM_DISPLAY_GET_CLASS (display)->finish (display);
+ g_object_unref (display);
+
+ return ret;
+}
+
+static gboolean
gdm_display_real_unmanage (GdmDisplay *display)
{
g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
@@ -545,6 +594,11 @@ gdm_display_dispose (GObject *object)
display = GDM_DISPLAY (object);
+ if (display->priv->finish_idle_id > 0) {
+ g_source_remove (display->priv->finish_idle_id);
+ display->priv->finish_idle_id = 0;
+ }
+
g_debug ("Disposing display");
gdm_display_unmanage (display);
@@ -564,6 +618,7 @@ gdm_display_class_init (GdmDisplayClass *klass)
klass->create_authority = gdm_display_real_create_authority;
klass->manage = gdm_display_real_manage;
+ klass->finish = gdm_display_real_finish;
klass->unmanage = gdm_display_real_unmanage;
g_object_class_install_property (object_class,
diff --git a/daemon/gdm-display.h b/daemon/gdm-display.h
index fbf4aab4..220f18b8 100644
--- a/daemon/gdm-display.h
+++ b/daemon/gdm-display.h
@@ -38,7 +38,8 @@ typedef struct GdmDisplayPrivate GdmDisplayPrivate;
typedef enum {
GDM_DISPLAY_UNMANAGED,
- GDM_DISPLAY_MANAGED
+ GDM_DISPLAY_MANAGED,
+ GDM_DISPLAY_FINISHED
} GdmDisplayStatus;
typedef struct
@@ -54,6 +55,7 @@ typedef struct
/* methods */
gboolean (*create_authority) (GdmDisplay *display);
gboolean (*manage) (GdmDisplay *display);
+ gboolean (*finish) (GdmDisplay *display);
gboolean (*unmanage) (GdmDisplay *display);
} GdmDisplayClass;
@@ -74,6 +76,7 @@ char * gdm_display_get_user_auth (GdmDisplay *disp
gboolean gdm_display_create_authority (GdmDisplay *display);
gboolean gdm_display_manage (GdmDisplay *display);
+gboolean gdm_display_finish (GdmDisplay *display);
gboolean gdm_display_unmanage (GdmDisplay *display);
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
index 1b71f54f..71ae7e94 100644
--- a/daemon/gdm-manager.c
+++ b/daemon/gdm-manager.c
@@ -225,7 +225,8 @@ load_static_displays_from_file (GdmManager *manager)
GdmDisplay *display;
/* just load one for now */
- display = gdm_static_factory_display_new (0, manager->priv->display_store);
+ /*display = gdm_static_factory_display_new (0, manager->priv->display_store);*/
+ display = gdm_static_display_new (0);
if (display == NULL) {
g_warning ("Unable to create display: %d", 0);
diff --git a/daemon/gdm-product-display.c b/daemon/gdm-product-display.c
index b3ada8b6..206773e9 100644
--- a/daemon/gdm-product-display.c
+++ b/daemon/gdm-product-display.c
@@ -79,6 +79,19 @@ gdm_product_display_manage (GdmDisplay *display)
}
static gboolean
+gdm_product_display_finish (GdmDisplay *display)
+{
+ g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
+
+ GDM_DISPLAY_CLASS (gdm_product_display_parent_class)->finish (display);
+
+ /* when a product display is done it is done */
+ gdm_display_unmanage (display);
+
+ return TRUE;
+}
+
+static gboolean
gdm_product_display_unmanage (GdmDisplay *display)
{
g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
@@ -180,6 +193,7 @@ gdm_product_display_class_init (GdmProductDisplayClass *klass)
display_class->create_authority = gdm_product_display_create_authority;
display_class->manage = gdm_product_display_manage;
+ display_class->finish = gdm_product_display_finish;
display_class->unmanage = gdm_product_display_unmanage;
g_type_class_add_private (klass, sizeof (GdmProductDisplayPrivate));
diff --git a/daemon/gdm-simple-slave.c b/daemon/gdm-simple-slave.c
index ede205ad..a174baaa 100644
--- a/daemon/gdm-simple-slave.c
+++ b/daemon/gdm-simple-slave.c
@@ -78,6 +78,7 @@ struct GdmSimpleSlavePrivate
/* user selected */
char *selected_session;
char *selected_language;
+ char *selected_user;
GdmServer *server;
GdmGreeterServer *greeter_server;
@@ -373,32 +374,34 @@ gdm_simple_slave_exec_script (GdmSimpleSlave *slave,
}
static void
-on_session_started (GdmSession *session,
- GPid pid,
- GdmSimpleSlave *slave)
+on_session_started (GdmSession *session,
+ GPid pid,
+ GdmSimpleSlave *slave)
{
g_debug ("session started on pid %d\n", (int) pid);
g_signal_emit (slave, signals [SESSION_STARTED], 0, pid);
}
static void
-on_session_exited (GdmSession *session,
- int exit_code,
- GdmSimpleSlave *slave)
+on_session_exited (GdmSession *session,
+ int exit_code,
+ GdmSimpleSlave *slave)
{
g_debug ("session exited with code %d\n", exit_code);
- g_signal_emit (slave, signals [SESSION_EXITED], 0, exit_code);
+
+ gdm_slave_stopped (GDM_SLAVE (slave));
}
static void
-on_session_died (GdmSession *session,
- int signal_number,
- GdmSimpleSlave *slave)
+on_session_died (GdmSession *session,
+ int signal_number,
+ GdmSimpleSlave *slave)
{
g_debug ("session died with signal %d, (%s)",
signal_number,
g_strsignal (signal_number));
- g_signal_emit (slave, signals [SESSION_DIED], 0, signal_number);
+
+ gdm_slave_stopped (GDM_SLAVE (slave));
}
static gboolean
@@ -642,6 +645,91 @@ on_secret_info_query (GdmSession *session,
}
static void
+on_opened (GdmSession *session,
+ GdmSimpleSlave *slave)
+{
+ GError *error;
+ gboolean res;
+
+ g_debug ("session opened");
+ res = gdm_session_begin_verification (session,
+ slave->priv->selected_user,
+ &error);
+ if (! res) {
+ g_warning ("Unable to begin verification: %s", error->message);
+ g_error_free (error);
+ }
+}
+
+static void
+create_new_session (GdmSimpleSlave *slave)
+{
+ slave->priv->session = gdm_session_new ();
+
+ g_signal_connect (slave->priv->session,
+ "opened",
+ G_CALLBACK (on_opened),
+ slave);
+
+ g_signal_connect (slave->priv->session,
+ "info",
+ G_CALLBACK (on_info),
+ slave);
+
+ g_signal_connect (slave->priv->session,
+ "problem",
+ G_CALLBACK (on_problem),
+ slave);
+
+ g_signal_connect (slave->priv->session,
+ "info-query",
+ G_CALLBACK (on_info_query),
+ slave);
+
+ g_signal_connect (slave->priv->session,
+ "secret-info-query",
+ G_CALLBACK (on_secret_info_query),
+ slave);
+
+ g_signal_connect (slave->priv->session,
+ "user-verified",
+ G_CALLBACK (on_user_verified),
+ slave);
+
+ g_signal_connect (slave->priv->session,
+ "user-verification-error",
+ G_CALLBACK (on_user_verification_error),
+ slave);
+
+ g_signal_connect (slave->priv->session,
+ "session-started",
+ G_CALLBACK (on_session_started),
+ slave);
+ g_signal_connect (slave->priv->session,
+ "session-exited",
+ G_CALLBACK (on_session_exited),
+ slave);
+ g_signal_connect (slave->priv->session,
+ "session-died",
+ G_CALLBACK (on_session_died),
+ slave);
+}
+
+static void
+on_greeter_start (GdmGreeterProxy *greeter,
+ GdmSimpleSlave *slave)
+{
+ g_debug ("Greeter started");
+}
+
+static void
+on_greeter_stop (GdmGreeterProxy *greeter,
+ GdmSimpleSlave *slave)
+{
+ g_debug ("Greeter stopped");
+}
+
+static void
on_greeter_answer (GdmGreeterServer *greeter_server,
const char *text,
GdmSimpleSlave *slave)
@@ -668,6 +756,26 @@ on_greeter_language_selected (GdmGreeterServer *greeter_server,
}
static void
+on_greeter_user_selected (GdmGreeterServer *greeter_server,
+ const char *text,
+ GdmSimpleSlave *slave)
+{
+
+}
+
+static void
+on_greeter_cancel (GdmGreeterServer *greeter_server,
+ GdmSimpleSlave *slave)
+{
+ if (slave->priv->session != NULL) {
+ gdm_session_close (slave->priv->session);
+ g_object_unref (slave->priv->session);
+ }
+
+ create_new_session (slave);
+}
+
+static void
on_greeter_connected (GdmGreeterServer *greeter_server,
GdmSimpleSlave *slave)
{
@@ -681,7 +789,7 @@ on_greeter_connected (GdmGreeterServer *greeter_server,
gdm_session_open (slave->priv->session,
"gdm",
- NULL /* hostname */,
+ "" /* hostname */,
"/dev/console",
NULL);
@@ -698,6 +806,9 @@ run_greeter (GdmSimpleSlave *slave)
char *display_name;
char *display_device;
char *auth_file;
+ char *address;
+
+ g_debug ("Running greeter");
g_object_get (slave,
"display-is-local", &display_is_local,
@@ -739,50 +850,7 @@ run_greeter (GdmSimpleSlave *slave)
GDMCONFDIR"/Init",
"gdm");
- slave->priv->session = gdm_session_new ();
-
- g_signal_connect (slave->priv->session,
- "info",
- G_CALLBACK (on_info),
- slave);
-
- g_signal_connect (slave->priv->session,
- "problem",
- G_CALLBACK (on_problem),
- slave);
-
- g_signal_connect (slave->priv->session,
- "info-query",
- G_CALLBACK (on_info_query),
- slave);
-
- g_signal_connect (slave->priv->session,
- "secret-info-query",
- G_CALLBACK (on_secret_info_query),
- slave);
-
- g_signal_connect (slave->priv->session,
- "user-verified",
- G_CALLBACK (on_user_verified),
- slave);
-
- g_signal_connect (slave->priv->session,
- "user-verification-error",
- G_CALLBACK (on_user_verification_error),
- slave);
-
- g_signal_connect (slave->priv->session,
- "session-started",
- G_CALLBACK (on_session_started),
- slave);
- g_signal_connect (slave->priv->session,
- "session-exited",
- G_CALLBACK (on_session_exited),
- slave);
- g_signal_connect (slave->priv->session,
- "session-died",
- G_CALLBACK (on_session_died),
- slave);
+ create_new_session (slave);
slave->priv->greeter_server = gdm_greeter_server_new ();
g_signal_connect (slave->priv->greeter_server,
@@ -798,16 +866,35 @@ run_greeter (GdmSimpleSlave *slave)
G_CALLBACK (on_greeter_language_selected),
slave);
g_signal_connect (slave->priv->greeter_server,
+ "user-selected",
+ G_CALLBACK (on_greeter_user_selected),
+ slave);
+ g_signal_connect (slave->priv->greeter_server,
"connected",
G_CALLBACK (on_greeter_connected),
slave);
+ g_signal_connect (slave->priv->greeter_server,
+ "cancelled",
+ G_CALLBACK (on_greeter_cancel),
+ slave);
gdm_greeter_server_start (slave->priv->greeter_server);
- slave->priv->greeter = gdm_greeter_proxy_new (display_name,
- display_device);
+ address = gdm_greeter_server_get_address (slave->priv->greeter_server);
+
+ g_debug ("Creating greeter on %s %s", display_name, display_device);
+ slave->priv->greeter = gdm_greeter_proxy_new (display_name, display_device);
+ g_signal_connect (slave->priv->greeter,
+ "started",
+ G_CALLBACK (on_greeter_start),
+ slave);
+ g_signal_connect (slave->priv->greeter,
+ "stopped",
+ G_CALLBACK (on_greeter_stop),
+ slave);
g_object_set (slave->priv->greeter,
"x11-authority-file", auth_file,
NULL);
+ gdm_greeter_proxy_set_server_address (slave->priv->greeter, address);
gdm_greeter_proxy_start (slave->priv->greeter);
g_free (display_name);
@@ -1110,6 +1197,8 @@ gdm_simple_slave_finalize (GObject *object)
g_return_if_fail (simple_slave->priv != NULL);
+ gdm_simple_slave_stop (GDM_SLAVE (simple_slave));
+
G_OBJECT_CLASS (gdm_simple_slave_parent_class)->finalize (object);
}
diff --git a/daemon/gdm-slave-proxy.c b/daemon/gdm-slave-proxy.c
index a80ba4d9..329a4198 100644
--- a/daemon/gdm-slave-proxy.c
+++ b/daemon/gdm-slave-proxy.c
@@ -63,56 +63,12 @@ static void gdm_slave_proxy_finalize (GObject *object);
G_DEFINE_TYPE (GdmSlaveProxy, gdm_slave_proxy, G_TYPE_OBJECT)
-/* adapted from gspawn.c */
-static int
-wait_on_child (int pid)
-{
- int status;
-
- wait_again:
- if (waitpid (pid, &status, 0) < 0) {
- if (errno == EINTR) {
- goto wait_again;
- } else if (errno == ECHILD) {
- ; /* do nothing, child already reaped */
- } else {
- g_debug ("waitpid () should not fail in 'GdmSpawnProxy'");
- }
- }
-
- return status;
-}
-
-static void
-slave_died (GdmSlaveProxy *slave)
-{
- int exit_status;
-
- if (slave->priv->pid < 0) {
- return;
- }
-
- g_debug ("Waiting on process %d", slave->priv->pid);
- exit_status = wait_on_child (slave->priv->pid);
-
- if (WIFEXITED (exit_status) && (WEXITSTATUS (exit_status) != 0)) {
- g_debug ("Wait on child process failed");
- } else {
- /* exited normally */
- }
-
- g_spawn_close_pid (slave->priv->pid);
- slave->priv->pid = -1;
-
- g_debug ("Slave died");
-}
-
static void
child_watch (GPid pid,
int status,
GdmSlaveProxy *slave)
{
- g_debug ("child (pid:%d) done (%s:%d)",
+ g_debug ("slave (pid:%d) done (%s:%d)",
(int) pid,
WIFEXITED (status) ? "status"
: WIFSIGNALED (status) ? "signal"
@@ -120,16 +76,17 @@ child_watch (GPid pid,
WIFEXITED (status) ? WEXITSTATUS (status)
: WIFSIGNALED (status) ? WTERMSIG (status)
: -1);
- if (WIFEXITED (status)) {
+
+ g_spawn_close_pid (slave->priv->pid);
+ slave->priv->pid = -1;
+
+ if (WIFEXITED (status)) {
int code = WEXITSTATUS (status);
g_signal_emit (slave, signals [EXITED], 0, code);
} else if (WIFSIGNALED (status)) {
int num = WTERMSIG (status);
g_signal_emit (slave, signals [DIED], 0, num);
}
-
- g_spawn_close_pid (slave->priv->pid);
- slave->priv->pid = -1;
}
static gboolean
@@ -273,9 +230,9 @@ gdm_slave_proxy_set_property (GObject *object,
static void
gdm_slave_proxy_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
{
GdmSlaveProxy *self;
@@ -292,12 +249,29 @@ gdm_slave_proxy_get_property (GObject *object,
}
static void
+gdm_slave_proxy_dispose (GObject *object)
+{
+ GdmSlaveProxy *slave;
+
+ slave = GDM_SLAVE_PROXY (object);
+
+ g_debug ("Disposing slave proxy");
+ if (slave->priv->child_watch_id > 0) {
+ g_source_remove (slave->priv->child_watch_id);
+ slave->priv->child_watch_id = 0;
+ }
+
+ G_OBJECT_CLASS (gdm_slave_proxy_parent_class)->dispose (object);
+}
+
+static void
gdm_slave_proxy_class_init (GdmSlaveProxyClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->get_property = gdm_slave_proxy_get_property;
object_class->set_property = gdm_slave_proxy_set_property;
+ object_class->dispose = gdm_slave_proxy_dispose;
object_class->finalize = gdm_slave_proxy_finalize;
g_type_class_add_private (klass, sizeof (GdmSlaveProxyPrivate));
diff --git a/daemon/gdm-static-display.c b/daemon/gdm-static-display.c
index 600972ec..eb17bbb4 100644
--- a/daemon/gdm-static-display.c
+++ b/daemon/gdm-static-display.c
@@ -76,6 +76,20 @@ gdm_static_display_manage (GdmDisplay *display)
}
static gboolean
+gdm_static_display_finish (GdmDisplay *display)
+{
+ g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
+
+ GDM_DISPLAY_CLASS (gdm_static_display_parent_class)->finish (display);
+
+ /* restart static displays */
+ gdm_display_unmanage (display);
+ gdm_display_manage (display);
+
+ return TRUE;
+}
+
+static gboolean
gdm_static_display_unmanage (GdmDisplay *display)
{
g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
@@ -131,6 +145,7 @@ gdm_static_display_class_init (GdmStaticDisplayClass *klass)
display_class->create_authority = gdm_static_display_create_authority;
display_class->manage = gdm_static_display_manage;
+ display_class->finish = gdm_static_display_finish;
display_class->unmanage = gdm_static_display_unmanage;
g_type_class_add_private (klass, sizeof (GdmStaticDisplayPrivate));
diff --git a/daemon/gdm-static-factory-display.c b/daemon/gdm-static-factory-display.c
index a0820f0b..892278ce 100644
--- a/daemon/gdm-static-factory-display.c
+++ b/daemon/gdm-static-factory-display.c
@@ -143,6 +143,20 @@ gdm_static_factory_display_manage (GdmDisplay *display)
}
static gboolean
+gdm_static_factory_display_finish (GdmDisplay *display)
+{
+ g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
+
+ GDM_DISPLAY_CLASS (gdm_static_factory_display_parent_class)->finish (display);
+
+ /* restart static displays */
+ gdm_display_unmanage (display);
+ gdm_display_manage (display);
+
+ return TRUE;
+}
+
+static gboolean
gdm_static_factory_display_unmanage (GdmDisplay *display)
{
g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
@@ -236,6 +250,7 @@ gdm_static_factory_display_class_init (GdmStaticFactoryDisplayClass *klass)
display_class->create_authority = gdm_static_factory_display_create_authority;
display_class->manage = gdm_static_factory_display_manage;
+ display_class->finish = gdm_static_factory_display_finish;
display_class->unmanage = gdm_static_factory_display_unmanage;
g_object_class_install_property (object_class,