119 lines
4.4 KiB
Diff
119 lines
4.4 KiB
Diff
|
cstrahan:
|
||
|
|
||
|
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. I've patched `command_from_prefs' so that it ignores
|
||
|
the preferences settings and immediately sets them to whatever the environment
|
||
|
variables are.
|
||
|
|
||
|
When developing an installable package for XQuartz/XQuartz.app, we'll need to
|
||
|
set an `LSEnvironment' entry in the plist for the XQuartz.app, we'll also need
|
||
|
to wrap the XQuartz.app/Contents/MacOS/X11 script (the Xquartz server will
|
||
|
invoke this script during initialization. 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 b403662..b1e2070 100644
|
||
|
--- a/hw/xquartz/mach-startup/bundle-main.c
|
||
|
+++ b/hw/xquartz/mach-startup/bundle-main.c
|
||
|
@@ -77,13 +77,7 @@ FatalError(const char *f, ...) _X_ATTRIBUTE_PRINTF(1, 2) _X_NORETURN;
|
||
|
|
||
|
extern int noPanoramiXExtension;
|
||
|
|
||
|
-#define DEFAULT_CLIENT X11BINDIR "/xterm"
|
||
|
-#define DEFAULT_STARTX X11BINDIR "/startx -- " X11BINDIR "/Xquartz"
|
||
|
-#define DEFAULT_SHELL "/bin/sh"
|
||
|
-
|
||
|
-#ifndef BUILD_DATE
|
||
|
#define BUILD_DATE ""
|
||
|
-#endif
|
||
|
#ifndef XSERVER_VERSION
|
||
|
#define XSERVER_VERSION "?"
|
||
|
#endif
|
||
|
@@ -718,14 +712,14 @@ 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", getenv("XQUARTZ_DEFAULT_CLIENT"));
|
||
|
assert(pref_app_to_run);
|
||
|
|
||
|
- pref_login_shell = command_from_prefs("login_shell", DEFAULT_SHELL);
|
||
|
+ pref_login_shell = command_from_prefs("login_shell", getenv("XQUARTZ_DEFAULT_SHELL"));
|
||
|
assert(pref_login_shell);
|
||
|
|
||
|
pref_startx_script = command_from_prefs("startx_script",
|
||
|
- DEFAULT_STARTX);
|
||
|
+ getenv("XQUARTZ_DEFAULT_STARTX"));
|
||
|
assert(pref_startx_script);
|
||
|
|
||
|
/* Do the fork-twice trick to avoid having to reap zombies */
|
||
|
@@ -804,10 +798,12 @@ execute(const char *command)
|
||
|
static char *
|
||
|
command_from_prefs(const char *key, const char *default_value)
|
||
|
{
|
||
|
+ if (default_value == NULL)
|
||
|
+ return NULL;
|
||
|
+
|
||
|
char *command = NULL;
|
||
|
|
||
|
CFStringRef cfKey;
|
||
|
- CFPropertyListRef PlistRef;
|
||
|
|
||
|
if (!key)
|
||
|
return NULL;
|
||
|
@@ -817,40 +813,24 @@ command_from_prefs(const char *key, const char *default_value)
|
||
|
if (!cfKey)
|
||
|
return NULL;
|
||
|
|
||
|
- PlistRef = CFPreferencesCopyAppValue(cfKey,
|
||
|
- kCFPreferencesCurrentApplication);
|
||
|
+ CFStringRef cfDefaultValue = CFStringCreateWithCString(
|
||
|
+ NULL, default_value, kCFStringEncodingASCII);
|
||
|
+ int len = strlen(default_value) + 1;
|
||
|
|
||
|
- if ((PlistRef == NULL) ||
|
||
|
- (CFGetTypeID(PlistRef) != CFStringGetTypeID())) {
|
||
|
- CFStringRef cfDefaultValue = CFStringCreateWithCString(
|
||
|
- NULL, default_value, kCFStringEncodingASCII);
|
||
|
- int len = strlen(default_value) + 1;
|
||
|
+ if (!cfDefaultValue)
|
||
|
+ goto command_from_prefs_out;
|
||
|
|
||
|
- if (!cfDefaultValue)
|
||
|
- goto command_from_prefs_out;
|
||
|
+ CFPreferencesSetAppValue(cfKey, cfDefaultValue,
|
||
|
+ kCFPreferencesCurrentApplication);
|
||
|
+ CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);
|
||
|
+ CFRelease(cfDefaultValue);
|
||
|
|
||
|
- CFPreferencesSetAppValue(cfKey, cfDefaultValue,
|
||
|
- kCFPreferencesCurrentApplication);
|
||
|
- CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);
|
||
|
- CFRelease(cfDefaultValue);
|
||
|
-
|
||
|
- command = (char *)malloc(len * sizeof(char));
|
||
|
- if (!command)
|
||
|
- goto command_from_prefs_out;
|
||
|
- strcpy(command, default_value);
|
||
|
- }
|
||
|
- else {
|
||
|
- int len = CFStringGetLength((CFStringRef)PlistRef) + 1;
|
||
|
- command = (char *)malloc(len * sizeof(char));
|
||
|
- if (!command)
|
||
|
- goto command_from_prefs_out;
|
||
|
- CFStringGetCString((CFStringRef)PlistRef, command, len,
|
||
|
- kCFStringEncodingASCII);
|
||
|
- }
|
||
|
+ command = (char *)malloc(len * sizeof(char));
|
||
|
+ if (!command)
|
||
|
+ goto command_from_prefs_out;
|
||
|
+ strcpy(command, default_value);
|
||
|
|
||
|
command_from_prefs_out:
|
||
|
- if (PlistRef)
|
||
|
- CFRelease(PlistRef);
|
||
|
if (cfKey)
|
||
|
CFRelease(cfKey);
|
||
|
return command;
|