gdm r5835 - in trunk: . daemon



Author: halfline
Date: Thu Feb 21 05:20:47 2008
New Revision: 5835
URL: http://svn.gnome.org/viewvc/gdm?rev=5835&view=rev

Log:
2008-02-21  Ray Strode  <rstrode redhat com>

	* daemon/gdm-session-direct.c
	(gdm_session_direct_handle_saved_language)
	(gdm_session_direct_handle_saved_session):
	when the .dmrc gets read remember the results
	(get_session_name), (get_language_name):
	new functions to figure out which of
	1) value reported from greeter 2) value saved
	in .dmrc 3) some fallback is the value we
	should actually use when logging in
	(get_session_command), (setup_session_environment):
	use the new get_{session,language}_name functions
	(gdm_session_direct_select_session):
	if the greeter tells us to use the value that are in
	~/.dmrc then discard anything the greeter told us
	earlier and just default to fallback behavior.
	(gdm_session_direct_finalize): memleak fixes


Modified:
   trunk/ChangeLog
   trunk/daemon/gdm-session-direct.c

Modified: trunk/daemon/gdm-session-direct.c
==============================================================================
--- trunk/daemon/gdm-session-direct.c	(original)
+++ trunk/daemon/gdm-session-direct.c	Thu Feb 21 05:20:47 2008
@@ -39,6 +39,8 @@
 #include <pwd.h>
 #include <grp.h>
 
+#include <locale.h>
+
 #include <glib.h>
 #include <glib/gi18n.h>
 #include <glib/gstdio.h>
@@ -64,7 +66,9 @@
 {
         /* per open scope */
         char                *selected_session;
+        char                *saved_session;
         char                *selected_language;
+        char                *saved_language;
         char                *selected_user;
         char                *user_x11_authority_file;
 
@@ -793,6 +797,7 @@
         dbus_message_unref (reply);
 
         _gdm_session_saved_language_name_read (GDM_SESSION (session), language_name);
+        session->priv->saved_language = g_strdup (language_name);
 
         return DBUS_HANDLER_RESULT_HANDLED;
 }
@@ -819,6 +824,8 @@
 
         _gdm_session_saved_session_name_read (GDM_SESSION (session), session_name);
 
+        session->priv->saved_session = g_strdup (session_name);
+
         return DBUS_HANDLER_RESULT_HANDLED;
 }
 
@@ -1195,8 +1202,6 @@
 static void
 gdm_session_direct_init (GdmSessionDirect *session)
 {
-        const char * const *languages;
-
         session->priv = G_TYPE_INSTANCE_GET_PRIVATE (session,
                                                      GDM_TYPE_SESSION_DIRECT,
                                                      GdmSessionDirectPrivate);
@@ -1218,13 +1223,7 @@
                           G_CALLBACK (on_session_exited),
                           NULL);
 
-        languages = g_get_language_names ();
-        if (languages != NULL) {
-                session->priv->selected_language = g_strdup (languages[0]);
-        }
-
         session->priv->session_pid = -1;
-        session->priv->selected_session = g_strdup ("gnome");
 
         session->priv->environment = g_hash_table_new_full (g_str_hash,
                                                             g_str_equal,
@@ -1666,6 +1665,30 @@
         return ret;
 }
 
+static const char *
+get_language_name (GdmSessionDirect *session)
+{
+        if (session->priv->selected_language != NULL) {
+                return session->priv->selected_language;
+        } else if (session->priv->saved_language != NULL) {
+                return session->priv->saved_language;
+        } else {
+                return setlocale (LC_MESSAGES, NULL);
+        }
+}
+
+static const char *
+get_session_name (GdmSessionDirect *session)
+{
+        if (session->priv->selected_session != NULL) {
+                return session->priv->selected_session;
+        } else if (session->priv->saved_session != NULL) {
+                return session->priv->saved_session;
+        } else {
+                return "gnome";
+        }
+}
+
 static char *
 get_session_command (GdmSessionDirect *session)
 {
@@ -1673,7 +1696,7 @@
         char    *command;
         char    *filename;
 
-        filename = g_strdup_printf ("%s.desktop", session->priv->selected_session);
+        filename = g_strdup_printf ("%s.desktop", get_session_name (session));
 
         command = NULL;
         res = get_session_command_for_file (filename, &command);
@@ -1783,17 +1806,17 @@
 
         gdm_session_direct_set_environment_variable (session,
                                                      "GDMSESSION",
-                                                     session->priv->selected_session);
+                                                     get_session_name (session));
         gdm_session_direct_set_environment_variable (session,
                                                      "DESKTOP_SESSION",
-                                                     session->priv->selected_session);
+                                                     get_session_name (session));
 
         gdm_session_direct_set_environment_variable (session,
                                                      "LANG",
-                                                     session->priv->selected_language);
+                                                     get_language_name (session));
         gdm_session_direct_set_environment_variable (session,
                                                      "GDM_LANG",
-                                                     session->priv->selected_language);
+                                                     get_language_name (session));
 
         gdm_session_direct_set_environment_variable (session,
                                                      "DISPLAY",
@@ -1870,9 +1893,15 @@
         g_free (impl->priv->selected_session);
         impl->priv->selected_session = NULL;
 
+        g_free (impl->priv->saved_session);
+        impl->priv->saved_session = NULL;
+
         g_free (impl->priv->selected_language);
         impl->priv->selected_language = NULL;
 
+        g_free (impl->priv->saved_language);
+        impl->priv->saved_language = NULL;
+
         g_free (impl->priv->user_x11_authority_file);
         impl->priv->user_x11_authority_file = NULL;
 
@@ -1919,7 +1948,12 @@
         GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
 
         g_free (impl->priv->selected_session);
-        impl->priv->selected_session = g_strdup (text);
+
+        if (strcmp (text, "__previous") == 0) {
+                impl->priv->selected_session = NULL;
+        } else {
+                impl->priv->selected_session = g_strdup (text);
+        }
 }
 
 static void
@@ -1929,7 +1963,12 @@
         GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
 
         g_free (impl->priv->selected_language);
-        impl->priv->selected_language = g_strdup (text);
+
+        if (strcmp (text, "__previous") == 0) {
+                impl->priv->selected_language = NULL;
+        } else {
+                impl->priv->selected_language = g_strdup (text);
+        }
 }
 
 /* At some point we may want to read these right from
@@ -2101,6 +2140,10 @@
         session = GDM_SESSION_DIRECT (object);
 
         g_free (session->priv->selected_user);
+        g_free (session->priv->selected_session);
+        g_free (session->priv->saved_session);
+        g_free (session->priv->selected_language);
+        g_free (session->priv->saved_language);
 
         parent_class = G_OBJECT_CLASS (gdm_session_direct_parent_class);
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]