summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS7
-rw-r--r--doc/tmpl/greeter.sgml15
-rw-r--r--liblightdm-gobject/greeter-protocol.h3
-rw-r--r--liblightdm-gobject/greeter.c44
-rw-r--r--liblightdm-gobject/lightdm/greeter.h2
-rw-r--r--liblightdm-qt/QLightDM/greeter.cpp13
-rw-r--r--liblightdm-qt/QLightDM/greeter.h2
-rw-r--r--src/display-manager.c20
-rw-r--r--src/display.c7
-rw-r--r--src/display.h3
-rw-r--r--src/greeter-protocol.h3
-rw-r--r--src/greeter.c21
-rw-r--r--src/greeter.h4
13 files changed, 129 insertions, 15 deletions
diff --git a/NEWS b/NEWS
index 997d25a2..2df2eacb 100644
--- a/NEWS
+++ b/NEWS
@@ -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