XQuartz: Move the launchd display grabbing into mach_startup

(cherry picked from commit c3866c98d23020d2151977ee1177b6054d05832e)
This commit is contained in:
Jeremy Huddleston 2008-05-23 01:39:02 -07:00
parent 3a22190061
commit 225dddbaed
2 changed files with 33 additions and 31 deletions

View File

@ -45,9 +45,6 @@
#include "X11/extensions/applewm.h"
#include "micmap.h"
#include "os.h"
#include "mach-startup/launchd_fd.h"
#include <mach/mach.h>
#include <unistd.h>
@ -815,14 +812,6 @@ void X11ApplicationMain (int argc, char **argv, char **envp) {
/* Tell the server thread that it can proceed */
QuartzInitServer(argc, argv, envp);
#ifndef NEW_LAUNCH_METHOD
/* Start listening on the launchd fd */
int launchd_fd = launchd_display_fd();
if(launchd_fd != -1) {
DarwinListenOnOpenFD(launchd_fd);
}
#endif
[NSApp run];
/* not reached */
}

View File

@ -47,6 +47,10 @@
#include "mach_startup.h"
#include "mach_startupServer.h"
#include "launchd_fd.h"
void DarwinListenOnOpenFD(int fd);
#define DEFAULT_CLIENT "/usr/X11/bin/xterm"
#define DEFAULT_STARTX "/usr/X11/bin/startx"
#define DEFAULT_SHELL "/bin/sh"
@ -60,8 +64,21 @@ int 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);
#ifdef NEW_LAUNCH_METHOD
/*** Pthread Magics ***/
static pthread_t create_thread(void *func, void *arg) {
pthread_attr_t attr;
pthread_t tid;
pthread_attr_init (&attr);
pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
pthread_create (&tid, &attr, func, arg);
pthread_attr_destroy (&attr);
return tid;
}
#ifdef NEW_LAUNCH_METHOD
struct arg {
int argc;
char **argv;
@ -106,20 +123,6 @@ static mach_port_t checkin_or_register(char *bname) {
return mp;
}
/*** Pthread Magics ***/
static pthread_t create_thread(void *func, void *arg) {
pthread_attr_t attr;
pthread_t tid;
pthread_attr_init (&attr);
pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
pthread_create (&tid, &attr, func, arg);
pthread_attr_destroy (&attr);
return tid;
}
/*** $DISPLAY handoff ***/
/* From darwinEvents.c ... but don't want to pull in all the server cruft */
void DarwinListenOnOpenFD(int fd);
@ -289,6 +292,8 @@ 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;
@ -345,6 +350,7 @@ int main(int argc, char **argv, char **envp) {
}
exit(EXIT_SUCCESS);
#else
create_thread(add_launchd_display_thread, NULL);
return server_main(argc, argv, envp);
#endif
}
@ -356,14 +362,9 @@ int main(int argc, char **argv, char **envp) {
/* Now, try to open a display, if so, run the launcher */
display = XOpenDisplay(NULL);
if(display) {
fprintf(stderr, "X11.app: Closing the display and sleeping for 2s to allow the X server to start up.\n");
/* Could open the display, start the launcher */
XCloseDisplay(display);
/* Give 2 seconds for the server to start...
* TODO: *Really* fix this race condition
*/
usleep(2000);
return execute(command_from_prefs("app_to_run", DEFAULT_CLIENT));
}
}
@ -434,6 +435,18 @@ int main(int argc, char **argv, char **envp) {
return EXIT_SUCCESS;
}
#else
void *add_launchd_display_thread(void *data) {
/* TODO: Really fix this race */
sleep(5);
/* 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) {