nixpkgs/pkgs/servers/x11/xorg/darwin/bundle_main.patch
Quentin Smith d2cd23b9de
xorg.xorgserver: Restore XQuartz.app's usage of environment variables.
XQuartz.app needs to be able to find the `startx' from the `xinit'
package, but it defaults to assuming it is in the same directory as
the Xquartz binary, which it will never be. This restores a patch that
uses environment variables to locate `startx', which is what the
`xquartz' package is expecting to use.
2023-04-26 01:43:24 -04:00

84 lines
3.2 KiB
Diff

This patch makes it possible (and necessary) to specify the default
shell, xterm client, and startx script from environment variables. These
defaults are used when launching the XQuartz.app, which in turn needs to know
how to start the X server. `startx' comes from the `xinit' package,
which also has a dependency on `xorg-server', so we can't hardcode
sane defaults. If the environment variables are specified, they
override any value in the preferences settings.
When developing an installable package for XQuartz/XQuartz.app, we'll
need to set an `LSEnvironment' entry in the plist for the XQuartz.app.
(See stub.patch for more details.).
diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c
index de82e2280..da58a5d44 100644
--- a/hw/xquartz/mach-startup/bundle-main.c
+++ b/hw/xquartz/mach-startup/bundle-main.c
@@ -76,8 +76,6 @@ extern int noPanoramiXExtension;
extern Bool noCompositeExtension;
#endif
-#define DEFAULT_CLIENT X11BINDIR "/xterm"
-#define DEFAULT_STARTX X11BINDIR "/startx -- " X11BINDIR "/Xquartz"
#define DEFAULT_SHELL "/bin/sh"
#define _STRINGIZE(s) #s
@@ -108,7 +106,7 @@ server_main(int argc, char **argv, char **envp);
static int
execute(const char *command);
static char *
-command_from_prefs(const char *key, const char *default_value);
+command_from_prefs(const char *key, const char *env_name, const char *default_value);
static char *pref_app_to_run;
static char *pref_login_shell;
@@ -669,14 +667,19 @@ main(int argc, char **argv, char **envp)
pid_t child1, child2;
int status;
- pref_app_to_run = command_from_prefs("app_to_run", DEFAULT_CLIENT);
+ pref_app_to_run = command_from_prefs("app_to_run",
+ "XQUARTZ_DEFAULT_CLIENT",
+ NULL);
assert(pref_app_to_run);
- pref_login_shell = command_from_prefs("login_shell", DEFAULT_SHELL);
+ pref_login_shell = command_from_prefs("login_shell",
+ "XQUARTZ_DEFAULT_SHELL",
+ DEFAULT_SHELL);
assert(pref_login_shell);
pref_startx_script = command_from_prefs("startx_script",
- DEFAULT_STARTX);
+ "XQUARTZ_DEFAULT_STARTX",
+ NULL);
assert(pref_startx_script);
/* Do the fork-twice trick to avoid having to reap zombies */
@@ -753,7 +756,7 @@ execute(const char *command)
}
static char *
-command_from_prefs(const char *key, const char *default_value)
+command_from_prefs(const char *key, const char *env_name, const char *default_value)
{
char *command = NULL;
@@ -763,6 +766,17 @@ command_from_prefs(const char *key, const char *default_value)
if (!key)
return NULL;
+ if (env_name != NULL) {
+ command = getenv(env_name);
+ if (command != NULL) {
+ return strdup(command);
+ }
+ }
+
+ if (!default_value) {
+ return NULL;
+ }
+
cfKey = CFStringCreateWithCString(NULL, key, kCFStringEncodingASCII);
if (!cfKey)