diff options
-rw-r--r-- | NEWS | 7 | ||||
-rw-r--r-- | doc/tmpl/greeter.sgml | 15 | ||||
-rw-r--r-- | liblightdm-gobject/greeter-protocol.h | 3 | ||||
-rw-r--r-- | liblightdm-gobject/greeter.c | 44 | ||||
-rw-r--r-- | liblightdm-gobject/lightdm/greeter.h | 2 | ||||
-rw-r--r-- | liblightdm-qt/QLightDM/greeter.cpp | 13 | ||||
-rw-r--r-- | liblightdm-qt/QLightDM/greeter.h | 2 | ||||
-rw-r--r-- | src/display-manager.c | 20 | ||||
-rw-r--r-- | src/display.c | 7 | ||||
-rw-r--r-- | src/display.h | 3 | ||||
-rw-r--r-- | src/greeter-protocol.h | 3 | ||||
-rw-r--r-- | src/greeter.c | 21 | ||||
-rw-r--r-- | src/greeter.h | 4 |
13 files changed, 129 insertions, 15 deletions
@@ -4,8 +4,11 @@ Overview of changes in lightdm 0.4.4 * Added XDMCP regression tests * Allow minimum-display-number to be set in lightdm.conf and on the command line - * Drop ldm_greeter_get_is_first() - it was added for testing and doesn't - work well + * liblightdm API changes: + - Added two signals: select-user and select-guest. This requires the + greeter to select a user account for logging in. + - Drop ldm_greeter_get_is_first() - it was added for testing and doesn't + work well Overview of changes in lightdm 0.4.3 diff --git a/doc/tmpl/greeter.sgml b/doc/tmpl/greeter.sgml index 63333fdb..3428762a 100644 --- a/doc/tmpl/greeter.sgml +++ b/doc/tmpl/greeter.sgml @@ -101,6 +101,21 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL); @ldmgreeter: the object which received the signal. +<!-- ##### SIGNAL LdmGreeter::select-guest ##### --> +<para> + +</para> + +@ldmgreeter: the object which received the signal. + +<!-- ##### SIGNAL LdmGreeter::select-user ##### --> +<para> + +</para> + +@ldmgreeter: the object which received the signal. +@arg1: + <!-- ##### SIGNAL LdmGreeter::show-message ##### --> <para> diff --git a/liblightdm-gobject/greeter-protocol.h b/liblightdm-gobject/greeter-protocol.h index 5d8701bc..bccce500 100644 --- a/liblightdm-gobject/greeter-protocol.h +++ b/liblightdm-gobject/greeter-protocol.h @@ -27,7 +27,8 @@ typedef enum GREETER_MESSAGE_QUIT = 102, GREETER_MESSAGE_PROMPT_AUTHENTICATION = 103, GREETER_MESSAGE_END_AUTHENTICATION = 104, - GREETER_MESSAGE_USER_DEFAULTS = 106 + GREETER_MESSAGE_SELECT_USER = 107, + GREETER_MESSAGE_SELECT_GUEST = 108 } GreeterMessage; #endif /* _GREETER_PROTOCOL_H_ */ diff --git a/liblightdm-gobject/greeter.c b/liblightdm-gobject/greeter.c index 0abc1b2f..aa722e7d 100644 --- a/liblightdm-gobject/greeter.c +++ b/liblightdm-gobject/greeter.c @@ -50,6 +50,8 @@ enum { SHOW_MESSAGE, AUTHENTICATION_COMPLETE, TIMED_LOGIN, + SELECT_USER, + SELECT_GUEST, USER_ADDED, USER_CHANGED, USER_REMOVED, @@ -326,6 +328,7 @@ from_server_cb (GIOChannel *source, GIOCondition condition, gpointer data) LdmGreeter *greeter = data; gsize offset; guint32 id, sequence_number, return_code; + gchar *username; if (!read_packet (greeter, FALSE)) return TRUE; @@ -382,6 +385,16 @@ from_server_cb (GIOChannel *source, GIOCondition condition, gpointer data) else g_debug ("Ignoring end authentication with invalid sequence number %d", sequence_number); break; + case GREETER_MESSAGE_SELECT_USER: + username = read_string (greeter, &offset); + g_debug ("Got request to select user %s", username); + g_signal_emit (G_OBJECT (greeter), signals[SELECT_USER], 0, username); + g_free (username); + break; + case GREETER_MESSAGE_SELECT_GUEST: + g_debug ("Got request to select guest account"); + g_signal_emit (G_OBJECT (greeter), signals[SELECT_GUEST], 0); + break; default: g_warning ("Unknown message from server: %d", id); break; @@ -1986,6 +1999,37 @@ ldm_greeter_class_init (LdmGreeterClass *klass) G_TYPE_NONE, 1, G_TYPE_STRING); /** + * LdmGreeter::select-user: + * @greeter: A #LdmGreeter + * @username: A username + * + * The ::select-user signal gets emitted when the daemon request the greeter to select a user to log in as. + **/ + signals[SELECT_USER] = + g_signal_new ("select-user", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (LdmGreeterClass, select_user), + NULL, NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, G_TYPE_STRING); + + /** + * LdmGreeter::select-guest: + * @greeter: A #LdmGreeter + * + * The ::select-guest signal gets emitted when the deamon requests the greeter to select the guest account. + **/ + signals[SELECT_GUEST] = + g_signal_new ("select-guest", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (LdmGreeterClass, select_guest), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + /** * LdmGreeter::user-added: * @greeter: A #LdmGreeter * diff --git a/liblightdm-gobject/lightdm/greeter.h b/liblightdm-gobject/lightdm/greeter.h index c10c4a84..fd231872 100644 --- a/liblightdm-gobject/lightdm/greeter.h +++ b/liblightdm-gobject/lightdm/greeter.h @@ -60,6 +60,8 @@ struct _LdmGreeterClass void (*show_message)(LdmGreeter *greeter, const gchar *text, LdmMessageType type); void (*authentication_complete)(LdmGreeter *greeter); void (*timed_login)(LdmGreeter *greeter, const gchar *username); + void (*select_user)(LdmGreeter *greeter, const gchar *username); + void (*select_guest)(LdmGreeter *greeter); void (*user_added)(LdmGreeter *greeter, LdmUser *user); void (*user_changed)(LdmGreeter *greeter, LdmUser *user); void (*user_removed)(LdmGreeter *greeter, LdmUser *user); diff --git a/liblightdm-qt/QLightDM/greeter.cpp b/liblightdm-qt/QLightDM/greeter.cpp index d206247d..e52f093b 100644 --- a/liblightdm-qt/QLightDM/greeter.cpp +++ b/liblightdm-qt/QLightDM/greeter.cpp @@ -45,7 +45,8 @@ typedef enum GREETER_MESSAGE_QUIT = 102, GREETER_MESSAGE_PROMPT_AUTHENTICATION = 103, GREETER_MESSAGE_END_AUTHENTICATION = 104, - GREETER_MESSAGE_USER_DEFAULTS = 106 + GREETER_MESSAGE_SELECT_USER = 107, + GREETER_MESSAGE_SELECT_GUEST = 108 } GreeterMessage; #define HEADER_SIZE 8 @@ -322,6 +323,7 @@ void Greeter::onRead(int fd) int id = readInt(&offset); readInt(&offset); int nMessages, sequenceNumber, returnCode; + QString username; switch(id) { case GREETER_MESSAGE_CONNECTED: @@ -385,6 +387,15 @@ void Greeter::onRead(int fd) else qDebug () << "Ignoring end authentication with invalid sequence number " << sequenceNumber; break; + case GREETER_MESSAGE_SELECT_USER: + username = readString(&offset); + qDebug() << "Got request to select user " << username; + emit selectUser(username); + break; + case GREETER_MESSAGE_SELECT_GUEST: + qDebug() << "Got request to select guest account"; + emit selectGuest(); + break; default: qDebug() << "Unknown message from server: " << id; } diff --git a/liblightdm-qt/QLightDM/greeter.h b/liblightdm-qt/QLightDM/greeter.h index 90fbe897..efa6839d 100644 --- a/liblightdm-qt/QLightDM/greeter.h +++ b/liblightdm-qt/QLightDM/greeter.h @@ -90,6 +90,8 @@ namespace QLightDM void showError(QString message); void authenticationComplete(bool isAuthenticated); void timedLogin(QString username); + void selectUser(QString username); + void selectGuest(); void quit(); private slots: diff --git a/src/display-manager.c b/src/display-manager.c index d8153c15..e4531c0b 100644 --- a/src/display-manager.c +++ b/src/display-manager.c @@ -398,19 +398,16 @@ switch_to_user (DisplayManager *manager, const gchar *username) /* Switch to active display if it exists */ for (link = manager->priv->displays; link; link = link->next) { - Display *display; - - display = link->data; - const gchar *session_user; - - session_user = display_get_session_user (display); - if (session_user == NULL) + Display *display = link->data; + + /* If running a greeter can't use this one */ + if (display_get_greeter (display)) { greeter_display = display; continue; } - - if (g_strcmp0 (session_user, username) == 0) + + if (g_strcmp0 (display_get_session_user (display), username) == 0) { g_debug ("Switching to user %s session on display %s", username, xserver_get_address (display_get_xserver (display))); display_show (display); @@ -422,7 +419,10 @@ switch_to_user (DisplayManager *manager, const gchar *username) if (greeter_display) { g_debug ("Switching to greeter session on display %s", xserver_get_address (display_get_xserver (greeter_display))); - // FIXME: Notify greeter of user to switch to + if (strcmp (username, guest_account_get_username ()) == 0) + greeter_select_guest (display_get_greeter (greeter_display)); + else + greeter_select_user (display_get_greeter (greeter_display), username); display_show (greeter_display); return TRUE; } diff --git a/src/display.c b/src/display.c index 85863704..b7147b85 100644 --- a/src/display.c +++ b/src/display.c @@ -122,6 +122,13 @@ display_get_xserver (Display *display) return display->priv->xserver; } +Greeter * +display_get_greeter (Display *display) +{ + g_return_val_if_fail (display != NULL, NULL); + return display->priv->greeter_session; +} + void display_set_session_wrapper (Display *display, const gchar *session_wrapper) { diff --git a/src/display.h b/src/display.h index 461b149d..664d18ee 100644 --- a/src/display.h +++ b/src/display.h @@ -16,6 +16,7 @@ #include "xserver.h" #include "session.h" +#include "greeter.h" G_BEGIN_DECLS @@ -49,6 +50,8 @@ Display *display_new (XServer *xserver); XServer *display_get_xserver (Display *display); +Greeter *display_get_greeter (Display *display); + void display_set_session_wrapper (Display *display, const gchar *session_wrapper); const gchar *display_get_session_wrapper (Display *display); diff --git a/src/greeter-protocol.h b/src/greeter-protocol.h index 5d8701bc..bccce500 100644 --- a/src/greeter-protocol.h +++ b/src/greeter-protocol.h @@ -27,7 +27,8 @@ typedef enum GREETER_MESSAGE_QUIT = 102, GREETER_MESSAGE_PROMPT_AUTHENTICATION = 103, GREETER_MESSAGE_END_AUTHENTICATION = 104, - GREETER_MESSAGE_USER_DEFAULTS = 106 + GREETER_MESSAGE_SELECT_USER = 107, + GREETER_MESSAGE_SELECT_GUEST = 108 } GreeterMessage; #endif /* _GREETER_PROTOCOL_H_ */ diff --git a/src/greeter.c b/src/greeter.c index ee370a0e..c1a82339 100644 --- a/src/greeter.c +++ b/src/greeter.c @@ -393,6 +393,27 @@ handle_cancel_authentication (Greeter *greeter) pam_session_cancel (greeter->priv->pam_session); } +void +greeter_select_user (Greeter *greeter, const gchar *username) +{ + guint8 message[MAX_MESSAGE_LENGTH]; + gsize offset = 0; + + write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_SELECT_USER, string_length (username), &offset); + write_string (message, MAX_MESSAGE_LENGTH, username, &offset); + write_message (greeter, message, offset); +} + +void +greeter_select_guest (Greeter *greeter) +{ + guint8 message[MAX_MESSAGE_LENGTH]; + gsize offset = 0; + + write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_SELECT_GUEST, 0, &offset); + write_message (greeter, message, offset); +} + static gboolean quit_greeter_cb (gpointer data) { diff --git a/src/greeter.h b/src/greeter.h index a8c9dd1a..37d90a91 100644 --- a/src/greeter.h +++ b/src/greeter.h @@ -48,6 +48,10 @@ const gchar *greeter_get_default_session (Greeter *greeter); PAMSession *greeter_get_pam_session (Greeter *greeter); +void greeter_select_user (Greeter *greeter, const gchar *username); + +void greeter_select_guest (Greeter *greeter); + void greeter_quit (Greeter *greeter); G_END_DECLS |