From cbc0935ef74ebd76ed3db16d6ab86043eeed42a3 Mon Sep 17 00:00:00 2001
From: Jeremy Huddleston <jeremyhu@freedesktop.org>
Date: Tue, 21 Oct 2008 11:19:06 -0700
Subject: [PATCH 13/16] XQuartz: pbproxy: SIGHUP reloads preferences.

---
 hw/xquartz/pbproxy/app-main.m    |   17 +++++++++++++----
 hw/xquartz/pbproxy/main.m        |   13 +++++++------
 hw/xquartz/pbproxy/pbproxy.h     |    8 ++++++--
 hw/xquartz/pbproxy/x-input.m     |   20 +++++++++++++-------
 hw/xquartz/pbproxy/x-selection.m |    3 ++-
 5 files changed, 41 insertions(+), 20 deletions(-)

diff --git hw/xquartz/pbproxy/app-main.m hw/xquartz/pbproxy/app-main.m
index 3dfdcb4..4fb5ea0 100644
--- hw/xquartz/pbproxy/app-main.m
+++ hw/xquartz/pbproxy/app-main.m
@@ -10,8 +10,16 @@
 #include <unistd.h> /*for getpid*/
 #include <Cocoa/Cocoa.h>
 
+BOOL prefs_reload = NO;
+
 static void signal_handler (int sig) {
-    _exit(0);
+    switch(sig) {
+        case SIGHUP:
+            prefs_reload = YES;
+            break;
+        default:
+            _exit(EXIT_SUCCESS);
+    }
 }
 
 int main (int argc, const char *argv[]) {
@@ -19,15 +27,16 @@ int main (int argc, const char *argv[]) {
     printf("pid: %u\n", getpid());
 #endif
 
-    if(x_init () !=0)
-        return 1;
+    if(!x_init())
+        return EXIT_FAILURE;
     
     signal (SIGINT, signal_handler);
     signal (SIGTERM, signal_handler);
+    signal (SIGHUP, signal_handler);
     signal (SIGPIPE, SIG_IGN);
 
     [NSApplication sharedApplication];
     [NSApp run];
     
-    return 0;
+    return EXIT_SUCCESS;
 }
diff --git hw/xquartz/pbproxy/main.m hw/xquartz/pbproxy/main.m
index ded18e1..231b212 100644
--- hw/xquartz/pbproxy/main.m
+++ hw/xquartz/pbproxy/main.m
@@ -34,13 +34,13 @@ static int x_error_handler (Display *dpy, XErrorEvent *errevent) {
     return 0;
 }
 
-int x_init (void) {
+BOOL x_init (void) {
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 
     x_dpy = XOpenDisplay (NULL);
     if (x_dpy == NULL) {
         fprintf (stderr, "can't open default display\n");
-        return 1;
+        return FALSE;
     }
     
     XSetIOErrorHandler (x_io_error_handler);
@@ -49,7 +49,7 @@ int x_init (void) {
     if (!XAppleWMQueryExtension (x_dpy, &x_apple_wm_event_base,
                                  &x_apple_wm_error_base)) {
         fprintf (stderr, "can't open AppleWM server extension\n");
-        return 1;
+        return FALSE;
     }
     
     have_xfixes = XFixesQueryExtension(x_dpy, &x_xfixes_event_base, &x_xfixes_error_base);
@@ -59,12 +59,13 @@ int x_init (void) {
     
     _selection_object = [[x_selection alloc] init];
     
-    x_input_register ();
-    x_input_run ();
+    if(!x_input_register())
+        return FALSE;
+    x_input_run();
 
     [pool release];
     
-    return 0;
+    return TRUE;
 }
 
 id x_selection_object (void) {
diff --git hw/xquartz/pbproxy/pbproxy.h hw/xquartz/pbproxy/pbproxy.h
index 5d4652b..1b0ed2b 100644
--- hw/xquartz/pbproxy/pbproxy.h
+++ hw/xquartz/pbproxy/pbproxy.h
@@ -16,12 +16,16 @@
 #define DEBUG 0
 #endif
 
+#ifndef INTEGRATED_XPBPROXY
+extern BOOL prefs_reload;
+#endif
+
 /* from main.m */
 extern void x_set_is_active (BOOL state);
 extern BOOL x_get_is_active (void);
 extern id x_selection_object (void);
 extern Time x_current_timestamp (void);
-extern int x_init (void);
+extern BOOL x_init (void);
 
 extern Display *x_dpy;
 extern int x_apple_wm_event_base, x_apple_wm_error_base;
@@ -29,7 +33,7 @@ extern int x_xfixes_event_base, x_xfixes_error_base;
 extern BOOL have_xfixes;
 
 /* from x-input.m */
-extern void x_input_register (void);
+extern BOOL x_input_register (void);
 extern void x_input_run (void);
 
 #if DEBUG == 0
diff --git hw/xquartz/pbproxy/x-input.m hw/xquartz/pbproxy/x-input.m
index b34c39a..e091ef1 100644
--- hw/xquartz/pbproxy/x-input.m
+++ hw/xquartz/pbproxy/x-input.m
@@ -102,7 +102,7 @@ void x_input_run (void) {
     [pool release];
 }
 
-static int add_input_socket (int sock, CFOptionFlags callback_types,
+static BOOL add_input_socket (int sock, CFOptionFlags callback_types,
                              CFSocketCallBack callback, const CFSocketContext *ctx,
                              CFRunLoopSourceRef *cf_source) {
     CFSocketRef cf_sock;
@@ -128,12 +128,18 @@ static int add_input_socket (int sock, CFOptionFlags callback_types,
 
 static void x_input_callback (CFSocketRef sock, CFSocketCallBackType type,
                               CFDataRef address, const void *data, void *info) {
-    x_input_run ();
-}
 
-void x_input_register(void) {
-    if (!add_input_socket (ConnectionNumber (x_dpy), kCFSocketReadCallBack,
-                           x_input_callback, NULL, &x_dpy_source)) {
-        exit (1);
+#ifndef INTEGRATED_XPBPROXY
+    if(prefs_reload) {
+        [x_selection_object() reload_preferences];
+        prefs_reload = NO;
     }
+#endif
+    
+    x_input_run();
+}
+
+BOOL x_input_register(void) {
+    return add_input_socket(ConnectionNumber(x_dpy), kCFSocketReadCallBack,
+                            x_input_callback, NULL, &x_dpy_source);
 }
diff --git hw/xquartz/pbproxy/x-selection.m hw/xquartz/pbproxy/x-selection.m
index 16c4d52..304bee7 100644
--- hw/xquartz/pbproxy/x-selection.m
+++ hw/xquartz/pbproxy/x-selection.m
@@ -78,6 +78,7 @@ static struct {
 
 static struct propdata null_propdata = {NULL, 0};
 
+#ifdef DEBUG
 static void
 dump_prefs (FILE *fp) {
     fprintf(fp, 
@@ -93,7 +94,7 @@ dump_prefs (FILE *fp) {
 	    pbproxy_prefs.pasteboard_to_primary,
 	    pbproxy_prefs.pasteboard_to_clipboard);
 }
-
+#endif
 
 #define APP_PREFS "org.x.X11"
 static BOOL
-- 
1.6.1

