diff --git a/configure.ac b/configure.ac index 570a6885c..8ad331d65 100644 --- a/configure.ac +++ b/configure.ac @@ -1545,7 +1545,7 @@ if test "x$XQUARTZ" = xyes; then AC_CHECK_LIB([Xplugin],[xp_init],[:]) - CFLAGS="${CFLAGS} -DROOTLESS_WORKAROUND -DNO_ALLOCA" + CFLAGS="${CFLAGS} -DROOTLESS_WORKAROUND -DNO_ALLOCA -DXQUARTZ_EXPORTS_LAUNCHD_FD" fi # Support for objc in autotools is minimal and not documented. diff --git a/hw/xquartz/X11Application.m b/hw/xquartz/X11Application.m index 1f90b240c..c6c9c59ab 100644 --- a/hw/xquartz/X11Application.m +++ b/hw/xquartz/X11Application.m @@ -202,12 +202,6 @@ static void message_kit_thread (SEL selector, NSObject *arg) { for_appkit = YES; for_x = YES; -// fprintf(stderr, "fd_add_count: %d\n", fd_add_count); - if(fd_add_count) { - DarwinProcessFDAdditionQueue(); - fprintf(stderr, "ran it - fd_add_count: %d\n", fd_add_count); - } - switch (type) { case NSLeftMouseDown: case NSRightMouseDown: case NSOtherMouseDown: case NSLeftMouseUp: case NSRightMouseUp: case NSOtherMouseUp: diff --git a/hw/xquartz/darwinEvents.c b/hw/xquartz/darwinEvents.c index 900ee4387..da10e208e 100644 --- a/hw/xquartz/darwinEvents.c +++ b/hw/xquartz/darwinEvents.c @@ -327,9 +327,12 @@ static void DarwinEventHandler(int screenNum, xEventPtr xe, DeviceIntPtr dev, in } } +int xquartz_launchd_fd = -1; + void DarwinListenOnOpenFD(int fd) { ErrorF("DarwinListenOnOpenFD: %d\n", fd); +#if 0 pthread_mutex_lock(&fd_add_lock); if(fd_add_count < FD_ADD_MAX) fd_add[fd_add_count++] = fd; @@ -337,6 +340,9 @@ void DarwinListenOnOpenFD(int fd) { ErrorF("FD Addition buffer at max. Dropping fd addition request.\n"); pthread_mutex_unlock(&fd_add_lock); +#else + xquartz_launchd_fd = fd; +#endif } void DarwinProcessFDAdditionQueue() { diff --git a/hw/xquartz/mach-startup/Makefile.am b/hw/xquartz/mach-startup/Makefile.am index 2da30625f..9b2619dd9 100644 --- a/hw/xquartz/mach-startup/Makefile.am +++ b/hw/xquartz/mach-startup/Makefile.am @@ -1,12 +1,13 @@ AM_CPPFLAGS = \ -DBUILD_DATE=\"$(BUILD_DATE)\" \ - -DXSERVER_VERSION=\"$(VERSION)\" + -DXSERVER_VERSION=\"$(VERSION)\" \ + -DMACHO_STARTUP x11appdir = $(APPLE_APPLICATIONS_DIR)/X11.app/Contents/MacOS x11app_PROGRAMS = X11 dist_X11_SOURCES = \ - bundle-main.c + bundle-main.c # launchd_fd.c nodist_X11_SOURCES = \ diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c index 9894ae8b2..7c4d52cc5 100644 --- a/hw/xquartz/mach-startup/bundle-main.c +++ b/hw/xquartz/mach-startup/bundle-main.c @@ -82,6 +82,7 @@ static pthread_t create_thread(void *func, void *arg) { return tid; } +#ifdef MACHO_STARTUP /*** Mach-O IPC Stuffs ***/ union MaxMsgSize { @@ -293,13 +294,18 @@ kern_return_t do_start_x11_server(mach_port_t port, string_array_t argv, } int startup_trigger(int argc, char **argv, char **envp) { +#else +void *add_launchd_display_thread(void *data); + +int main(int argc, char **argv, char **envp) { +#endif Display *display; const char *s; - size_t i; - /* Take care of the case where we're called like a normal DDX */ if(argc > 1 && argv[1][0] == ':') { +#ifdef MACHO_STARTUP + size_t i; kern_return_t kr; mach_port_t mp; string_array_t newenvp; @@ -339,6 +345,10 @@ int startup_trigger(int argc, char **argv, char **envp) { exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); +#else + create_thread(add_launchd_display_thread, NULL); + return server_main(argc, argv, envp); +#endif } /* If we have a process serial number and it's our only arg, act as if @@ -368,6 +378,7 @@ int startup_trigger(int argc, char **argv, char **envp) { return execute(command_from_prefs("startx_script", DEFAULT_STARTX)); } +#ifdef MACHO_STARTUP /*** Main ***/ int main(int argc, char **argv, char **envp) { Bool listenOnly = FALSE; @@ -412,6 +423,17 @@ int main(int argc, char **argv, char **envp) { return EXIT_SUCCESS; } +#else + +void *add_launchd_display_thread(void *data) { + /* Start listening on the launchd fd */ + int launchd_fd = launchd_display_fd(); + if(launchd_fd != -1) { + DarwinListenOnOpenFD(launchd_fd); + } + return NULL; +} +#endif static int execute(const char *command) { const char *newargv[7]; @@ -427,7 +449,7 @@ static int execute(const char *command) { fprintf(stderr, "X11.app: Launching %s:\n", command); for(s=newargv; *s; s++) { - fprintf(stderr, "\targv[%d] = %s\n", s - newargv, *s); + fprintf(stderr, "\targv[%ld] = %s\n", (long int)(s - newargv), *s); } execvp (newargv[0], (char * const *) newargv); diff --git a/hw/xquartz/mach-startup/stub.c b/hw/xquartz/mach-startup/stub.c index 9928aa9ae..003c4dd28 100644 --- a/hw/xquartz/mach-startup/stub.c +++ b/hw/xquartz/mach-startup/stub.c @@ -115,6 +115,7 @@ static void set_x11_path() { } } +#ifdef MACHO_STARTUP static int create_socket(char *filename_out) { struct sockaddr_un servaddr_un; struct sockaddr *servaddr; @@ -218,7 +219,10 @@ static void send_fd_handoff(int handoff_fd, int launchd_fd) { #endif } +#endif + int main(int argc, char **argv, char **envp) { +#ifdef MACHO_STARTUP int envpc; kern_return_t kr; mach_port_t mp; @@ -227,6 +231,7 @@ int main(int argc, char **argv, char **envp) { size_t i; int launchd_fd; string_t handoff_socket_filename; +#endif sig_t handler; if(argc == 2 && !strcmp(argv[1], "-version")) { @@ -244,7 +249,8 @@ int main(int argc, char **argv, char **envp) { if(handler == SIG_IGN) kill(getppid(), SIGUSR1); signal(SIGUSR1, handler); - + +#ifdef MACHO_STARTUP /* Get the $DISPLAY FD */ launchd_fd = launchd_display_fd(); @@ -325,4 +331,9 @@ int main(int argc, char **argv, char **envp) { return EXIT_FAILURE; } return EXIT_SUCCESS; +#else + set_x11_path(); + argv[0] = x11_path; + return execvp(x11_path, argv); +#endif }