summary refs log tree commit diff
path: root/pkgs/desktops/gnome-3/core/gdm
diff options
context:
space:
mode:
authorMatthew Bauer <mjbauer95@gmail.com>2018-10-03 22:56:53 -0500
committerGitHub <noreply@github.com>2018-10-03 22:56:53 -0500
commit1ffe83caa7c521366780233f02c1ae092a20a782 (patch)
tree7e44c6431dada15cff84c2ae5b677802c55aac9e /pkgs/desktops/gnome-3/core/gdm
parent06961cccd08bf99fe757ad7162086e37b5b28bda (diff)
parentf26153754a1b6ac0d72adde9c75e1473463b4dbb (diff)
downloadnixpkgs-1ffe83caa7c521366780233f02c1ae092a20a782.tar
nixpkgs-1ffe83caa7c521366780233f02c1ae092a20a782.tar.gz
nixpkgs-1ffe83caa7c521366780233f02c1ae092a20a782.tar.bz2
nixpkgs-1ffe83caa7c521366780233f02c1ae092a20a782.tar.lz
nixpkgs-1ffe83caa7c521366780233f02c1ae092a20a782.tar.xz
nixpkgs-1ffe83caa7c521366780233f02c1ae092a20a782.tar.zst
nixpkgs-1ffe83caa7c521366780233f02c1ae092a20a782.zip
Merge pull request #42846 from ambrop72/optimus-prime-config-master
nixos/xserver: Implement configuration of NVIDIA Optimus via PRIME
Diffstat (limited to 'pkgs/desktops/gnome-3/core/gdm')
-rw-r--r--pkgs/desktops/gnome-3/core/gdm/default.nix16
-rw-r--r--pkgs/desktops/gnome-3/core/gdm/gdm-session-worker_forward-vars.patch31
-rw-r--r--pkgs/desktops/gnome-3/core/gdm/gdm-session-worker_xserver-path.patch17
-rw-r--r--pkgs/desktops/gnome-3/core/gdm/gdm-x-session_session-wrapper.patch40
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 6c810eb4634..f6049c8bda8 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 00000000000..401b6aea0c2
--- /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 d020752fef3..00000000000
--- 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 00000000000..58481f0730f
--- /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);