summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Jon McCann <jmccann@redhat.com>2008-02-20 18:41:49 +0000
committerWilliam Jon McCann <mccann@src.gnome.org>2008-02-20 18:41:49 +0000
commit9400160560215c509759efca6fb365f12e4a8bc5 (patch)
tree3653a68ebba12afe5864ddc8737fd1f491bda275
parent7ded9b2049a472b9fb5f6f2f70e270e14fcee656 (diff)
downloadgdm-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
-rw-r--r--ChangeLog68
-rw-r--r--common/gdm-settings-client.c2
-rw-r--r--common/gdm-settings-keys.h3
-rw-r--r--daemon/gdm-factory-slave.c4
-rw-r--r--daemon/gdm-greeter-server.c31
-rw-r--r--daemon/gdm-greeter-server.h3
-rw-r--r--daemon/gdm-product-slave.c33
-rw-r--r--daemon/gdm-session-direct.c53
-rw-r--r--daemon/gdm-session-relay.c44
-rw-r--r--daemon/gdm-session.c8
-rw-r--r--daemon/gdm-session.h8
-rw-r--r--daemon/gdm-simple-slave.c40
-rw-r--r--daemon/simple-slave-main.c7
-rw-r--r--daemon/test-session.c2
-rw-r--r--gui/simple-greeter/gdm-greeter-client.c9
-rw-r--r--gui/simple-greeter/gdm-greeter-client.h1
-rw-r--r--gui/simple-greeter/gdm-greeter-login-window.c210
-rw-r--r--gui/simple-greeter/gdm-greeter-login-window.h2
-rw-r--r--gui/simple-greeter/gdm-greeter-session.c11
-rw-r--r--gui/simple-greeter/gdm-user-chooser-dialog.c30
-rw-r--r--gui/simple-greeter/gdm-user-chooser-dialog.h9
-rw-r--r--gui/simple-greeter/gdm-user-chooser-widget.c118
-rw-r--r--gui/simple-greeter/gdm-user-chooser-widget.h7
-rw-r--r--gui/simple-greeter/greeter-main.c1
-rw-r--r--gui/simple-greeter/test-greeter-login-window.c5
-rw-r--r--gui/simple-greeter/test-user-chooser.c2
26 files changed, 592 insertions, 119 deletions
diff --git a/ChangeLog b/ChangeLog
index 666c1262..f3266a6d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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;