* Fix up script hooks, add regression tests for them
* Complete removal of X code from the core of LightDM, so it can better
support various display types
+ * Add ability to set the language of a user from the greeter
Overview of changes in lightdm 0.9.7
GREETER_MESSAGE_AUTHENTICATE_AS_GUEST,
GREETER_MESSAGE_CONTINUE_AUTHENTICATION,
GREETER_MESSAGE_START_SESSION,
- GREETER_MESSAGE_CANCEL_AUTHENTICATION
+ GREETER_MESSAGE_CANCEL_AUTHENTICATION,
+ GREETER_MESSAGE_SET_LANGUAGE
} GreeterMessage;
/* Messages from the server to the greeter */
return GET_PRIVATE (greeter)->authentication_user;
}
+/**
+ * lightdm_greeter_set_language:
+ * @greeter: A #LightDMGreeter
+ * @language: The language to use for this user.
+ *
+ * Set the language for the currently authenticated user.
+ **/
+void
+lightdm_greeter_set_language (LightDMGreeter *greeter, const gchar *language)
+{
+ LightDMGreeterPrivate *priv;
+ guint8 message[MAX_MESSAGE_LENGTH];
+ gsize offset = 0;
+
+ g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
+
+ priv = GET_PRIVATE (greeter);
+
+ g_return_if_fail (priv->connected);
+
+ write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_SET_LANGUAGE, 0, &offset);
+ write_string (message, MAX_MESSAGE_LENGTH, language, &offset);
+ write_message (greeter, message, offset);
+}
+
/**
* lightdm_greeter_start_session_sync:
* @greeter: A #LightDMGreeter
const gchar *lightdm_greeter_get_authentication_user (LightDMGreeter *greeter);
+void lightdm_greeter_set_language (LightDMGreeter *greeter, const gchar *language);
+
gboolean lightdm_greeter_start_session_sync (LightDMGreeter *greeter, const gchar *session, GError **error);
G_END_DECLS
void authenticateAsGuest();
void respond(const QString &response);
void cancelAuthentication();
+ void setLanguage (QString language);
bool startSessionSync(const QString &session=QString());
signals:
GREETER_MESSAGE_AUTHENTICATE_AS_GUEST,
GREETER_MESSAGE_CONTINUE_AUTHENTICATION,
GREETER_MESSAGE_START_SESSION,
- GREETER_MESSAGE_CANCEL_AUTHENTICATION
+ GREETER_MESSAGE_CANCEL_AUTHENTICATION,
+ GREETER_MESSAGE_SET_LANGUAGE
} GreeterMessage;
/* Messages from the server to the greeter */
return d->authenticationUser;
}
+void Greeter::setLanguage (QString language)
+{
+ writeHeader(GREETER_MESSAGE_SET_LANGUAGE, 0);
+ writeString (language);
+ flush();
+}
+
bool Greeter::startSessionSync(const QString &session)
{
if (session == "")
GREETER_MESSAGE_AUTHENTICATE_AS_GUEST,
GREETER_MESSAGE_CONTINUE_AUTHENTICATION,
GREETER_MESSAGE_START_SESSION,
- GREETER_MESSAGE_CANCEL_AUTHENTICATION
+ GREETER_MESSAGE_CANCEL_AUTHENTICATION,
+ GREETER_MESSAGE_SET_LANGUAGE
} GreeterMessage;
/* Messages from the server to the greeter */
}
}
+static void
+handle_set_language (Greeter *greeter, const gchar *language)
+{
+ User *user;
+
+ if (!greeter->priv->guest_account_authenticated && !pam_session_get_is_authenticated (greeter->priv->authentication))
+ {
+ g_debug ("Ignoring set language request, user is not authorized");
+ return;
+ }
+
+ // FIXME: Could use this
+ if (greeter->priv->guest_account_authenticated)
+ {
+ g_debug ("Ignoring set language request for guest user");
+ return;
+ }
+
+ user = pam_session_get_user (greeter->priv->authentication);
+ user_set_language (user, language);
+}
+
static guint32
read_int (Greeter *greeter, gsize *offset)
{
GIOStatus status;
int id, n_secrets, i;
guint32 sequence_number;
- gchar *version, *username, *session_name;
+ gchar *version, *username, *session_name, *language;
gchar **secrets;
GError *error = NULL;
handle_start_session (greeter, session_name);
g_free (session_name);
break;
+ case GREETER_MESSAGE_SET_LANGUAGE:
+ language = read_string (greeter, &offset);
+ handle_set_language (greeter, language);
+ g_free (language);
+ break;
default:
g_warning ("Unknown message from greeter: %d", id);
break;