Xquartz: xpbproxy: Split out app-specific stuff to app-main.m in prep for making this into a thread.
(cherry picked from commit c2012138a520560f8a2160518ea73fced410c3b7)
This commit is contained in:
parent
5446adebfb
commit
b7ad86ff8a
|
@ -3,6 +3,7 @@ AM_LDFLAGS=-L/usr/X11/lib -lX11 -lAppleWM -framework AppKit -framework Foundatio
|
||||||
|
|
||||||
SOURCE_FILES = \
|
SOURCE_FILES = \
|
||||||
trick_autotools.c \
|
trick_autotools.c \
|
||||||
|
main.m \
|
||||||
x-input.m \
|
x-input.m \
|
||||||
x-selection.m
|
x-selection.m
|
||||||
|
|
||||||
|
@ -12,7 +13,7 @@ libxpbproxy_la_SOURCES = $(SOURCE_FILES)
|
||||||
if !INTEGRATED_XPBPROXY
|
if !INTEGRATED_XPBPROXY
|
||||||
|
|
||||||
bin_PROGRAMS = xpbproxy
|
bin_PROGRAMS = xpbproxy
|
||||||
xpbproxy_SOURCES = main.m
|
xpbproxy_SOURCES = app-main.m
|
||||||
xpbproxy_LDADD = $(top_builddir)/hw/xquartz/pbproxy/libxpbproxy.la
|
xpbproxy_LDADD = $(top_builddir)/hw/xquartz/pbproxy/libxpbproxy.la
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
/* main.m
|
||||||
|
$Id: main.m,v 1.29 2007-04-07 20:39:03 jharper Exp $
|
||||||
|
|
||||||
|
Copyright (c) 2002 Apple Computer, Inc. All rights reserved. */
|
||||||
|
|
||||||
|
#include "pbproxy.h"
|
||||||
|
#import "x-selection.h"
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <unistd.h> /*for getpid*/
|
||||||
|
|
||||||
|
#include <X11/extensions/applewm.h>
|
||||||
|
|
||||||
|
/* X11 code */
|
||||||
|
static void x_shutdown (void) {
|
||||||
|
/*gstaplin: signal_handler() calls this, and I don't think these are async-signal safe. */
|
||||||
|
/*TODO use a socketpair() to trigger a cleanup. This is totally unsafe according to Jordan. It's a segfault waiting to happen on a signal*/
|
||||||
|
|
||||||
|
[_selection_object release];
|
||||||
|
_selection_object = nil;
|
||||||
|
|
||||||
|
XCloseDisplay (x_dpy);
|
||||||
|
x_dpy = NULL;
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Startup */
|
||||||
|
static void signal_handler (int sig) {
|
||||||
|
x_shutdown ();
|
||||||
|
}
|
||||||
|
|
||||||
|
int main (int argc, const char *argv[]) {
|
||||||
|
printf("pid: %u\n", getpid());
|
||||||
|
|
||||||
|
x_init ();
|
||||||
|
|
||||||
|
signal (SIGINT, signal_handler);
|
||||||
|
signal (SIGTERM, signal_handler);
|
||||||
|
signal (SIGPIPE, SIG_IGN);
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
NS_DURING
|
||||||
|
CFRunLoopRun ();
|
||||||
|
NS_HANDLER
|
||||||
|
NSString *s = [NSString stringWithFormat:@"%@ - %@",
|
||||||
|
[localException name], [localException reason]];
|
||||||
|
fprintf(stderr, "quartz-wm: caught exception: %s\n", [s UTF8String]);
|
||||||
|
NS_ENDHANDLER
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -20,11 +20,9 @@ static Bool x_grab_synced;
|
||||||
static BOOL _is_active = YES; /* FIXME: should query server */
|
static BOOL _is_active = YES; /* FIXME: should query server */
|
||||||
/*gstaplin: why? Is there a race?*/
|
/*gstaplin: why? Is there a race?*/
|
||||||
|
|
||||||
static x_selection *_selection_object;
|
x_selection *_selection_object;
|
||||||
|
|
||||||
/* X11 code */
|
/* X11 code */
|
||||||
static void x_error_shutdown(void);
|
|
||||||
|
|
||||||
void x_grab_server (Bool sync) {
|
void x_grab_server (Bool sync) {
|
||||||
if (x_grab_count++ == 0) {
|
if (x_grab_count++ == 0) {
|
||||||
XGrabServer (x_dpy);
|
XGrabServer (x_dpy);
|
||||||
|
@ -48,8 +46,11 @@ static int x_io_error_handler (Display *dpy) {
|
||||||
/* We lost our connection to the server. */
|
/* We lost our connection to the server. */
|
||||||
|
|
||||||
TRACE ();
|
TRACE ();
|
||||||
|
|
||||||
x_error_shutdown ();
|
/* TODO: tirgger the thread to restart? */
|
||||||
|
#ifndef INTEGRATED_XPBPROXY
|
||||||
|
exit(1);
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -58,7 +59,7 @@ static int x_error_handler (Display *dpy, XErrorEvent *errevent) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void x_init (void) {
|
void x_init (void) {
|
||||||
x_dpy = XOpenDisplay (NULL);
|
x_dpy = XOpenDisplay (NULL);
|
||||||
if (x_dpy == NULL) {
|
if (x_dpy == NULL) {
|
||||||
fprintf (stderr, "can't open default display\n");
|
fprintf (stderr, "can't open default display\n");
|
||||||
|
@ -86,22 +87,6 @@ static void x_init (void) {
|
||||||
[_selection_object claim_clipboard];
|
[_selection_object claim_clipboard];
|
||||||
}
|
}
|
||||||
|
|
||||||
static void x_shutdown (void) {
|
|
||||||
/*gstaplin: signal_handler() calls this, and I don't think these are async-signal safe. */
|
|
||||||
/*TODO use a socketpair() to trigger a cleanup. This is totally unsafe according to Jordan. It's a segfault waiting to happen on a signal*/
|
|
||||||
|
|
||||||
[_selection_object release];
|
|
||||||
_selection_object = nil;
|
|
||||||
|
|
||||||
XCloseDisplay (x_dpy);
|
|
||||||
x_dpy = NULL;
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void x_error_shutdown (void) {
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
id x_selection_object (void) {
|
id x_selection_object (void) {
|
||||||
return _selection_object;
|
return _selection_object;
|
||||||
}
|
}
|
||||||
|
@ -124,33 +109,6 @@ void x_set_is_active (BOOL state) {
|
||||||
_is_active = state;
|
_is_active = state;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Startup */
|
|
||||||
static void signal_handler (int sig) {
|
|
||||||
x_shutdown ();
|
|
||||||
}
|
|
||||||
|
|
||||||
int main (int argc, const char *argv[]) {
|
|
||||||
printf("pid: %u\n", getpid());
|
|
||||||
|
|
||||||
x_init ();
|
|
||||||
|
|
||||||
signal (SIGINT, signal_handler);
|
|
||||||
signal (SIGTERM, signal_handler);
|
|
||||||
signal (SIGPIPE, SIG_IGN);
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
NS_DURING
|
|
||||||
CFRunLoopRun ();
|
|
||||||
NS_HANDLER
|
|
||||||
NSString *s = [NSString stringWithFormat:@"%@ - %@",
|
|
||||||
[localException name], [localException reason]];
|
|
||||||
fprintf(stderr, "quartz-wm: caught exception: %s\n", [s UTF8String]);
|
|
||||||
NS_ENDHANDLER
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void debug_printf (const char *fmt, ...) {
|
void debug_printf (const char *fmt, ...) {
|
||||||
static int spew = -1;
|
static int spew = -1;
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@ extern void x_set_is_active (BOOL state);
|
||||||
extern BOOL x_get_is_active (void);
|
extern BOOL x_get_is_active (void);
|
||||||
extern id x_selection_object (void);
|
extern id x_selection_object (void);
|
||||||
extern Time x_current_timestamp (void);
|
extern Time x_current_timestamp (void);
|
||||||
|
extern void x_init (void);
|
||||||
|
|
||||||
extern Display *x_dpy;
|
extern Display *x_dpy;
|
||||||
extern int x_apple_wm_event_base, x_apple_wm_error_base;
|
extern int x_apple_wm_event_base, x_apple_wm_error_base;
|
||||||
|
|
|
@ -102,4 +102,7 @@ struct atom_list {
|
||||||
- (void) copy_completed:(Atom)selection;
|
- (void) copy_completed:(Atom)selection;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
/* main.m */
|
||||||
|
extern x_selection *_selection_object;
|
||||||
|
|
||||||
#endif /* X_SELECTION_H */
|
#endif /* X_SELECTION_H */
|
||||||
|
|
Loading…
Reference in New Issue