diff options
author | William Jon McCann <jmccann@redhat.com> | 2008-02-20 18:41:49 +0000 |
---|---|---|
committer | William Jon McCann <mccann@src.gnome.org> | 2008-02-20 18:41:49 +0000 |
commit | 9400160560215c509759efca6fb365f12e4a8bc5 (patch) | |
tree | 3653a68ebba12afe5864ddc8737fd1f491bda275 | |
parent | 7ded9b2049a472b9fb5f6f2f70e270e14fcee656 (diff) | |
download | gdm-9400160560215c509759efca6fb365f12e4a8bc5.tar.gz |
Add initial support for timed login.
2008-02-20 William Jon McCann <jmccann@redhat.com>
* common/gdm-settings-client.c: (gdm_settings_client_get_string):
* common/gdm-settings-keys.h:
* daemon/gdm-factory-slave.c: (on_greeter_begin_verification),
(on_greeter_begin_verification_for_user):
* daemon/gdm-greeter-server.c: (handle_begin_timed_login),
(greeter_handle_child_message), (do_introspect),
(gdm_greeter_server_class_init):
* daemon/gdm-greeter-server.h:
* daemon/gdm-product-slave.c: (on_relay_setup),
(on_relay_setup_for_user):
* daemon/gdm-session-direct.c: (gdm_session_direct_init),
(send_setup), (send_setup_for_user), (gdm_session_direct_setup),
(gdm_session_direct_setup_for_user),
(gdm_session_direct_set_property),
(gdm_session_direct_get_property), (gdm_session_direct_dispose),
(gdm_session_direct_class_init):
* daemon/gdm-session-relay.c: (send_dbus_string_string_signal),
(gdm_session_relay_setup), (gdm_session_relay_setup_for_user),
(do_introspect):
* daemon/gdm-session.c: (gdm_session_setup),
(gdm_session_setup_for_user):
* daemon/gdm-session.h:
* daemon/gdm-simple-slave.c: (on_greeter_begin_verification),
(on_greeter_begin_timed_login),
(on_greeter_begin_verification_for_user), (run_greeter):
* daemon/simple-slave-main.c: (main):
* daemon/test-session.c: (on_open):
* gui/simple-greeter/gdm-greeter-client.c:
(emit_string_signal_for_message),
(gdm_greeter_client_call_begin_timed_login):
* gui/simple-greeter/gdm-greeter-client.h:
* gui/simple-greeter/gdm-greeter-login-window.c:
(remove_timed_login_timeout), (timed_login_timer),
(restart_timed_login_timeout),
(on_login_button_clicked_answer_query),
(on_login_button_clicked_timed_login), (set_log_in_button_mode),
(switch_mode), (do_cancel), (reset_dialog),
(gdm_greeter_login_window_info_query),
(gdm_greeter_login_window_secret_info_query), (on_user_chosen),
(load_theme), (read_configuration),
(gdm_greeter_login_window_constructor),
(gdm_greeter_login_window_class_init),
(gdm_greeter_login_window_init):
* gui/simple-greeter/gdm-greeter-login-window.h:
* gui/simple-greeter/gdm-greeter-session.c: (on_begin_timed_login),
(toggle_login_window):
* gui/simple-greeter/gdm-user-chooser-dialog.c:
(gdm_user_chooser_dialog_set_show_other_user),
(gdm_user_chooser_dialog_set_show_guest_user),
(gdm_user_chooser_dialog_set_show_auto_user),
(gdm_user_chooser_dialog_init):
* gui/simple-greeter/gdm-user-chooser-dialog.h:
* gui/simple-greeter/gdm-user-chooser-widget.c: (add_user_other),
(add_user_guest), (add_user_auto), (remove_user_other),
(remove_user_guest), (remove_user_auto),
(gdm_user_chooser_widget_set_show_other_user),
(gdm_user_chooser_widget_set_show_guest_user),
(gdm_user_chooser_widget_set_show_auto_user),
(gdm_user_chooser_widget_constructor),
(gdm_user_chooser_widget_init):
* gui/simple-greeter/gdm-user-chooser-widget.h:
* gui/simple-greeter/greeter-main.c: (main):
* gui/simple-greeter/test-greeter-login-window.c: (main):
* gui/simple-greeter/test-user-chooser.c: (main):
Add initial support for timed login.
svn path=/trunk/; revision=5820
26 files changed, 592 insertions, 119 deletions
@@ -1,3 +1,71 @@ +2008-02-20 William Jon McCann <jmccann@redhat.com> + + * common/gdm-settings-client.c: (gdm_settings_client_get_string): + * common/gdm-settings-keys.h: + * daemon/gdm-factory-slave.c: (on_greeter_begin_verification), + (on_greeter_begin_verification_for_user): + * daemon/gdm-greeter-server.c: (handle_begin_timed_login), + (greeter_handle_child_message), (do_introspect), + (gdm_greeter_server_class_init): + * daemon/gdm-greeter-server.h: + * daemon/gdm-product-slave.c: (on_relay_setup), + (on_relay_setup_for_user): + * daemon/gdm-session-direct.c: (gdm_session_direct_init), + (send_setup), (send_setup_for_user), (gdm_session_direct_setup), + (gdm_session_direct_setup_for_user), + (gdm_session_direct_set_property), + (gdm_session_direct_get_property), (gdm_session_direct_dispose), + (gdm_session_direct_class_init): + * daemon/gdm-session-relay.c: (send_dbus_string_string_signal), + (gdm_session_relay_setup), (gdm_session_relay_setup_for_user), + (do_introspect): + * daemon/gdm-session.c: (gdm_session_setup), + (gdm_session_setup_for_user): + * daemon/gdm-session.h: + * daemon/gdm-simple-slave.c: (on_greeter_begin_verification), + (on_greeter_begin_timed_login), + (on_greeter_begin_verification_for_user), (run_greeter): + * daemon/simple-slave-main.c: (main): + * daemon/test-session.c: (on_open): + * gui/simple-greeter/gdm-greeter-client.c: + (emit_string_signal_for_message), + (gdm_greeter_client_call_begin_timed_login): + * gui/simple-greeter/gdm-greeter-client.h: + * gui/simple-greeter/gdm-greeter-login-window.c: + (remove_timed_login_timeout), (timed_login_timer), + (restart_timed_login_timeout), + (on_login_button_clicked_answer_query), + (on_login_button_clicked_timed_login), (set_log_in_button_mode), + (switch_mode), (do_cancel), (reset_dialog), + (gdm_greeter_login_window_info_query), + (gdm_greeter_login_window_secret_info_query), (on_user_chosen), + (load_theme), (read_configuration), + (gdm_greeter_login_window_constructor), + (gdm_greeter_login_window_class_init), + (gdm_greeter_login_window_init): + * gui/simple-greeter/gdm-greeter-login-window.h: + * gui/simple-greeter/gdm-greeter-session.c: (on_begin_timed_login), + (toggle_login_window): + * gui/simple-greeter/gdm-user-chooser-dialog.c: + (gdm_user_chooser_dialog_set_show_other_user), + (gdm_user_chooser_dialog_set_show_guest_user), + (gdm_user_chooser_dialog_set_show_auto_user), + (gdm_user_chooser_dialog_init): + * gui/simple-greeter/gdm-user-chooser-dialog.h: + * gui/simple-greeter/gdm-user-chooser-widget.c: (add_user_other), + (add_user_guest), (add_user_auto), (remove_user_other), + (remove_user_guest), (remove_user_auto), + (gdm_user_chooser_widget_set_show_other_user), + (gdm_user_chooser_widget_set_show_guest_user), + (gdm_user_chooser_widget_set_show_auto_user), + (gdm_user_chooser_widget_constructor), + (gdm_user_chooser_widget_init): + * gui/simple-greeter/gdm-user-chooser-widget.h: + * gui/simple-greeter/greeter-main.c: (main): + * gui/simple-greeter/test-greeter-login-window.c: (main): + * gui/simple-greeter/test-user-chooser.c: (main): + Add initial support for timed login. + 2008-02-20 Ray Strode <rstrode@redhat.com> * daemon/gdm-local-display-factory.c (create_display) diff --git a/common/gdm-settings-client.c b/common/gdm-settings-client.c index aa9eac53..face6b36 100644 --- a/common/gdm-settings-client.c +++ b/common/gdm-settings-client.c @@ -236,6 +236,8 @@ gdm_settings_client_get_string (const char *key, *value = g_strdup (str); } + ret = TRUE; + g_free (str); return ret; diff --git a/common/gdm-settings-keys.h b/common/gdm-settings-keys.h index 33df0dd3..036f161c 100644 --- a/common/gdm-settings-keys.h +++ b/common/gdm-settings-keys.h @@ -27,6 +27,9 @@ G_BEGIN_DECLS #define GDM_KEY_USER "daemon/User" #define GDM_KEY_GROUP "daemon/Group" +#define GDM_KEY_TIMED_LOGIN_ENABLE "daemon/TimedLoginEnable" +#define GDM_KEY_TIMED_LOGIN_USER "daemon/TimedLogin" +#define GDM_KEY_TIMED_LOGIN_DELAY "daemon/TimedLoginDelay" #define GDM_KEY_XDMCP "xdmcp/Enable" #define GDM_KEY_MAX_PENDING "xdmcp/MaxPending" diff --git a/daemon/gdm-factory-slave.c b/daemon/gdm-factory-slave.c index 8791d5b7..14a1a689 100644 --- a/daemon/gdm-factory-slave.c +++ b/daemon/gdm-factory-slave.c @@ -375,7 +375,8 @@ on_greeter_begin_verification (GdmGreeterServer *greeter_server, GdmFactorySlave *slave) { g_debug ("GdmFactorySlave: begin verification"); - gdm_session_setup (GDM_SESSION (slave->priv->session)); + gdm_session_setup (GDM_SESSION (slave->priv->session), + "gdm"); } static void @@ -385,6 +386,7 @@ on_greeter_begin_verification_for_user (GdmGreeterServer *greeter_server, { g_debug ("GdmFactorySlave: begin verification for user"); gdm_session_setup_for_user (GDM_SESSION (slave->priv->session), + "gdm", username); } diff --git a/daemon/gdm-greeter-server.c b/daemon/gdm-greeter-server.c index e1f672c3..b3ab8bf8 100644 --- a/daemon/gdm-greeter-server.c +++ b/daemon/gdm-greeter-server.c @@ -69,6 +69,7 @@ enum { }; enum { + BEGIN_TIMED_LOGIN, BEGIN_VERIFICATION, BEGIN_VERIFICATION_FOR_USER, QUERY_ANSWER, @@ -281,6 +282,23 @@ handle_begin_verification (GdmGreeterServer *greeter_server, return DBUS_HANDLER_RESULT_HANDLED; } +static DBusHandlerResult +handle_begin_timed_login (GdmGreeterServer *greeter_server, + DBusConnection *connection, + DBusMessage *message) +{ + DBusMessage *reply; + + g_debug ("GreeterServer: BeginTimedLogin"); + + reply = dbus_message_new_method_return (message); + dbus_connection_send (connection, reply, NULL); + dbus_message_unref (reply); + + g_signal_emit (greeter_server, signals [BEGIN_TIMED_LOGIN], 0); + + return DBUS_HANDLER_RESULT_HANDLED; +} static DBusHandlerResult handle_begin_verification_for_user (GdmGreeterServer *greeter_server, @@ -504,6 +522,8 @@ greeter_handle_child_message (DBusConnection *connection, return handle_begin_verification (greeter_server, connection, message); } else if (dbus_message_is_method_call (message, GDM_GREETER_SERVER_DBUS_INTERFACE, "BeginVerificationForUser")) { return handle_begin_verification_for_user (greeter_server, connection, message); + } else if (dbus_message_is_method_call (message, GDM_GREETER_SERVER_DBUS_INTERFACE, "BeginTimedLogin")) { + return handle_begin_timed_login (greeter_server, connection, message); } else if (dbus_message_is_method_call (message, GDM_GREETER_SERVER_DBUS_INTERFACE, "AnswerQuery")) { return handle_answer_query (greeter_server, connection, message); } else if (dbus_message_is_method_call (message, GDM_GREETER_SERVER_DBUS_INTERFACE, "SelectSession")) { @@ -549,6 +569,7 @@ do_introspect (DBusConnection *connection, xml = g_string_append (xml, " <interface name=\"org.gnome.DisplayManager.GreeterServer\">\n" " <method name=\"BeginVerification\">\n" + " <method name=\"BeginTimedLogin\">\n" " </method>\n" " <method name=\"BeginVerificationForUser\">\n" " <arg name=\"username\" direction=\"in\" type=\"s\"/>\n" @@ -967,6 +988,16 @@ gdm_greeter_server_class_init (GdmGreeterServerClass *klass) g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + signals [BEGIN_TIMED_LOGIN] = + g_signal_new ("begin-timed-login", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (GdmGreeterServerClass, begin_timed_login), + NULL, + NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 0); signals [BEGIN_VERIFICATION_FOR_USER] = g_signal_new ("begin-verification-for-user", G_OBJECT_CLASS_TYPE (object_class), diff --git a/daemon/gdm-greeter-server.h b/daemon/gdm-greeter-server.h index c37a43ab..7432df40 100644 --- a/daemon/gdm-greeter-server.h +++ b/daemon/gdm-greeter-server.h @@ -45,9 +45,10 @@ typedef struct { GObjectClass parent_class; + void (* begin_timed_login) (GdmGreeterServer *greeter_server); + void (* begin_verification) (GdmGreeterServer *greeter_server); void (* begin_verification_for_user)(GdmGreeterServer *greeter_server, const char *username); - void (* begin_verification) (GdmGreeterServer *greeter_server); void (* query_answer) (GdmGreeterServer *greeter_server, const char *text); void (* session_selected) (GdmGreeterServer *greeter_server, diff --git a/daemon/gdm-product-slave.c b/daemon/gdm-product-slave.c index f7991c2f..0430e059 100644 --- a/daemon/gdm-product-slave.c +++ b/daemon/gdm-product-slave.c @@ -547,9 +547,25 @@ static void on_relay_setup (GdmProductSlave *slave, DBusMessage *message) { - g_debug ("GdmProductSlave: Relay Setup"); + DBusError error; + const char *service_name; + dbus_bool_t res; - gdm_session_setup (GDM_SESSION (slave->priv->session)); + service_name = NULL; + + dbus_error_init (&error); + res = dbus_message_get_args (message, + &error, + DBUS_TYPE_STRING, &service_name, + DBUS_TYPE_INVALID); + if (res) { + g_debug ("GdmProductSlave: Relay Setup"); + gdm_session_setup (GDM_SESSION (slave->priv->session), + service_name); + } else { + g_warning ("Unable to get arguments: %s", error.message); + dbus_error_free (&error); + } } static void @@ -557,17 +573,24 @@ on_relay_setup_for_user (GdmProductSlave *slave, DBusMessage *message) { DBusError error; - const char *text; + const char *service_name; + const char *username; dbus_bool_t res; + username = NULL; + service_name = NULL; + dbus_error_init (&error); res = dbus_message_get_args (message, &error, - DBUS_TYPE_STRING, &text, + DBUS_TYPE_STRING, &service_name, + DBUS_TYPE_STRING, &username, DBUS_TYPE_INVALID); if (res) { g_debug ("GdmProductSlave: Relay SetupForUser"); - gdm_session_setup_for_user (GDM_SESSION (slave->priv->session), text); + gdm_session_setup_for_user (GDM_SESSION (slave->priv->session), + service_name, + username); } else { g_warning ("Unable to get arguments: %s", error.message); dbus_error_free (&error); diff --git a/daemon/gdm-session-direct.c b/daemon/gdm-session-direct.c index 2488668b..c16554ef 100644 --- a/daemon/gdm-session-direct.c +++ b/daemon/gdm-session-direct.c @@ -78,7 +78,6 @@ struct _GdmSessionDirectPrivate guint32 is_running : 1; /* object lifetime scope */ - char *service_name; char *display_name; char *display_hostname; char *display_device; @@ -92,7 +91,6 @@ struct _GdmSessionDirectPrivate enum { PROP_0, - PROP_SERVICE_NAME, PROP_DISPLAY_NAME, PROP_DISPLAY_HOSTNAME, PROP_DISPLAY_IS_LOCAL, @@ -1227,7 +1225,6 @@ gdm_session_direct_init (GdmSessionDirect *session) session->priv->session_pid = -1; session->priv->selected_session = g_strdup ("gnome.desktop"); - session->priv->service_name = g_strdup ("gdm"); session->priv->environment = g_hash_table_new_full (g_str_hash, g_str_equal, @@ -1343,7 +1340,8 @@ gdm_session_direct_open (GdmSession *session) } static void -send_setup (GdmSessionDirect *session) +send_setup (GdmSessionDirect *session, + const char *service_name) { DBusMessage *message; DBusMessageIter iter; @@ -1352,6 +1350,8 @@ send_setup (GdmSessionDirect *session) const char *display_hostname; const char *display_x11_authority_file; + g_assert (service_name != NULL); + if (session->priv->display_name != NULL) { display_name = session->priv->display_name; } else { @@ -1380,7 +1380,7 @@ send_setup (GdmSessionDirect *session) "Setup"); dbus_message_iter_init_append (message, &iter); - dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->service_name); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &service_name); dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_name); dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_device); dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_hostname); @@ -1394,7 +1394,8 @@ send_setup (GdmSessionDirect *session) } static void -send_setup_for_user (GdmSessionDirect *session) +send_setup_for_user (GdmSessionDirect *session, + const char *service_name) { DBusMessage *message; DBusMessageIter iter; @@ -1404,6 +1405,8 @@ send_setup_for_user (GdmSessionDirect *session) const char *display_x11_authority_file; const char *selected_user; + g_assert (service_name != NULL); + if (session->priv->display_name != NULL) { display_name = session->priv->display_name; } else { @@ -1437,7 +1440,7 @@ send_setup_for_user (GdmSessionDirect *session) "SetupForUser"); dbus_message_iter_init_append (message, &iter); - dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &session->priv->service_name); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &service_name); dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_name); dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_device); dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_hostname); @@ -1452,19 +1455,21 @@ send_setup_for_user (GdmSessionDirect *session) } static void -gdm_session_direct_setup (GdmSession *session) +gdm_session_direct_setup (GdmSession *session, + const char *service_name) { GdmSessionDirect *impl = GDM_SESSION_DIRECT (session); g_return_if_fail (session != NULL); g_return_if_fail (dbus_connection_get_is_connected (impl->priv->worker_connection)); - send_setup (impl); + send_setup (impl, service_name); } static void -gdm_session_direct_setup_for_user (GdmSession *session, - const char *username) +gdm_session_direct_setup_for_user (GdmSession *session, + const char *service_name, + const char *username) { GdmSessionDirect *impl = GDM_SESSION_DIRECT (session); @@ -1474,7 +1479,7 @@ gdm_session_direct_setup_for_user (GdmSession *session, gdm_session_direct_select_user (session, username); - send_setup_for_user (impl); + send_setup_for_user (impl, service_name); } static void @@ -1921,14 +1926,6 @@ gdm_session_direct_select_language (GdmSession *session, impl->priv->selected_language = g_strdup (text); } -static void -_gdm_session_direct_set_service_name (GdmSessionDirect *session, - const char *name) -{ - g_free (session->priv->service_name); - session->priv->service_name = g_strdup (name); -} - /* At some point we may want to read these right from * the slave but for now I don't want the dependency */ static void @@ -1990,9 +1987,6 @@ gdm_session_direct_set_property (GObject *object, self = GDM_SESSION_DIRECT (object); switch (prop_id) { - case PROP_SERVICE_NAME: - _gdm_session_direct_set_service_name (self, g_value_get_string (value)); - break; case PROP_DISPLAY_NAME: _gdm_session_direct_set_display_name (self, g_value_get_string (value)); break; @@ -2028,9 +2022,6 @@ gdm_session_direct_get_property (GObject *object, self = GDM_SESSION_DIRECT (object); switch (prop_id) { - case PROP_SERVICE_NAME: - g_value_set_string (value, self->priv->service_name); - break; case PROP_DISPLAY_NAME: g_value_set_string (value, self->priv->display_name); break; @@ -2066,9 +2057,6 @@ gdm_session_direct_dispose (GObject *object) gdm_session_direct_close (GDM_SESSION (session)); - g_free (session->priv->service_name); - session->priv->service_name = NULL; - g_free (session->priv->display_name); session->priv->display_name = NULL; @@ -2148,13 +2136,6 @@ gdm_session_direct_class_init (GdmSessionDirectClass *session_class) g_type_class_add_private (session_class, sizeof (GdmSessionDirectPrivate)); g_object_class_install_property (object_class, - PROP_SERVICE_NAME, - g_param_spec_string ("service-name", - "service name", - "service name", - "gdm", - G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); - g_object_class_install_property (object_class, PROP_DISPLAY_NAME, g_param_spec_string ("display-name", "display name", diff --git a/daemon/gdm-session-relay.c b/daemon/gdm-session-relay.c index bdce1603..7e7d3547 100644 --- a/daemon/gdm-session-relay.c +++ b/daemon/gdm-session-relay.c @@ -132,8 +132,36 @@ send_dbus_string_signal (GdmSessionRelay *session_relay, } static void +send_dbus_string_string_signal (GdmSessionRelay *session_relay, + const char *name, + const char *text1, + const char *text2) +{ + DBusMessage *message; + DBusMessageIter iter; + + g_return_if_fail (session_relay != NULL); + + g_debug ("GdmSessionRelay: sending signal %s", name); + message = dbus_message_new_signal (GDM_SESSION_RELAY_DBUS_PATH, + GDM_SESSION_RELAY_DBUS_INTERFACE, + name); + + dbus_message_iter_init_append (message, &iter); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &text1); + dbus_message_iter_init_append (message, &iter); + dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &text2); + + if (! send_dbus_message (session_relay->priv->session_connection, message)) { + g_debug ("GdmSessionRelay: Could not send %s signal", name); + } + + dbus_message_unref (message); +} + +static void send_dbus_void_signal (GdmSessionRelay *session_relay, - const char *name) + const char *name) { DBusMessage *message; @@ -166,18 +194,20 @@ gdm_session_relay_close (GdmSession *session) } static void -gdm_session_relay_setup (GdmSession *session) +gdm_session_relay_setup (GdmSession *session, + const char *service_name) { GdmSessionRelay *impl = GDM_SESSION_RELAY (session); - send_dbus_void_signal (impl, "Setup"); + send_dbus_string_signal (impl, "Setup", service_name); } static void gdm_session_relay_setup_for_user (GdmSession *session, + const char *service_name, const char *username) { GdmSessionRelay *impl = GDM_SESSION_RELAY (session); - send_dbus_string_signal (impl, "SetupForUser", username); + send_dbus_string_string_signal (impl, "SetupForUser", service_name, username); } static void @@ -742,15 +772,9 @@ do_introspect (DBusConnection *connection, " </signal>\n" " <signal name=\"Setup\">\n" " <arg name=\"service_name\" type=\"s\"/>\n" - " <arg name=\"x11_display_name\" type=\"s\"/>\n" - " <arg name=\"display_device\" type=\"s\"/>\n" - " <arg name=\"hostname\" type=\"s\"/>\n" " </signal>\n" " <signal name=\"SetupForUser\">\n" " <arg name=\"service_name\" type=\"s\"/>\n" - " <arg name=\"x11_display_name\" type=\"s\"/>\n" - " <arg name=\"display_device\" type=\"s\"/>\n" - " <arg name=\"hostname\" type=\"s\"/>\n" " <arg name=\"username\" type=\"s\"/>\n" " </signal>\n" " <signal name=\"Authenticate\">\n" diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c index 34ae9392..9834e7cf 100644 --- a/daemon/gdm-session.c +++ b/daemon/gdm-session.c @@ -93,20 +93,22 @@ gdm_session_close (GdmSession *session) } void -gdm_session_setup (GdmSession *session) +gdm_session_setup (GdmSession *session, + const char *service_name) { g_return_if_fail (GDM_IS_SESSION (session)); - GDM_SESSION_GET_IFACE (session)->setup (session); + GDM_SESSION_GET_IFACE (session)->setup (session, service_name); } void gdm_session_setup_for_user (GdmSession *session, + const char *service_name, const char *username) { g_return_if_fail (GDM_IS_SESSION (session)); - GDM_SESSION_GET_IFACE (session)->setup_for_user (session, username); + GDM_SESSION_GET_IFACE (session)->setup_for_user (session, service_name, username); } void diff --git a/daemon/gdm-session.h b/daemon/gdm-session.h index 579f2590..b8168c34 100644 --- a/daemon/gdm-session.h +++ b/daemon/gdm-session.h @@ -46,8 +46,10 @@ struct _GdmSessionIface /* Methods */ void (* open) (GdmSession *session); - void (* setup) (GdmSession *session); + void (* setup) (GdmSession *session, + const char *service_name); void (* setup_for_user) (GdmSession *session, + const char *service_name, const char *username); void (* reset) (GdmSession *session); void (* authenticate) (GdmSession *session); @@ -111,8 +113,10 @@ struct _GdmSessionIface GType gdm_session_get_type (void) G_GNUC_CONST; void gdm_session_open (GdmSession *session); -void gdm_session_setup (GdmSession *session); +void gdm_session_setup (GdmSession *session, + const char *service_name); void gdm_session_setup_for_user (GdmSession *session, + const char *service_name, const char *username); void gdm_session_reset (GdmSession *session); void gdm_session_authenticate (GdmSession *session); diff --git a/daemon/gdm-simple-slave.c b/daemon/gdm-simple-slave.c index bb85ad91..20813f85 100644 --- a/daemon/gdm-simple-slave.c +++ b/daemon/gdm-simple-slave.c @@ -42,6 +42,9 @@ #include "gdm-common.h" +#include "gdm-settings-client.h" +#include "gdm-settings-keys.h" + #include "gdm-simple-slave.h" #include "gdm-simple-slave-glue.h" @@ -557,7 +560,37 @@ on_greeter_begin_verification (GdmGreeterServer *greeter_server, GdmSimpleSlave *slave) { g_debug ("GdmSimpleSlave: begin verification"); - gdm_session_setup (GDM_SESSION (slave->priv->session)); + gdm_session_setup (GDM_SESSION (slave->priv->session), + "gdm"); +} + +static void +on_greeter_begin_timed_login (GdmGreeterServer *greeter_server, + GdmSimpleSlave *slave) +{ + char *username; + gboolean enabled; + gboolean res; + + g_debug ("GdmSimpleSlave: begin timed login"); + + enabled = FALSE; + res = gdm_settings_client_get_boolean (GDM_KEY_TIMED_LOGIN_ENABLE, &enabled); + if (! enabled) { + g_warning ("GdmSimpleSlave: timed login requested but disabled in configuration"); + return; + } + + username = NULL; + res = gdm_settings_client_get_string (GDM_KEY_TIMED_LOGIN_USER, &username); + if (username == NULL) { + g_warning ("GdmSimpleSlave: timed login requested but username not specified in configuration"); + return; + } + + gdm_session_setup_for_user (GDM_SESSION (slave->priv->session), + "gdm-autologin", + username); } static void @@ -567,6 +600,7 @@ on_greeter_begin_verification_for_user (GdmGreeterServer *greeter_server, { g_debug ("GdmSimpleSlave: begin verification"); gdm_session_setup_for_user (GDM_SESSION (slave->priv->session), + "gdm", username); } @@ -693,6 +727,10 @@ run_greeter (GdmSimpleSlave *slave) slave->priv->greeter_server = gdm_greeter_server_new (display_id); g_signal_connect (slave->priv->greeter_server, + "begin-timed-login", + G_CALLBACK (on_greeter_begin_timed_login), + slave); + g_signal_connect (slave->priv->greeter_server, "begin-verification", G_CALLBACK (on_greeter_begin_verification), slave); diff --git a/daemon/simple-slave-main.c b/daemon/simple-slave-main.c index 952b2275..cf0e9a34 100644 --- a/daemon/simple-slave-main.c +++ b/daemon/simple-slave-main.c @@ -44,6 +44,8 @@ #include "gdm-common.h" #include "gdm-simple-slave.h" +#include "gdm-settings-client.h" + static int gdm_return_code = 0; static DBusGConnection * @@ -188,6 +190,11 @@ main (int argc, exit (1); } + if (! gdm_settings_client_init (GDMCONFDIR "/gdm.schemas", "/")) { + g_critical ("Unable to initialize settings client"); + exit (1); + } + main_loop = g_main_loop_new (NULL, FALSE); signal_handler = gdm_signal_handler_new (); diff --git a/daemon/test-session.c b/daemon/test-session.c index d9dff3ec..fd927e76 100644 --- a/daemon/test-session.c +++ b/daemon/test-session.c @@ -38,7 +38,7 @@ on_open (GdmSession *session, { g_debug ("Got opened: calling setup..."); - gdm_session_setup (session); + gdm_session_setup (session, "gdm"); } static void diff --git a/gui/simple-greeter/gdm-greeter-client.c b/gui/simple-greeter/gdm-greeter-client.c index 4794b83f..f2565e78 100644 --- a/gui/simple-greeter/gdm-greeter-client.c +++ b/gui/simple-greeter/gdm-greeter-client.c @@ -115,7 +115,7 @@ emit_string_signal_for_message (GdmGreeterClient *client, DBUS_TYPE_INVALID); if (res) { - g_debug ("GdmGreeterClient: Recieved %s (%s)", name, text); + g_debug ("GdmGreeterClient: Received %s (%s)", name, text); g_signal_emit (client, gdm_greeter_client_signals[signal], @@ -291,6 +291,13 @@ send_dbus_void_method (DBusConnection *connection, } void +gdm_greeter_client_call_begin_timed_login (GdmGreeterClient *client) +{ + send_dbus_void_method (client->priv->connection, + "BeginTimedLogin"); +} + +void gdm_greeter_client_call_begin_verification (GdmGreeterClient *client) { send_dbus_void_method (client->priv->connection, diff --git a/gui/simple-greeter/gdm-greeter-client.h b/gui/simple-greeter/gdm-greeter-client.h index ed9f91a2..bf88d9a2 100644 --- a/gui/simple-greeter/gdm-greeter-client.h +++ b/gui/simple-greeter/gdm-greeter-client.h @@ -86,6 +86,7 @@ gboolean gdm_greeter_client_get_display_is_local (GdmGreeter char * gdm_greeter_client_call_get_display_id (GdmGreeterClient *client); +void gdm_greeter_client_call_begin_timed_login (GdmGreeterClient *client); void gdm_greeter_client_call_begin_verification (GdmGreeterClient *client); void gdm_greeter_client_call_begin_verification_for_user (GdmGreeterClient *client, const char *username); diff --git a/gui/simple-greeter/gdm-greeter-login-window.c b/gui/simple-greeter/gdm-greeter-login-window.c index 3cff65c8..6468ba3d 100644 --- a/gui/simple-greeter/gdm-greeter-login-window.c +++ b/gui/simple-greeter/gdm-greeter-login-window.c @@ -60,6 +60,9 @@ #include <polkit-gnome/polkit-gnome.h> #endif +#include "gdm-settings-client.h" +#include "gdm-settings-keys.h" + #include "gdm-greeter-login-window.h" #include "gdm-user-chooser-widget.h" @@ -86,6 +89,7 @@ #define GLADE_XML_FILE "gdm-greeter-login-window.glade" #define LOGO_KEY "/apps/gdm/simple-greeter/logo-icon-name" +#define TIMED_LOGIN_TIMEOUT_SEC 60 #define GDM_GREETER_LOGIN_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_GREETER_LOGIN_WINDOW, GdmGreeterLoginWindowPrivate)) @@ -94,6 +98,12 @@ enum { MODE_AUTHENTICATION }; +enum { + LOGIN_BUTTON_HIDDEN = 0, + LOGIN_BUTTON_ANSWER_QUERY, + LOGIN_BUTTON_TIMED_LOGIN +}; + struct GdmGreeterLoginWindowPrivate { GladeXML *xml; @@ -101,7 +111,13 @@ struct GdmGreeterLoginWindowPrivate gboolean display_is_local; char *timeformat; + gboolean timed_login_enabled; + guint timed_login_delay; + guint timed_login_timeout_id; + guint animation_timeout_id; + + guint login_button_handler_id; }; enum { @@ -110,6 +126,7 @@ enum { }; enum { + BEGIN_TIMED_LOGIN, BEGIN_VERIFICATION, BEGIN_VERIFICATION_FOR_USER, QUERY_ANSWER, @@ -174,7 +191,6 @@ set_focus (GdmGreeterLoginWindow *login_window) } } - static void set_message (GdmGreeterLoginWindow *login_window, const char *text) @@ -186,6 +202,40 @@ set_message (GdmGreeterLoginWindow *login_window, } static void +remove_timed_login_timeout (GdmGreeterLoginWindow *login_window) +{ + if (login_window->priv->timed_login_timeout_id > 0) { + g_source_remove (login_window->priv->timed_login_timeout_id); + login_window->priv->timed_login_timeout_id = 0; + } +} + +static gboolean +timed_login_timer (GdmGreeterLoginWindow *login_window) +{ + set_sensitive (login_window, FALSE); + set_message (login_window, _("Automatically logging in...")); + + g_debug ("GdmGreeterLoginWindow: emitting begin-timed_login"); + g_signal_emit (login_window, signals[BEGIN_TIMED_LOGIN], 0); + login_window->priv->timed_login_timeout_id = 0; + + return FALSE; +} + +static void +restart_timed_login_timeout (GdmGreeterLoginWindow *login_window) +{ + remove_timed_login_timeout (login_window); + + if (login_window->priv->timed_login_enabled) { + login_window->priv->timed_login_timeout_id = g_timeout_add_seconds (login_window->priv->timed_login_delay, + (GSourceFunc)timed_login_timer, + login_window); + } +} + +static void show_widget (GdmGreeterLoginWindow *login_window, const char *name, gboolean visible) @@ -228,6 +278,65 @@ get_show_restart_buttons (GdmGreeterLoginWindow *login_window) } static void +on_login_button_clicked_answer_query (GtkButton *button, + GdmGreeterLoginWindow *login_window) +{ + GtkWidget *entry; + const char *text; + + set_busy (login_window); + set_sensitive (login_window, FALSE); + + entry = glade_xml_get_widget (login_window->priv->xml, "auth-prompt-entry"); + text = gtk_entry_get_text (GTK_ENTRY (entry)); + + g_signal_emit (login_window, signals[QUERY_ANSWER], 0, text); +} + +static void +on_login_button_clicked_timed_login (GtkButton *button, + GdmGreeterLoginWindow *login_window) +{ + set_busy (login_window); + set_sensitive (login_window, FALSE); + + g_signal_emit (login_window, signals[BEGIN_TIMED_LOGIN], 0); +} + +static void +set_log_in_button_mode (GdmGreeterLoginWindow *login_window, + int mode) +{ + GtkWidget *button; + + button = glade_xml_get_widget (login_window->priv->xml, "log-in-button"); + gtk_widget_grab_default (button); + + /* disconnect any signals */ + if (login_window->priv->login_button_handler_id > 0) { + g_signal_handler_disconnect (button, login_window->priv->login_button_handler_id); + login_window->priv->login_button_handler_id = 0; + } + + switch (mode) { + case LOGIN_BUTTON_HIDDEN: + gtk_widget_hide (button); + break; + case LOGIN_BUTTON_ANSWER_QUERY: + login_window->priv->login_button_handler_id = g_signal_connect (button, "clicked", G_CALLBACK (on_login_button_clicked_answer_query), login_window); + gtk_widget_show (button); + break; + case LOGIN_BUTTON_TIMED_LOGIN: + login_window->priv->login_button_handler_id = g_signal_connect (button, "clicked", G_CALLBACK (on_login_button_clicked_timed_login), login_window); + gtk_widget_show (button); + break; + default: + g_assert_not_reached (); + break; + } +} + +static void switch_mode (GdmGreeterLoginWindow *login_window, int number) { @@ -239,11 +348,14 @@ switch_mode (GdmGreeterLoginWindow *login_window, /* FIXME: do animation */ default_name = NULL; + restart_timed_login_timeout (login_window); + show_restart_shutdown = get_show_restart_buttons (login_window); switch (number) { case MODE_SELECTION: - show_widget (login_window, "log-in-button", FALSE); + set_log_in_button_mode (login_window, LOGIN_BUTTON_HIDDEN); + show_widget (login_window, "cancel-button", FALSE); show_widget (login_window, "shutdown-button", login_window->priv->display_is_local && show_restart_shutdown); @@ -255,7 +367,6 @@ switch_mode (GdmGreeterLoginWindow *login_window, default_name = NULL; break; case MODE_AUTHENTICATION: - show_widget (login_window, "log-in-button", TRUE); show_widget (login_window, "cancel-button", TRUE); show_widget (login_window, "shutdown-button", FALSE); show_widget (login_window, "restart-button", FALSE); @@ -349,6 +460,7 @@ do_cancel (GdmGreeterLoginWindow *login_window) switch_mode (login_window, MODE_SELECTION); set_busy (login_window); set_sensitive (login_window, FALSE); + set_message (login_window, ""); g_signal_emit (login_window, signals[CANCELLED], 0); @@ -366,6 +478,7 @@ reset_dialog (GdmGreeterLoginWindow *login_window) entry = glade_xml_get_widget (GDM_GREETER_LOGIN_WINDOW (login_window)->priv->xml, "auth-prompt-entry"); gtk_entry_set_text (GTK_ENTRY (entry), ""); gtk_entry_set_visibility (GTK_ENTRY (entry), TRUE); + set_message (login_window, ""); label = glade_xml_get_widget (GDM_GREETER_LOGIN_WINDOW (login_window)->priv->xml, "auth-prompt-label"); gtk_label_set_text (GTK_LABEL (label), ""); @@ -379,6 +492,8 @@ reset_dialog (GdmGreeterLoginWindow *login_window) set_sensitive (login_window, TRUE); set_ready (login_window); set_focus (GDM_GREETER_LOGIN_WINDOW (login_window)); + + restart_timed_login_timeout (login_window); } gboolean @@ -443,6 +558,7 @@ gdm_greeter_login_window_info_query (GdmGreeterLoginWindow *login_window, entry = glade_xml_get_widget (GDM_GREETER_LOGIN_WINDOW (login_window)->priv->xml, "auth-prompt-entry"); gtk_entry_set_text (GTK_ENTRY (entry), ""); gtk_entry_set_visibility (GTK_ENTRY (entry), TRUE); + set_log_in_button_mode (login_window, LOGIN_BUTTON_ANSWER_QUERY); label = glade_xml_get_widget (GDM_GREETER_LOGIN_WINDOW (login_window)->priv->xml, "auth-prompt-label"); gtk_label_set_text (GTK_LABEL (label), text); @@ -467,6 +583,7 @@ gdm_greeter_login_window_secret_info_query (GdmGreeterLoginWindow *login_window, entry = glade_xml_get_widget (GDM_GREETER_LOGIN_WINDOW (login_window)->priv->xml, "auth-prompt-entry"); gtk_entry_set_text (GTK_ENTRY (entry), ""); gtk_entry_set_visibility (GTK_ENTRY (entry), FALSE); + set_log_in_button_mode (login_window, LOGIN_BUTTON_ANSWER_QUERY); label = glade_xml_get_widget (GDM_GREETER_LOGIN_WINDOW (login_window)->priv->xml, "auth-prompt-label"); gtk_label_set_text (GTK_LABEL (label), text); @@ -527,22 +644,6 @@ gdm_greeter_login_window_get_property (GObject *object, } static void -log_in_button_clicked (GtkButton *button, - GdmGreeterLoginWindow *login_window) -{ - GtkWidget *entry; - const char *text; - - set_busy (login_window); - set_sensitive (login_window, FALSE); - - entry = glade_xml_get_widget (login_window->priv->xml, "auth-prompt-entry"); - text = gtk_entry_get_text (GTK_ENTRY (entry)); - - g_signal_emit (login_window, signals[QUERY_ANSWER], 0, text); -} - -static void suspend_button_clicked (GtkButton *button, GdmGreeterLoginWindow *login_window) { @@ -841,6 +942,10 @@ on_user_chosen (GdmUserChooserWidget *user_chooser, g_signal_emit (login_window, signals[BEGIN_VERIFICATION], 0); } else if (strcmp (user_name, GDM_USER_CHOOSER_USER_GUEST) == 0) { /* FIXME: handle guest account stuff */ + } else if (strcmp (user_name, GDM_USER_CHOOSER_USER_AUTO) == 0) { + /* just wait for the user to select language and stuff */ + set_log_in_button_mode (login_window, LOGIN_BUTTON_TIMED_LOGIN); + set_message (login_window, _("Select language and click Log In")); } else { g_signal_emit (login_window, signals[BEGIN_VERIFICATION_FOR_USER], 0, user_name); } @@ -1058,9 +1163,9 @@ load_theme (GdmGreeterLoginWindow *login_window) gdm_user_chooser_widget_set_show_only_chosen (GDM_USER_CHOOSER_WIDGET (login_window->priv->user_chooser), TRUE); - /* FIXME: set from gconf */ - gdm_user_chooser_widget_set_show_other_user (GDM_USER_CHOOSER_WIDGET (login_window->priv->user_chooser), TRUE); - gdm_user_chooser_widget_set_show_guest_user (GDM_USER_CHOOSER_WIDGET (login_window->priv->user_chooser), TRUE); + if (login_window->priv->timed_login_enabled) { + gdm_user_chooser_widget_set_show_auto_user (GDM_USER_CHOOSER_WIDGET (login_window->priv->user_chooser), TRUE); + } g_signal_connect (login_window->priv->user_chooser, "activated", @@ -1076,10 +1181,6 @@ load_theme (GdmGreeterLoginWindow *login_window) button = glade_xml_get_widget (login_window->priv->xml, "suspend-button"); g_signal_connect (button, "clicked", G_CALLBACK (suspend_button_clicked), login_window); - button = glade_xml_get_widget (login_window->priv->xml, "log-in-button"); - gtk_widget_grab_default (button); - g_signal_connect (button, "clicked", G_CALLBACK (log_in_button_clicked), login_window); - button = glade_xml_get_widget (login_window->priv->xml, "cancel-button"); g_signal_connect (button, "clicked", G_CALLBACK (cancel_button_clicked), login_window); @@ -1215,6 +1316,49 @@ gdm_greeter_login_window_size_allocate (GtkWidget *widget, GTK_WIDGET_CLASS (gdm_greeter_login_window_parent_class)->size_allocate (widget, allocation); } +static void +read_configuration (GdmGreeterLoginWindow *login_window) +{ + gboolean res; + int delay; + char *username; + + g_debug ("GdmGreeterLoginWindow: reading system configuration"); + + res = gdm_settings_client_get_boolean (GDM_KEY_TIMED_LOGIN_ENABLE, + &login_window->priv->timed_login_enabled); + if (! res) { + g_warning ("Unable to read configuration for %s", GDM_KEY_TIMED_LOGIN_ENABLE); + } + g_debug ("GdmGreeterLoginWindow: TimedLoginEnable=%s", + login_window->priv->timed_login_enabled ? "true" : "false"); + + /* treat failures here as disabling */ + username = NULL; + res = gdm_settings_client_get_string (GDM_KEY_TIMED_LOGIN_USER, &username); + if (! res) { + g_warning ("Unable to read configuration for %s", GDM_KEY_TIMED_LOGIN_USER); + login_window->priv->timed_login_enabled = FALSE; + } else { + if (username == NULL) { + login_window->priv->timed_login_enabled = FALSE; + } + } + g_debug ("GdmGreeterLoginWindow: TimedLogin=%s", username); + g_free (username); + + delay = -1; + res = gdm_settings_client_get_int (GDM_KEY_TIMED_LOGIN_DELAY, &delay); + if (! res) { + g_warning ("Unable to read configuration for %s", GDM_KEY_TIMED_LOGIN_DELAY); + } else { + if (delay >= 0) { + login_window->priv->timed_login_delay = delay; + } + } + g_debug ("GdmGreeterLoginWindow: TimedLoginDelay=%d", delay); +} + static GObject * gdm_greeter_login_window_constructor (GType type, guint n_construct_properties, @@ -1227,6 +1371,7 @@ gdm_greeter_login_window_constructor (GType type, construct_properties)); + read_configuration (login_window); load_theme (login_window); return G_OBJECT (login_window); @@ -1247,6 +1392,16 @@ gdm_greeter_login_window_class_init (GdmGreeterLoginWindowClass *klass) widget_class->size_request = gdm_greeter_login_window_size_request; widget_class->size_allocate = gdm_greeter_login_window_size_allocate; + signals [BEGIN_TIMED_LOGIN] = + g_signal_new ("begin-timed_login", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GdmGreeterLoginWindowClass, begin_timed_login), + NULL, + NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 0); signals [BEGIN_VERIFICATION] = g_signal_new ("begin-verification", G_TYPE_FROM_CLASS (object_class), @@ -1323,6 +1478,9 @@ gdm_greeter_login_window_init (GdmGreeterLoginWindow *login_window) { login_window->priv = GDM_GREETER_LOGIN_WINDOW_GET_PRIVATE (login_window); + login_window->priv->timed_login_enabled = FALSE; + login_window->priv->timed_login_delay = TIMED_LOGIN_TIMEOUT_SEC; + gtk_window_set_title (GTK_WINDOW (login_window), _("Login Window")); gtk_window_set_opacity (GTK_WINDOW (login_window), 0.85); gtk_window_set_position (GTK_WINDOW (login_window), GTK_WIN_POS_CENTER_ALWAYS); diff --git a/gui/simple-greeter/gdm-greeter-login-window.h b/gui/simple-greeter/gdm-greeter-login-window.h index e06095df..94d969ee 100644 --- a/gui/simple-greeter/gdm-greeter-login-window.h +++ b/gui/simple-greeter/gdm-greeter-login-window.h @@ -1,6 +1,7 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- * * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu> + * Copyright (C) 2008 Red Hat, Inc. * * 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 @@ -45,6 +46,7 @@ typedef struct GtkWindowClass parent_class; /* signals */ + void (* begin_timed_login) (GdmGreeterLoginWindow *login_window); void (* begin_verification) (GdmGreeterLoginWindow *login_window); void (* begin_verification_for_user) (GdmGreeterLoginWindow *login_window, const char *username); diff --git a/gui/simple-greeter/gdm-greeter-session.c b/gui/simple-greeter/gdm-greeter-session.c index 63ebc191..c285c61d 100644 --- a/gui/simple-greeter/gdm-greeter-session.c +++ b/gui/simple-greeter/gdm-greeter-session.c @@ -158,6 +158,13 @@ on_secret_info_query (GdmGreeterClient *client, } static void +on_begin_timed_login (GdmGreeterLoginWindow *login_window, + GdmGreeterSession *session) +{ + gdm_greeter_client_call_begin_timed_login (session->priv->client); +} + +static void on_begin_verification (GdmGreeterLoginWindow *login_window, GdmGreeterSession *session) { @@ -261,6 +268,10 @@ toggle_login_window (GdmSessionManager *manager, session->priv->login_window = gdm_greeter_login_window_new (is_local); g_signal_connect (session->priv->login_window, + "begin-timed-login", + G_CALLBACK (on_begin_timed_login), + session); + g_signal_connect (session->priv->login_window, "begin-verification", G_CALLBACK (on_begin_verification), session); diff --git a/gui/simple-greeter/gdm-user-chooser-dialog.c b/gui/simple-greeter/gdm-user-chooser-dialog.c index 48d90ca9..11459c2b 100644 --- a/gui/simple-greeter/gdm-user-chooser-dialog.c +++ b/gui/simple-greeter/gdm-user-chooser-dialog.c @@ -62,6 +62,33 @@ gdm_user_chooser_dialog_get_chosen_user_name (GdmUserChooserDialog *dialog) return user_name; } +void +gdm_user_chooser_dialog_set_show_other_user (GdmUserChooserDialog *dialog, + gboolean show_user) +{ + g_return_if_fail (GDM_IS_USER_CHOOSER_DIALOG (dialog)); + + gdm_user_chooser_widget_set_show_other_user (GDM_USER_CHOOSER_WIDGET (dialog->priv->chooser_widget), show_user); +} + +void +gdm_user_chooser_dialog_set_show_guest_user (GdmUserChooserDialog *dialog, + gboolean show_user) +{ + g_return_if_fail (GDM_IS_USER_CHOOSER_DIALOG (dialog)); + + gdm_user_chooser_widget_set_show_guest_user (GDM_USER_CHOOSER_WIDGET (dialog->priv->chooser_widget), show_user); +} + +void +gdm_user_chooser_dialog_set_show_auto_user (GdmUserChooserDialog *dialog, + gboolean show_user) +{ + g_return_if_fail (GDM_IS_USER_CHOOSER_DIALOG (dialog)); + + gdm_user_chooser_widget_set_show_auto_user (GDM_USER_CHOOSER_WIDGET (dialog->priv->chooser_widget), show_user); +} + static void gdm_user_chooser_dialog_set_property (GObject *object, guint prop_id, @@ -139,8 +166,7 @@ gdm_user_chooser_dialog_init (GdmUserChooserDialog *dialog) dialog->priv = GDM_USER_CHOOSER_DIALOG_GET_PRIVATE (dialog); dialog->priv->chooser_widget = gdm_user_chooser_widget_new (); - gdm_user_chooser_widget_set_show_other_user (GDM_USER_CHOOSER_WIDGET (dialog->priv->chooser_widget), TRUE); - gdm_user_chooser_widget_set_show_guest_user (GDM_USER_CHOOSER_WIDGET (dialog->priv->chooser_widget), TRUE); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), dialog->priv->chooser_widget); gtk_dialog_add_buttons (GTK_DIALOG (dialog), diff --git a/gui/simple-greeter/gdm-user-chooser-dialog.h b/gui/simple-greeter/gdm-user-chooser-dialog.h index a38dfa5c..a70e1023 100644 --- a/gui/simple-greeter/gdm-user-chooser-dialog.h +++ b/gui/simple-greeter/gdm-user-chooser-dialog.h @@ -37,7 +37,7 @@ typedef struct GdmUserChooserDialogPrivate GdmUserChooserDialogPrivate; typedef struct { - GtkDialog parent; + GtkDialog parent; GdmUserChooserDialogPrivate *priv; } GdmUserChooserDialog; @@ -51,7 +51,12 @@ GType gdm_user_chooser_dialog_get_type (void) GtkWidget * gdm_user_chooser_dialog_new (void); char * gdm_user_chooser_dialog_get_chosen_user_name (GdmUserChooserDialog *dialog); - +void gdm_user_chooser_dialog_set_show_other_user (GdmUserChooserDialog *dialog, + gboolean show); +void gdm_user_chooser_dialog_set_show_guest_user (GdmUserChooserDialog *dialog, + gboolean show); +void gdm_user_chooser_dialog_set_show_auto_user (GdmUserChooserDialog *dialog, + gboolean show); G_END_DECLS #endif /* __GDM_USER_CHOOSER_DIALOG_H */ diff --git a/gui/simple-greeter/gdm-user-chooser-widget.c b/gui/simple-greeter/gdm-user-chooser-widget.c index c9c31591..46884118 100644 --- a/gui/simple-greeter/gdm-user-chooser-widget.c +++ b/gui/simple-greeter/gdm-user-chooser-widget.c @@ -58,6 +58,7 @@ struct GdmUserChooserWidgetPrivate guint show_other_user : 1; guint show_guest_user : 1; + guint show_auto_user : 1; }; enum { @@ -70,6 +71,66 @@ static void gdm_user_chooser_widget_finalize (GObject * G_DEFINE_TYPE (GdmUserChooserWidget, gdm_user_chooser_widget, GDM_TYPE_CHOOSER_WIDGET) +static void +add_user_other (GdmUserChooserWidget *widget) +{ + gdm_chooser_widget_add_item (GDM_CHOOSER_WIDGET (widget), + GDM_USER_CHOOSER_USER_OTHER, + widget->priv->stock_person_pixbuf, + _("Other..."), + _("Choose a different account"), + 0, + FALSE, + TRUE); +} + +static void +add_user_guest (GdmUserChooserWidget *widget) +{ + gdm_chooser_widget_add_item (GDM_CHOOSER_WIDGET (widget), + GDM_USER_CHOOSER_USER_GUEST, + widget->priv->stock_person_pixbuf, + _("Guest"), + _("Login as a temporary guest"), + 0, + FALSE, + TRUE); +} + +static void +add_user_auto (GdmUserChooserWidget *widget) +{ + gdm_chooser_widget_add_item (GDM_CHOOSER_WIDGET (widget), + GDM_USER_CHOOSER_USER_AUTO, + widget->priv->stock_person_pixbuf, + _("Automatic Login"), + _("Automatically login to the system after selecting options"), + 0, + FALSE, + TRUE); +} + +static void +remove_user_other (GdmUserChooserWidget *widget) +{ + gdm_chooser_widget_remove_item (GDM_CHOOSER_WIDGET (widget), + GDM_USER_CHOOSER_USER_OTHER); +} + +static void +remove_user_guest (GdmUserChooserWidget *widget) +{ + gdm_chooser_widget_remove_item (GDM_CHOOSER_WIDGET (widget), + GDM_USER_CHOOSER_USER_GUEST); +} + +static void +remove_user_auto (GdmUserChooserWidget *widget) +{ + gdm_chooser_widget_remove_item (GDM_CHOOSER_WIDGET (widget), + GDM_USER_CHOOSER_USER_AUTO); +} + void gdm_user_chooser_widget_set_show_other_user (GdmUserChooserWidget *widget, gboolean show_user) @@ -78,6 +139,11 @@ gdm_user_chooser_widget_set_show_other_user (GdmUserChooserWidget *widget, if (widget->priv->show_other_user != show_user) { widget->priv->show_other_user = show_user; + if (show_user) { + add_user_other (widget); + } else { + remove_user_other (widget); + } } } @@ -89,6 +155,27 @@ gdm_user_chooser_widget_set_show_guest_user (GdmUserChooserWidget *widget, if (widget->priv->show_guest_user != show_user) { widget->priv->show_guest_user = show_user; + if (show_user) { + add_user_guest (widget); + } else { + remove_user_guest (widget); + } + } +} + +void +gdm_user_chooser_widget_set_show_auto_user (GdmUserChooserWidget *widget, + gboolean show_user) +{ + g_return_if_fail (GDM_IS_USER_CHOOSER_WIDGET (widget)); + + if (widget->priv->show_auto_user != show_user) { + widget->priv->show_auto_user = show_user; + if (show_user) { + add_user_auto (widget); + } else { + remove_user_auto (widget); + } } } @@ -155,6 +242,11 @@ gdm_user_chooser_widget_constructor (GType type, n_construct_properties, construct_properties)); + /* FIXME: make these construct properties */ + gdm_user_chooser_widget_set_show_guest_user (user_chooser_widget, FALSE); + gdm_user_chooser_widget_set_show_auto_user (user_chooser_widget, FALSE); + gdm_user_chooser_widget_set_show_other_user (user_chooser_widget, TRUE); + return G_OBJECT (user_chooser_widget); } @@ -294,31 +386,6 @@ setup_icons (GdmUserChooserWidget *widget) load_icons (widget); } -static gboolean -add_special_users (GdmUserChooserWidget *widget) -{ - - gdm_chooser_widget_add_item (GDM_CHOOSER_WIDGET (widget), - GDM_USER_CHOOSER_USER_OTHER, - widget->priv->stock_person_pixbuf, - _("Other..."), - _("Choose a different account"), - 0, - FALSE, - TRUE); -#if 0 - gdm_chooser_widget_add_item (GDM_CHOOSER_WIDGET (widget), - GDM_USER_CHOOSER_USER_GUEST, - widget->priv->stock_person_pixbuf, - _("Guest"), - _("Login as a temporary guest"), - 0, - FALSE, - TRUE); -#endif - return FALSE; -} - static void on_user_added (GdmUserManager *manager, GdmUser *user, @@ -438,7 +505,6 @@ gdm_user_chooser_widget_init (GdmUserChooserWidget *widget) widget); setup_icons (widget); - add_special_users (widget); } static void diff --git a/gui/simple-greeter/gdm-user-chooser-widget.h b/gui/simple-greeter/gdm-user-chooser-widget.h index a117fb33..0795eb1f 100644 --- a/gui/simple-greeter/gdm-user-chooser-widget.h +++ b/gui/simple-greeter/gdm-user-chooser-widget.h @@ -49,6 +49,7 @@ typedef struct #define GDM_USER_CHOOSER_USER_OTHER "__other" #define GDM_USER_CHOOSER_USER_GUEST "__guest" +#define GDM_USER_CHOOSER_USER_AUTO "__auto" GType gdm_user_chooser_widget_get_type (void); GtkWidget * gdm_user_chooser_widget_new (void); @@ -59,9 +60,11 @@ void gdm_user_chooser_widget_set_chosen_user_name (GdmUs void gdm_user_chooser_widget_set_show_only_chosen (GdmUserChooserWidget *widget, gboolean show_only); void gdm_user_chooser_widget_set_show_other_user (GdmUserChooserWidget *widget, - gboolean show_other); + gboolean show); void gdm_user_chooser_widget_set_show_guest_user (GdmUserChooserWidget *widget, - gboolean show_other); + gboolean show); +void gdm_user_chooser_widget_set_show_auto_user (GdmUserChooserWidget *widget, + gboolean show); G_END_DECLS #endif /* __GDM_USER_CHOOSER_WIDGET_H */ diff --git a/gui/simple-greeter/greeter-main.c b/gui/simple-greeter/greeter-main.c index d2ffbe56..d782f59c 100644 --- a/gui/simple-greeter/greeter-main.c +++ b/gui/simple-greeter/greeter-main.c @@ -236,6 +236,7 @@ main (int argc, char *argv[]) g_type_init (); if (! gdm_settings_client_init (GDMCONFDIR "/gdm.schemas", "/")) { + g_critical ("Unable to initialize settings client"); exit (1); } diff --git a/gui/simple-greeter/test-greeter-login-window.c b/gui/simple-greeter/test-greeter-login-window.c index 60204ce4..cfd98619 100644 --- a/gui/simple-greeter/test-greeter-login-window.c +++ b/gui/simple-greeter/test-greeter-login-window.c @@ -45,6 +45,11 @@ main (int argc, char *argv[]) gtk_init (&argc, &argv); + if (! gdm_settings_client_init (GDMCONFDIR "/gdm.schemas", "/")) { + g_critical ("Unable to initialize settings client"); + exit (1); + } + login_window = gdm_greeter_login_window_new (TRUE); gtk_widget_show (login_window); diff --git a/gui/simple-greeter/test-user-chooser.c b/gui/simple-greeter/test-user-chooser.c index 79d9c903..360cd244 100644 --- a/gui/simple-greeter/test-user-chooser.c +++ b/gui/simple-greeter/test-user-chooser.c @@ -47,6 +47,8 @@ main (int argc, char *argv[]) dialog = gdm_user_chooser_dialog_new (); /*gtk_widget_set_size_request (dialog, 480, 128);*/ + gdm_user_chooser_dialog_set_show_guest_user (GDM_USER_CHOOSER_DIALOG (dialog), TRUE); + gdm_user_chooser_dialog_set_show_auto_user (GDM_USER_CHOOSER_DIALOG (dialog), TRUE); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) { char *name; |