XQuartz: pbproxy: Wait for the server to finish starting up, so display is valid.

Signed-off-by: Jeremy Huddleston <jeremyhu@freedesktop.org>
This commit is contained in:
Jeremy Huddleston 2009-10-27 17:16:57 -07:00
parent 15fc56addc
commit e87a03fd53
2 changed files with 20 additions and 0 deletions

View File

@ -37,7 +37,11 @@
static const char *app_prefs_domain = "org.x.X11";
CFStringRef app_prefs_domain_cfstr;
/* Stubs */
char *display = NULL;
BOOL serverInitComplete = YES;
pthread_mutex_t serverInitCompleteMutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t serverInitCompleteCond = PTHREAD_COND_INITIALIZER;
static void signal_handler (int sig) {
switch(sig) {

View File

@ -47,6 +47,20 @@ BOOL xpbproxy_is_standalone = NO;
x_selection *_selection_object;
extern BOOL serverInitComplete;
extern pthread_mutex_t serverInitCompleteMutex;
extern pthread_cond_t serverInitCompleteCond;
static inline void wait_for_server_init(void) {
/* If the server hasn't finished initializing, wait for it... */
if(!serverInitComplete) {
pthread_mutex_lock(&serverInitCompleteMutex);
while(!serverInitComplete)
pthread_cond_wait(&serverInitCompleteCond, &serverInitCompleteMutex);
pthread_mutex_unlock(&serverInitCompleteMutex);
}
}
static int x_io_error_handler (Display *dpy) {
/* We lost our connection to the server. */
@ -85,6 +99,8 @@ static void *xpbproxy_x_thread(void *args) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
size_t i;
wait_for_server_init();
for(i=0, xpbproxy_dpy=NULL; !xpbproxy_dpy && i<5; i++) {
xpbproxy_dpy = XOpenDisplay(NULL);