diff options
author | William Jon McCann <mccann@jhu.edu> | 2007-07-24 14:28:45 +0000 |
---|---|---|
committer | William Jon McCann <mccann@src.gnome.org> | 2007-07-24 14:28:45 +0000 |
commit | 466d7376ec05b05e82efb5c359006cfb225cf653 (patch) | |
tree | 91499185afb8145e11ed2f41acd0af09e96eff5e /daemon | |
parent | 6a71e2f569f1bec860d0967d1c91d87eb602c5c8 (diff) | |
download | gdm-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.c | 57 | ||||
-rw-r--r-- | daemon/gdm-display.h | 5 | ||||
-rw-r--r-- | daemon/gdm-manager.c | 3 | ||||
-rw-r--r-- | daemon/gdm-product-display.c | 14 | ||||
-rw-r--r-- | daemon/gdm-simple-slave.c | 205 | ||||
-rw-r--r-- | daemon/gdm-slave-proxy.c | 78 | ||||
-rw-r--r-- | daemon/gdm-static-display.c | 15 | ||||
-rw-r--r-- | daemon/gdm-static-factory-display.c | 15 |
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, |