diff options
Diffstat (limited to 'pkgs/desktops/gnome-3/core')
4 files changed, 86 insertions, 18 deletions
diff --git a/pkgs/desktops/gnome-3/core/gdm/default.nix b/pkgs/desktops/gnome-3/core/gdm/default.nix index 6c810eb46342..f6049c8bda8c 100644 --- a/pkgs/desktops/gnome-3/core/gdm/default.nix +++ b/pkgs/desktops/gnome-3/core/gdm/default.nix @@ -37,13 +37,27 @@ stdenv.mkDerivation rec { # Disable Access Control because our X does not support FamilyServerInterpreted yet patches = [ + # Change hardcoded paths to nix store paths. (substituteAll { src = ./fix-paths.patch; inherit coreutils plymouth xwayland; }) + + # The following patches implement certain environment variables in GDM which are set by + # the gdm configuration module (nixos/modules/services/x11/display-managers/gdm.nix). + + # Look for session definition files in the directory specified by GDM_SESSIONS_DIR. ./sessions_dir.patch + + # Allow specifying X server arguments with GDM_X_SERVER_EXTRA_ARGS. ./gdm-x-session_extra_args.patch - ./gdm-session-worker_xserver-path.patch + + # Allow specifying a wrapper for running the session command. + ./gdm-x-session_session-wrapper.patch + + # Forwards certain environment variables to the gdm-x-session child process + # to ensure that the above two patches actually work. + ./gdm-session-worker_forward-vars.patch ]; installFlags = [ diff --git a/pkgs/desktops/gnome-3/core/gdm/gdm-session-worker_forward-vars.patch b/pkgs/desktops/gnome-3/core/gdm/gdm-session-worker_forward-vars.patch new file mode 100644 index 000000000000..401b6aea0c28 --- /dev/null +++ b/pkgs/desktops/gnome-3/core/gdm/gdm-session-worker_forward-vars.patch @@ -0,0 +1,31 @@ +diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c +index 9ef4c5b..94da834 100644 +--- a/daemon/gdm-session-worker.c ++++ b/daemon/gdm-session-worker.c +@@ -1515,6 +1515,16 @@ gdm_session_worker_load_env_d (GdmSessionWorker *worker) + g_object_unref (dir); + } + ++static void ++gdm_session_worker_forward_var (GdmSessionWorker *worker, char const *var) ++{ ++ char const *value = g_getenv(var); ++ if (value != NULL) { ++ g_debug ("forwarding %s= %s", var, value); ++ gdm_session_worker_set_environment_variable(worker, var, value); ++ } ++} ++ + static gboolean + gdm_session_worker_accredit_user (GdmSessionWorker *worker, + GError **error) +@@ -1559,6 +1569,9 @@ gdm_session_worker_accredit_user (GdmSessionWorker *worker, + goto out; + } + ++ gdm_session_worker_forward_var(worker, "GDM_X_SERVER_EXTRA_ARGS"); ++ gdm_session_worker_forward_var(worker, "GDM_X_SESSION_WRAPPER"); ++ + gdm_session_worker_update_environment_from_passwd_info (worker, + uid, + gid, diff --git a/pkgs/desktops/gnome-3/core/gdm/gdm-session-worker_xserver-path.patch b/pkgs/desktops/gnome-3/core/gdm/gdm-session-worker_xserver-path.patch deleted file mode 100644 index d020752fef3a..000000000000 --- a/pkgs/desktops/gnome-3/core/gdm/gdm-session-worker_xserver-path.patch +++ /dev/null @@ -1,17 +0,0 @@ -diff --git a/daemon/gdm-session-worker.c.orig b/daemon/gdm-session-worker.c -index 7bbda49..592691d 100644 ---- a/daemon/gdm-session-worker.c.orig -+++ b/daemon/gdm-session-worker.c -@@ -1557,6 +1557,12 @@ gdm_session_worker_accredit_user (GdmSessionWorker *worker, - goto out; - } - -+ if (g_getenv ("GDM_X_SERVER_EXTRA_ARGS") != NULL) { -+ g_debug ("forwarding GDM_X_SERVER_EXTRA_ARGS= %s", g_getenv("GDM_X_SERVER_EXTRA_ARGS")); -+ gdm_session_worker_set_environment_variable (worker, "GDM_X_SERVER_EXTRA_ARGS", -+ g_getenv("GDM_X_SERVER_EXTRA_ARGS")); -+ } -+ - gdm_session_worker_update_environment_from_passwd_info (worker, - uid, - gid, diff --git a/pkgs/desktops/gnome-3/core/gdm/gdm-x-session_session-wrapper.patch b/pkgs/desktops/gnome-3/core/gdm/gdm-x-session_session-wrapper.patch new file mode 100644 index 000000000000..58481f0730fa --- /dev/null +++ b/pkgs/desktops/gnome-3/core/gdm/gdm-x-session_session-wrapper.patch @@ -0,0 +1,40 @@ +diff --git a/daemon/gdm-x-session.c b/daemon/gdm-x-session.c +index 88fe96f..b1b140a 100644 +--- a/daemon/gdm-x-session.c ++++ b/daemon/gdm-x-session.c +@@ -664,18 +664,34 @@ spawn_session (State *state, + state->session_command, + NULL); + } else { ++ char const *session_wrapper; ++ char *eff_session_command; + int ret; + char **argv; + +- ret = g_shell_parse_argv (state->session_command, ++ session_wrapper = g_getenv("GDM_X_SESSION_WRAPPER"); ++ if (session_wrapper != NULL) { ++ char *quoted_wrapper = g_shell_quote(session_wrapper); ++ eff_session_command = g_strjoin(" ", quoted_wrapper, state->session_command, NULL); ++ g_free(quoted_wrapper); ++ } else { ++ eff_session_command = state->session_command; ++ } ++ ++ ret = g_shell_parse_argv (eff_session_command, + NULL, + &argv, + &error); + ++ if (session_wrapper != NULL) { ++ g_free(eff_session_command); ++ } ++ + if (!ret) { + g_debug ("could not parse session arguments: %s", error->message); + goto out; + } ++ + subprocess = g_subprocess_launcher_spawnv (launcher, + (const char * const *) argv, + &error); |