From 9eb5f3092984206ac7cab9a9fdb4b19448db3a24 Mon Sep 17 00:00:00 2001 From: Jeremy Huddleston Date: Mon, 8 Dec 2008 21:00:11 -0800 Subject: [PATCH] XQuartz: unsetenv(DISPLAY) if we're not org.x.X11 Also some prefix related fixes. (cherry picked from commit fd459e96581a883e30323c840b71004aa0747169) (cherry picked from commit 99b2cbf061a9d074e66e6220dc08f8b4624ea6bb) --- configure.ac | 9 +++ hw/xquartz/Makefile.am | 3 +- hw/xquartz/X11Application.m | 2 +- .../bundle/{Info.plist => Info.plist.cpp} | 6 +- hw/xquartz/bundle/Makefile.am | 15 ++++- hw/xquartz/bundle/cpprules.in | 37 ++++++++++++ hw/xquartz/mach-startup/bundle-main.c | 58 ++++++++++++------- 7 files changed, 101 insertions(+), 29 deletions(-) rename hw/xquartz/bundle/{Info.plist => Info.plist.cpp} (89%) create mode 100644 hw/xquartz/bundle/cpprules.in diff --git a/configure.ac b/configure.ac index 486dad869..efe347f8a 100644 --- a/configure.ac +++ b/configure.ac @@ -63,6 +63,7 @@ AC_PROG_LEX AC_PROG_YACC AC_SYS_LARGEFILE XORG_PROG_RAWCPP +AC_PATH_PROG(SED,sed) dnl Check for dtrace program (needed to build Xserver dtrace probes) dnl Also checks for , since some Linux distros have an @@ -485,6 +486,14 @@ AC_ARG_WITH(apple-applications-dir,AS_HELP_STRING([--with-apple-applications-dir [ APPLE_APPLICATIONS_DIR="${withval}" ], [ APPLE_APPLICATIONS_DIR="/Applications/Utilities" ]) AC_SUBST([APPLE_APPLICATIONS_DIR]) +AC_ARG_WITH(apple-application-name,AS_HELP_STRING([--with-apple-application-name=NAME], [Name for the .app (default: X11)]), + [ APPLE_APPLICATION_NAME="${withval}" ], + [ APPLE_APPLICATION_NAME="X11" ]) +AC_SUBST([APPLE_APPLICATION_NAME]) +AC_ARG_WITH(apple-application-id,AS_HELP_STRING([--with-apple-application-id=VALUE], [CFBundleIdentification for the .app (default: org.x.X11)]), + [ APPLE_APPLICATION_ID="${withval}" ], + [ APPLE_APPLICATION_ID="org.x.X11" ]) +AC_SUBST([APPLE_APPLICATION_ID]) AC_ARG_ENABLE(builddocs, AS_HELP_STRING([--enable-builddocs], [Build docs (default: disabled)]), [BUILDDOCS=$enableval], [BUILDDOCS=no]) diff --git a/hw/xquartz/Makefile.am b/hw/xquartz/Makefile.am index d1eb283e4..e5e2e9e37 100644 --- a/hw/xquartz/Makefile.am +++ b/hw/xquartz/Makefile.am @@ -7,7 +7,8 @@ AM_CPPFLAGS = \ -DINXQUARTZ \ -DUSE_NEW_CLUT \ -DXFree86Server \ - -I$(top_srcdir)/miext/rootless + -I$(top_srcdir)/miext/rootless \ + -DX11LIBDIR=\"$(libdir)\" if GLX GL_DIR = GL diff --git a/hw/xquartz/X11Application.m b/hw/xquartz/X11Application.m index 21013d90d..371b6d69d 100644 --- a/hw/xquartz/X11Application.m +++ b/hw/xquartz/X11Application.m @@ -54,7 +54,7 @@ // pbproxy/pbproxy.h extern BOOL xpbproxy_init (void); -#define DEFAULTS_FILE "/usr/X11/lib/X11/xserver/Xquartz.plist" +#define DEFAULTS_FILE X11LIBDIR"/X11/xserver/Xquartz.plist" #ifndef XSERVER_VERSION #define XSERVER_VERSION "?" diff --git a/hw/xquartz/bundle/Info.plist b/hw/xquartz/bundle/Info.plist.cpp similarity index 89% rename from hw/xquartz/bundle/Info.plist rename to hw/xquartz/bundle/Info.plist.cpp index f4a928738..16434f268 100644 --- a/hw/xquartz/bundle/Info.plist +++ b/hw/xquartz/bundle/Info.plist.cpp @@ -7,15 +7,15 @@ CFBundleExecutable X11 CFBundleGetInfoString - X11 + APPLE_APPLICATION_NAME CFBundleIconFile X11.icns CFBundleIdentifier - org.x.X11 + APPLE_APPLICATION_ID CFBundleInfoDictionaryVersion 6.0 CFBundleName - X11 + APPLE_APPLICATION_NAME CFBundlePackageType APPL CFBundleShortVersionString diff --git a/hw/xquartz/bundle/Makefile.am b/hw/xquartz/bundle/Makefile.am index 7b76f846b..e765d6e41 100644 --- a/hw/xquartz/bundle/Makefile.am +++ b/hw/xquartz/bundle/Makefile.am @@ -1,12 +1,23 @@ +include cpprules.in + +CPP_FILES_FLAGS = \ + -DAPPLE_APPLICATION_ID="$(APPLE_APPLICATION_ID)" \ + -DAPPLE_APPLICATION_NAME="$(APPLE_APPLICATION_NAME)" + install-data-hook: - ./mk_bundke.sh $(DESTDIR)$(APPLE_APPLICATIONS_DIR)/X11.app + ./mk_bundke.sh $(DESTDIR)$(APPLE_APPLICATIONS_DIR)/$(APPLE_APPLICATION_NAME).app + +noinst_PRE = Info.plist.cpp +noinst_DATA = $(noinst_PRE:plist.cpp=plist) + +CLEANFILES = $(noinst_DATA) resourcedir=$(libdir)/X11/xserver resource_DATA = Xquartz.plist EXTRA_DIST = \ mk_bundke.sh \ - Info.plist \ + Info.plist.cpp \ PkgInfo \ $(resource_DATA) \ Resources/da.lproj/InfoPlist.strings \ diff --git a/hw/xquartz/bundle/cpprules.in b/hw/xquartz/bundle/cpprules.in new file mode 100644 index 000000000..f32eafc06 --- /dev/null +++ b/hw/xquartz/bundle/cpprules.in @@ -0,0 +1,37 @@ +# Translate XCOMM into pound sign with sed, rather than passing -DXCOMM=XCOMM +# to cpp, because that trick does not work on all ANSI C preprocessors. +# Delete line numbers from the cpp output (-P is not portable, I guess). +# Allow XCOMM to be preceded by whitespace and provide a means of generating +# output lines with trailing backslashes. +# Allow XHASH to always be substituted, even in cases where XCOMM isn't. + +CPP_SED_MAGIC = $(SED) -e '/^\# *[0-9][0-9]* *.*$$/d' \ + -e '/^\#line *[0-9][0-9]* *.*$$/d' \ + -e '/^[ ]*XCOMM$$/s/XCOMM/\#/' \ + -e '/^[ ]*XCOMM[^a-zA-Z0-9_]/s/XCOMM/\#/' \ + -e '/^[ ]*XHASH/s/XHASH/\#/' \ + -e '/XSLASHGLOB/s/XSLASHGLOB/\/\*/' \ + -e '/\@\@$$/s/\@\@$$/\\/' + +# Strings to replace in man pages +XORGRELSTRING = @PACKAGE_STRING@ + XORGMANNAME = X Version 11 + +MANDEFS = \ + -D__xorgversion__="\"$(XORGRELSTRING)\" \"$(XORGMANNAME)\"" \ + -D__appmansuffix__=$(APP_MAN_SUFFIX) \ + -D__filemansuffix__=$(FILE_MAN_SUFFIX) \ + -D__libmansuffix__=$(LIB_MAN_SUFFIX) \ + -D__miscmansuffix__=$(MISC_MAN_SUFFIX) \ + -D__XSERVERNAME__=Xorg -D__XCONFIGFILE__=xorg.conf \ + -D__xinitdir__=$(XINITDIR) \ + -D__bindir__=$(bindir) \ + -DSHELL_CMD=$(SHELL_CMD) $(ARCHMANDEFS) + +SUFFIXES = .$(APP_MAN_SUFFIX) .man .cpp + +.cpp: + $(RAWCPP) $(RAWCPPFLAGS) $(CPP_FILES_FLAGS) < $< | $(CPP_SED_MAGIC) > $@ + +.man.$(APP_MAN_SUFFIX): + $(RAWCPP) $(RAWCPPFLAGS) $(MANDEFS) $(EXTRAMANDEFS) < $< | $(CPP_SED_MAGIC) > $@ diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c index 0e4ed3411..8b6d45849 100644 --- a/hw/xquartz/mach-startup/bundle-main.c +++ b/hw/xquartz/mach-startup/bundle-main.c @@ -59,8 +59,8 @@ extern int noPanoramiXExtension; extern int xquartz_resetenv_display; -#define DEFAULT_CLIENT "/usr/X11/bin/xterm" -#define DEFAULT_STARTX "/usr/X11/bin/startx" +#define DEFAULT_CLIENT X11BINDIR "/xterm" +#define DEFAULT_STARTX X11BINDIR "/startx" #define DEFAULT_SHELL "/bin/sh" #ifndef BUILD_DATE @@ -420,19 +420,49 @@ int startup_trigger(int argc, char **argv, char **envp) { } /** Setup the environment we want our child processes to inherit */ -static void setup_env() { +static void ensure_path(const char *dir) { char buf[1024], *temp; - + /* Make sure /usr/X11/bin is in the $PATH */ temp = getenv("PATH"); if(temp == NULL || temp[0] == 0) { - snprintf(buf, sizeof(buf), "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:%s", X11BINDIR); + snprintf(buf, sizeof(buf), "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:%s", dir); setenv("PATH", buf, TRUE); } else if(strnstr(temp, X11BINDIR, sizeof(temp)) == NULL) { - snprintf(buf, sizeof(buf), "%s:%s", temp, X11BINDIR); + snprintf(buf, sizeof(buf), "%s:%s", temp, dir); setenv("PATH", buf, TRUE); } +} +static void setup_env() { + char *temp; + const char *pds = NULL; + + /* Pass on our prefs domain to startx and its inheritors (mainly for + * quartz-wm and the Xquartz stub's MachIPC) + */ + CFBundleRef bundle = CFBundleGetMainBundle(); + if(bundle) { + CFStringRef pd = CFBundleGetIdentifier(bundle); + if(pd) { + pds = CFStringGetCStringPtr(pd, 0); + if(pds) { + server_bootstrap_name = malloc(sizeof(char) * (strlen(pds) + 1)); + strcpy(server_bootstrap_name, pds); + setenv("X11_PREFS_DOMAIN", pds, 1); + } + } + } + + /* If we're not org.x.X11, we want to unset DISPLAY, so we don't + * use the launchd DISPLAY socket. + */ + if(pds == NULL || strcmp(pds, "org.x.X11") != 0) + unsetenv("DISPLAY"); + + /* Make sure PATH is right */ + ensure_path(X11BINDIR); + /* cd $HOME */ temp = getenv("HOME"); if(temp != NULL && temp[0] != '\0') @@ -455,22 +485,6 @@ int main(int argc, char **argv, char **envp) { /* Setup the initial crasherporter info */ strlcpy(__crashreporter_info__, __crashreporter_info__base, __crashreporter_info__len); - - /* Pass on our prefs domain to startx and its inheritors (mainly for - * quartz-wm and the Xquartz stub's MachIPC) - */ - CFBundleRef bundle = CFBundleGetMainBundle(); - if(bundle) { - CFStringRef pd = CFBundleGetIdentifier(bundle); - if(pd) { - const char *pds = CFStringGetCStringPtr(pd, 0); - if(pds) { - server_bootstrap_name = malloc(sizeof(char) * (strlen(pds) + 1)); - strcpy(server_bootstrap_name, pds); - setenv("X11_PREFS_DOMAIN", pds, 1); - } - } - } fprintf(stderr, "X11.app: main(): argc=%d\n", argc); for(i=0; i < argc; i++) {