--- gdm-2.29.1/data/gconf.path-orig	2009-12-02 21:53:40.640164300 -0600
+++ gdm-2.29.1/data/gconf.path	2009-12-02 21:52:43.303731247 -0600
@@ -1,3 +1,6 @@
+xml:readonly:/etc/gconf/gconf.xml.mandatory
+include /etc/gconf/2/local-mandatory.path
+
 # treat system-wide settings as mandatory
 # We don't use this default mechanism on opensolaris.
 # xml:readonly:/etc/gconf/gconf.xml.system
@@ -7,3 +10,9 @@
 # owned by GDM.  Sysadmins should create
 # another source if they wish to override them.
 xml:readonly:$(HOME)/.gconf.mandatory
+
+# Set per-seat configuration directory
+xml:readwrite:$(HOME)/$(ENV_GDM_SEAT_ID)/.gconf
+
+include /etc/gconf/2/local-defaults.path
+xml:readonly:/etc/gconf/gconf.xml.defaults
--- gdm-2.29.1/data/Makefile.am-orig	2009-12-02 21:51:17.509082145 -0600
+++ gdm-2.29.1/data/Makefile.am	2009-12-02 21:51:32.599564304 -0600
@@ -124,7 +124,7 @@ uninstall-hook:
 	$(DESTDIR)$(postdir)/Default \
 	$(DESTDIR)$(PAM_PREFIX)/pam.d/gdm \
 	$(DESTDIR)$(PAM_PREFIX)/pam.d/gdm-autologin \
-	$(DESTDIR)$(workingdir)/.gconf.path \
+	$(DESTDIR)$(workingdir)/gconf.path \
 	-rf \
 	$(DESTDIR)$(workingdir)/.gconf.mandatory \
 	$(DESTDIR)$(screenshotdir) \
@@ -228,7 +228,7 @@ install-data-hook: gdm.conf-custom Xsess
 		chown root:gdm $(DESTDIR)$(cachedir) || : ; \
 	fi
 
-	$(INSTALL_DATA) $(srcdir)/gconf.path $(DESTDIR)$(workingdir)/.gconf.path
+	$(INSTALL_DATA) $(srcdir)/gconf.path $(DESTDIR)$(workingdir)/gconf.path
 	gconftool-2 --direct --config-source=xml:merged:$(DESTDIR)$(workingdir)/.gconf.mandatory --recursive-unset /
 	gconftool-2 --direct --config-source=xml:merged:$(DESTDIR)$(workingdir)/.gconf.mandatory --load $(srcdir)/session-setup.entries
 	chown -R root:gdm $(DESTDIR)$(workingdir)/.gconf.mandatory || :
--- gdm-2.29.1/daemon/gdm-welcome-session.c-orig	2009-12-02 21:48:12.369321575 -0600
+++ gdm-2.29.1/daemon/gdm-welcome-session.c	2009-12-02 21:50:27.297039840 -0600
@@ -337,6 +337,18 @@ get_welcome_environment (GdmWelcomeSessi
                 g_hash_table_insert (hash, g_strdup ("SHELL"), g_strdup (pwent->pw_shell));
         }
 
+        if (welcome_session->priv->x11_display_seat_id != NULL) {
+                char *seat_id;
+                char *source_path;
+
+                seat_id = welcome_session->priv->x11_display_seat_id +
+                        strlen ("/org/freedesktop/ConsoleKit/");
+                source_path = g_strdup_printf ("/var/lib/gdm/gconf.path");
+
+         	g_hash_table_insert (hash, g_strdup ("GCONF_DEFAULT_SOURCE_PATH"), g_strdup (source_path));
+                g_hash_table_insert (hash, g_strdup ("GDM_SEAT_ID"), g_strdup (seat_id));
+                g_free (source_path);
+        }
 
         g_hash_table_insert (hash, g_strdup ("PATH"), g_strdup (g_getenv ("PATH")));
 
@@ -432,6 +444,7 @@ typedef struct {
         const char *group_name;
         const char *runtime_dir;
         const char *log_file;
+        const char *seat_id;
 } SpawnChildData;
 
 static void
@@ -458,6 +471,26 @@ spawn_child_setup (SpawnChildData *data)
                 _exit (1);
         }
 
+        if (pwent->pw_dir != NULL) {
+                struct stat statbuf;
+                const char *seat_id;
+                char       *gconf_dir;
+                int         r;
+
+                seat_id = data->seat_id + strlen ("/org/freedesktop/ConsoleKit/");
+                gconf_dir = g_strdup_printf ("%s/%s", pwent->pw_dir, seat_id);
+
+                /* Verify per-seat gconf directory exists, create if needed */
+                r = g_stat (gconf_dir, &statbuf);
+                if (r < 0) {
+                        g_debug ("Making per-seat gconf directory %s", gconf_dir);
+                        g_mkdir (gconf_dir, S_IRWXU | S_IXGRP | S_IRGRP);
+                        g_chmod (gconf_dir, S_IRWXU | S_IXGRP | S_IRGRP);
+                        chown (gconf_dir, pwent->pw_uid, grent->gr_gid);
+                }
+                g_free (gconf_dir);
+        }
+
         g_debug ("GdmWelcomeSession: Setting up run time dir %s", data->runtime_dir);
         g_mkdir (data->runtime_dir, 0755);
         chown (data->runtime_dir, pwent->pw_uid, pwent->pw_gid);
@@ -523,6 +556,7 @@ static gboolean
 spawn_command_line_sync_as_user (const char *command_line,
                                  const char *user_name,
                                  const char *group_name,
+                                 const char *seat_id,
                                  const char *log_file,
                                  char       **env,
                                  char       **std_output,
@@ -549,6 +583,7 @@ spawn_command_line_sync_as_user (const c
         data.user_name = user_name;
         data.group_name = group_name;
         data.log_file = log_file;
+        data.seat_id = seat_id;
 
         local_error = NULL;
         res = g_spawn_sync (NULL,
@@ -579,6 +614,7 @@ static gboolean
 spawn_command_line_async_as_user (const char *command_line,
                                   const char *user_name,
                                   const char *group_name,
+                                  const char *seat_id,
                                   const char *runtime_dir,
                                   const char *log_file,
                                   char      **env,
@@ -605,6 +641,7 @@ spawn_command_line_async_as_user (const 
         data.group_name = group_name;
         data.runtime_dir = runtime_dir;
         data.log_file = log_file;
+        data.seat_id = seat_id;
 
         local_error = NULL;
         res = g_spawn_async (NULL,
@@ -723,6 +760,7 @@ start_dbus_daemon (GdmWelcomeSession *we
         res = spawn_command_line_sync_as_user (DBUS_LAUNCH_COMMAND,
                                                welcome_session->priv->user_name,
                                                welcome_session->priv->group_name,
+                                               welcome_session->priv->x11_display_seat_id,
                                                NULL, /* log file */
                                                (char **)env->pdata,
                                                &std_out,
@@ -811,6 +849,7 @@ gdm_welcome_session_spawn (GdmWelcomeSes
         ret = spawn_command_line_async_as_user (welcome_session->priv->command,
                                                 welcome_session->priv->user_name,
                                                 welcome_session->priv->group_name,
+                                                welcome_session->priv->x11_display_seat_id,
                                                 welcome_session->priv->runtime_dir,
                                                 log_path,
                                                 (char **)env->pdata,
