20788N/Acommit 53ec60d6ae72a13432be8a041e658db907af29e5
20788N/AAuthor: Halton Huo <halton.huo@sun.com>
20788N/ADate: Fri Nov 20 11:40:45 2009 +0800
20788N/A+#define GDM_LAST_LANGUAGE "GDM_LAST_LANGUAGE"
20788N/A+#define GDM_LAST_LAYOUT "GDM_LAST_LAYOUT"
20788N/A+#define GDM_LAST_SESSION "GDM_LAST_SESSION"
20788N/A gboolean gdm_is_version_unstable (void);
20788N/A@@ -1181,8 +1182,20 @@ gdm_session_direct_handle_saved_language
20788N/A dbus_connection_send (connection, reply, NULL);
20788N/A- get_default_language_name (session)) != 0) {
20788N/A+ if (strcmp (language_name, GDM_LAST_LANGUAGE) == 0) {
20788N/A+ * If the user picked "Last" in the language selector, then
20788N/A+ * process the change, but do not update the saved default
20788N/A+ * language, since it is not a real language.
20788N/A+ _gdm_session_default_language_name_changed (GDM_SESSION (session),
20788N/A+ } else if (strcmp (language_name,
20788N/A+ get_default_language_name (session)) != 0) {
20788N/A+ * Update the saved default language, so that subsequent
20788N/A+ * requests for it will reflect the user's choice.
20788N/A g_free (session->priv->saved_language);
20788N/A session->priv->saved_language = g_strdup (language_name);
20788N/A@@ -1190,7 +1203,6 @@ gdm_session_direct_handle_saved_language
20788N/A return DBUS_HANDLER_RESULT_HANDLED;
20788N/A@@ -1214,8 +1226,20 @@ gdm_session_direct_handle_saved_layout_n
20788N/A dbus_connection_send (connection, reply, NULL);
20788N/A- get_default_layout_name (session)) != 0) {
20788N/A+ if (strcmp (layout_name, GDM_LAST_LAYOUT) == 0) {
20788N/A+ * If the user picked "Last" in the layout selector, then
20788N/A+ * process the change, but do not update the saved default
20788N/A+ * layout, since it is not a real layout.
20788N/A+ _gdm_session_default_layout_name_changed (GDM_SESSION (session),
20788N/A+ } else if (strcmp (layout_name,
20788N/A+ get_default_layout_name (session)) != 0) {
20788N/A+ * Update the saved default layout, so that subsequent requests
20788N/A+ * for it will reflect the user's choice.
20788N/A g_free (session->priv->saved_layout);
20788N/A session->priv->saved_layout = g_strdup (layout_name);
20788N/A@@ -1223,7 +1247,6 @@ gdm_session_direct_handle_saved_layout_n
20788N/A return DBUS_HANDLER_RESULT_HANDLED;
20788N/A@@ -1247,23 +1270,32 @@ gdm_session_direct_handle_saved_session_
20788N/A dbus_connection_send (connection, reply, NULL);
20788N/A- if (! get_session_command_for_name (session_name, NULL)) {
20788N/A+ if (strcmp (session_name, GDM_LAST_SESSION) == 0) {
20788N/A+ * If the user picked "Last" in the session selector, then
20788N/A+ * process the change, but do not update the saved default
20788N/A+ * session, since it is not a real session.
20788N/A+ _gdm_session_default_session_name_changed (GDM_SESSION (session),
20788N/A+ } else if (! get_session_command_for_name (session_name, NULL)) {
20788N/A /* ignore sessions that don't exist */
20788N/A g_debug ("GdmSessionDirect: not using invalid .dmrc session: %s", session_name);
20788N/A g_free (session->priv->saved_session);
20788N/A session->priv->saved_session = NULL;
20788N/A- get_default_session_name (session)) != 0) {
20788N/A+ } else if (strcmp (session_name,
20788N/A+ get_default_session_name (session)) != 0) {
20788N/A+ * Update the saved default session, so that subsequent
20788N/A+ * requests for it will reflect the user's choice.
20788N/A g_free (session->priv->saved_session);
20788N/A session->priv->saved_session = g_strdup (session_name);
20788N/A _gdm_session_default_session_name_changed (GDM_SESSION (session),
20788N/A return DBUS_HANDLER_RESULT_HANDLED;
20788N/A@@ -268,19 +269,62 @@ gdm_session_settings_is_loaded (GdmSessionSettings *settings)
20788N/A gdm_session_settings_load (GdmSessionSettings *settings,
20788N/A g_return_val_if_fail (settings != NULL, FALSE);
20788N/A g_return_val_if_fail (username != NULL, FALSE);
20788N/A- g_return_val_if_fail (!gdm_session_settings_is_loaded (settings), FALSE);
20788N/A+ g_return_val_if_fail (!gdm_session_settings_is_loaded (settings), FALSE);
20788N/A+ if (settings->priv->session_name != NULL &&
20788N/A+ strcmp (settings->priv->session_name, GDM_LAST_SESSION) == 0) {
20788N/A+ g_debug ("Session value is last, loading user value");
20788N/A+ g_free (settings->priv->session_name);
20788N/A+ settings->priv->session_name = NULL;
20788N/A+ if (settings->priv->language_name != NULL &&
20788N/A+ strcmp (settings->priv->language_name, GDM_LAST_LANGUAGE) == 0) {
20788N/A+ g_debug ("Language value is last, loading user value");
20788N/A+ g_free (settings->priv->language_name);
20788N/A+ settings->priv->language_name = NULL;
20788N/A+ if (settings->priv->layout_name != NULL &&
20788N/A+ strcmp (settings->priv->layout_name, GDM_LAST_LAYOUT) == 0) {
20788N/A+ g_debug ("Layout value is last, loading user value");
20788N/A+ g_free (settings->priv->layout_name);
20788N/A+ settings->priv->layout_name = NULL;
20788N/A+ if (skip_session && skip_language && skip_layout) {
20788N/A filename = g_build_filename (GDM_CACHE_DIR, username, "dmrc", NULL);
20788N/A@@ -294,46 +340,52 @@ gdm_session_settings_load (GdmSessionSettings *settings,
20788N/A- session_name = g_key_file_get_string (key_file, "Desktop", "Session",
20788N/A- gdm_session_settings_set_session_name (settings, session_name);
20788N/A- } else if (g_error_matches (load_error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND)) {
20788N/A- g_propagate_error (error, load_error);
20788N/A+ session_name = g_key_file_get_string (key_file, "Desktop",
20788N/A+ g_debug ("Setting value to %s", session_name);
20788N/A+ gdm_session_settings_set_session_name (settings, session_name);
20788N/A+ } else if (g_error_matches (load_error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND)) {
20788N/A+ g_propagate_error (error, load_error);
20788N/A- language_name = g_key_file_get_string (key_file, "Desktop", "Language",
20788N/A- gdm_session_settings_set_language_name (settings, language_name);
20788N/A- } else if (g_error_matches (load_error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND)) {
20788N/A- g_propagate_error (error, load_error);
20788N/A+ language_name = g_key_file_get_string (key_file, "Desktop", "Language",
20788N/A+ gdm_session_settings_set_language_name (settings, language_name);
20788N/A+ } else if (g_error_matches (load_error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND)) {
20788N/A+ g_propagate_error (error, load_error);
20788N/A- layout_name = g_key_file_get_string (key_file, "Desktop", "Layout",
20788N/A- gdm_session_settings_set_layout_name (settings, layout_name);
20788N/A- } else if (g_error_matches (load_error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND)) {
20788N/A- g_propagate_error (error, load_error);
20788N/A+ layout_name = g_key_file_get_string (key_file, "Desktop", "Layout",
20788N/A+ gdm_session_settings_set_layout_name (settings, layout_name);
20788N/A+ } else if (g_error_matches (load_error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND)) {
20788N/A+ g_propagate_error (error, load_error);
20788N/A@@ -55,6 +55,7 @@ GdmSessionSettings *gdm_session_settings_new (void);
20788N/A gboolean gdm_session_settings_load (GdmSessionSettings *settings,
20788N/A gboolean gdm_session_settings_save (GdmSessionSettings *settings,
20788N/A #define GDM_SESSION_WORKER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_SESSION_WORKER, GdmSessionWorkerPrivate))
20788N/A@@ -723,10 +725,26 @@ gdm_session_worker_get_username (GdmSess
20788N/A attempt_to_load_user_settings (GdmSessionWorker *worker,
20788N/A+ gdm_settings_direct_get_boolean (GDM_KEY_SHOW_LAST, &show_last);
20788N/A+ if (show_last && !handle_last) {
20788N/A+ g_debug ("Setting selection options to Last");
20788N/A+ gdm_session_settings_set_session_name (worker->priv->user_settings,
20788N/A+ gdm_session_settings_set_language_name (worker->priv->user_settings,
20788N/A+ gdm_session_settings_set_layout_name (worker->priv->user_settings,
20788N/A gdm_session_settings_load (worker->priv->user_settings,
20788N/A@@ -768,7 +786,9 @@ gdm_session_worker_update_username (GdmS
20788N/A if (worker->priv->username != NULL &&
20788N/A !gdm_session_settings_is_loaded (worker->priv->user_settings)) {
20788N/A- attempt_to_load_user_settings (worker, worker->priv->username);
20788N/A+ attempt_to_load_user_settings (worker,
20788N/A@@ -1805,12 +1825,16 @@ gdm_session_worker_accredit_user (GdmSes
20788N/A@@ -1884,6 +1908,46 @@ gdm_session_worker_accredit_user (GdmSes
20788N/A+ * If the user is using the "Last" session, get the defaults
20788N/A+ * now, after pam_setcred is complete.
20788N/A+ session_name = gdm_session_settings_get_session_name (
20788N/A+ language_name = gdm_session_settings_get_language_name (
20788N/A+ layout_name = gdm_session_settings_get_layout_name (
20788N/A+ strcmp (session_name, GDM_LAST_SESSION) == 0) {
20788N/A+ g_debug ("Session setting is Last");
20788N/A+ strcmp (language_name, GDM_LAST_LANGUAGE) == 0) {
20788N/A+ g_debug ("Language setting is Last");
20788N/A+ strcmp (layout_name, GDM_LAST_LAYOUT) == 0) {
20788N/A+ g_debug ("Layout setting is Last");
20788N/A+ g_debug ("Now loading users default settings.");
20788N/A+ /* Now copy user settings to cache and load */
20788N/A+ gdm_session_worker_cache_userfiles (worker);
20788N/A+ attempt_to_load_user_settings (worker, worker->priv->username,
20788N/A@@ -2535,7 +2599,8 @@ do_setup (GdmSessionWorker *worker)
20788N/A if (worker->priv->username != NULL) {
20788N/A attempt_to_load_user_settings (worker,
20788N/A@@ -187,6 +187,8 @@ test_language_chooser_SOURCES = \
20788N/A test_language_chooser_LDADD = \
20788N/A test_layout_chooser_SOURCES = \
20788N/A@@ -211,6 +213,7 @@ test_layout_chooser_LDADD = \
20788N/A@@ -222,6 +225,8 @@ test_languages_SOURCES = \
20788N/A@@ -232,6 +237,8 @@ test_sessions_SOURCES = \
20788N/A@@ -184,6 +186,10 @@ gdm_language_option_widget_lookup_item (
20788N/A+ if (strcmp (locale, GDM_LAST_LANGUAGE) == 0) {
20788N/A normalized_locale = gdm_normalize_language_name (locale);
20788N/A language = gdm_get_language_from_name (locale, normalized_locale);
20788N/A gdm_language_option_widget_init (GdmLanguageOptionWidget *widget)
20788N/A widget->priv = GDM_LANGUAGE_OPTION_WIDGET_GET_PRIVATE (widget);
20788N/A@@ -232,6 +239,16 @@ gdm_language_option_widget_init (GdmLang
20788N/A _("Choose a language from the "
20788N/A "full list of available languages."),
20788N/A GDM_OPTION_WIDGET_POSITION_BOTTOM);
20788N/A+ gdm_settings_client_get_boolean (GDM_KEY_SHOW_LAST, &show_last);
20788N/A+ gdm_option_widget_add_item (GDM_OPTION_WIDGET (widget),
20788N/A+ GDM_OPTION_WIDGET_POSITION_TOP);
20788N/A@@ -246,6 +247,11 @@ gdm_normalize_language_name (const char *name)
20788N/A+ if (strcmp (name, GDM_LAST_LANGUAGE) == 0) {
20788N/A+ normalized_name = g_strdup (name);
20788N/A@@ -184,6 +187,10 @@ gdm_layout_option_widget_lookup_item (GdmRecentOptionWidget *widget,
20788N/A+ if (strcmp (key, GDM_LAST_LAYOUT) == 0) {
20788N/A layout = gdm_get_layout_from_name (key);
20788N/A gdm_layout_option_widget_init (GdmLayoutOptionWidget *widget)
20788N/A widget->priv = GDM_LAYOUT_OPTION_WIDGET_GET_PRIVATE (widget);
20788N/A@@ -224,6 +232,15 @@ gdm_layout_option_widget_init (GdmLayoutOptionWidget *widget)
20788N/A _("Choose a keyboard layout from the "
20788N/A "full list of available layouts."),
20788N/A GDM_OPTION_WIDGET_POSITION_BOTTOM);
20788N/A+ gdm_settings_client_get_boolean (GDM_KEY_SHOW_LAST, &show_last);
20788N/A+ gdm_option_widget_add_item (GDM_OPTION_WIDGET (widget),
20788N/A+ GDM_OPTION_WIDGET_POSITION_TOP);
20788N/A@@ -288,7 +305,10 @@ gdm_layout_option_widget_set_current_layout_name (GdmLayoutOptionWidget *widget,
20788N/A gdm_recent_option_widget_add_item (GDM_RECENT_OPTION_WIDGET (widget),
20788N/A+ } else if (strcmp (id, GDM_LAST_LAYOUT) == 0) {
20788N/A+ gdm_option_widget_set_active_item (GDM_OPTION_WIDGET (widget), id);
20788N/A g_debug ("GdmLayoutOptionWidget: Setting active item: '%s'", id);
20788N/A gdm_option_widget_set_active_item (GDM_OPTION_WIDGET (widget), id);
20788N/A #define GDM_SESSION_OPTION_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_SESSION_OPTION_WIDGET, GdmSessionOptionWidgetPrivate))
20788N/A@@ -133,8 +135,19 @@ add_available_sessions (GdmSessionOptionWidget *widget)
20788N/A gdm_session_option_widget_init (GdmSessionOptionWidget *widget)
20788N/A widget->priv = GDM_SESSION_OPTION_WIDGET_GET_PRIVATE (widget);
20788N/A+ gdm_settings_client_get_boolean (GDM_KEY_SHOW_LAST, &show_last);
20788N/A+ gdm_option_widget_add_item (GDM_OPTION_WIDGET (widget),
20788N/A+ GDM_OPTION_WIDGET_POSITION_TOP);
20788N/A add_available_sessions (widget);
20788N/A@@ -189,5 +202,7 @@ gdm_session_option_widget_set_current_session (GdmSessionOptionWidget *widget,
20788N/A } else if (gdm_option_widget_lookup_item (GDM_OPTION_WIDGET (widget), session,
20788N/A gdm_option_widget_set_active_item (GDM_OPTION_WIDGET (widget), session);
20788N/A+ } else if (strcmp (session, GDM_LAST_SESSION) == 0) {
20788N/A+ gdm_option_widget_set_active_item (GDM_OPTION_WIDGET (widget), session);
20788N/A@@ -197,6 +198,10 @@ gdm_layout_is_valid (const char *layout_
20788N/A+ if (layout_variant != NULL && strcmp (layout_variant, GDM_LAST_LAYOUT) == 0) {
20788N/A layout = g_strdup (layout_variant);
20788N/A variant = strchr (layout, '\t');
20788N/A@@ -245,6 +250,10 @@ gdm_layout_activate (const char *layout)
20788N/A+ if (layout != NULL && strcmp (layout, GDM_LAST_LAYOUT) == 0) {
20788N/A config = xkl_config_rec_new ();