aboutsummaryrefslogtreecommitdiff
path: root/xorg-server/hw/xquartz/pbproxy
diff options
context:
space:
mode:
Diffstat (limited to 'xorg-server/hw/xquartz/pbproxy')
-rw-r--r--xorg-server/hw/xquartz/pbproxy/app-main.m62
-rw-r--r--xorg-server/hw/xquartz/pbproxy/main.m87
-rw-r--r--xorg-server/hw/xquartz/pbproxy/pbproxy.h24
-rw-r--r--xorg-server/hw/xquartz/pbproxy/trick_autotools.c6
-rw-r--r--xorg-server/hw/xquartz/pbproxy/x-input.m176
-rw-r--r--xorg-server/hw/xquartz/pbproxy/x-selection.h66
-rw-r--r--xorg-server/hw/xquartz/pbproxy/x-selection.m1747
7 files changed, 1076 insertions, 1092 deletions
diff --git a/xorg-server/hw/xquartz/pbproxy/app-main.m b/xorg-server/hw/xquartz/pbproxy/app-main.m
index 772c458a1..c061418d8 100644
--- a/xorg-server/hw/xquartz/pbproxy/app-main.m
+++ b/xorg-server/hw/xquartz/pbproxy/app-main.m
@@ -31,10 +31,10 @@
#import "x-selection.h"
#include <pthread.h>
-#include <unistd.h> /*for getpid*/
+#include <unistd.h> /*for getpid */
#include <Cocoa/Cocoa.h>
-static const char *app_prefs_domain = BUNDLE_ID_PREFIX".xpbproxy";
+static const char *app_prefs_domain = BUNDLE_ID_PREFIX ".xpbproxy";
CFStringRef app_prefs_domain_cfstr;
/* Stubs */
@@ -43,18 +43,20 @@ BOOL serverRunning = YES;
pthread_mutex_t serverRunningMutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t serverRunningCond = PTHREAD_COND_INITIALIZER;
-static void signal_handler (int sig) {
- switch(sig) {
- case SIGHUP:
- xpbproxy_prefs_reload = YES;
- break;
- default:
- _exit(EXIT_SUCCESS);
+static void
+signal_handler(int sig)
+{
+ switch (sig) {
+ case SIGHUP:
+ xpbproxy_prefs_reload = YES;
+ break;
+ default:
+ _exit(EXIT_SUCCESS);
}
}
void
-ErrorF(const char * f, ...)
+ErrorF(const char *f, ...)
{
va_list args;
@@ -64,7 +66,10 @@ ErrorF(const char * f, ...)
}
/* TODO: Have this actually log to ASL */
-void xq_asl_log (int level, const char *subsystem, const char *file, const char *function, int line, const char *fmt, ...) {
+void
+xq_asl_log(int level, const char *subsystem, const char *file,
+ const char *function, int line, const char *fmt, ...)
+{
#ifdef DEBUG
va_list args;
@@ -74,7 +79,9 @@ void xq_asl_log (int level, const char *subsystem, const char *file, const char
#endif
}
-int main (int argc, const char *argv[]) {
+int
+main(int argc, const char *argv[])
+{
const char *s;
int i;
@@ -84,31 +91,36 @@ int main (int argc, const char *argv[]) {
xpbproxy_is_standalone = YES;
- if((s = getenv("X11_PREFS_DOMAIN")))
+ if ((s = getenv("X11_PREFS_DOMAIN")))
app_prefs_domain = s;
for (i = 1; i < argc; i++) {
- if(strcmp (argv[i], "--prefs-domain") == 0 && i+1 < argc) {
+ if (strcmp(argv[i], "--prefs-domain") == 0 && i + 1 < argc) {
app_prefs_domain = argv[++i];
- } else if (strcmp (argv[i], "--help") == 0) {
+ }
+ else if (strcmp(argv[i], "--help") == 0) {
ErrorF("usage: xpbproxy OPTIONS\n"
"Pasteboard proxying for X11.\n\n"
"--prefs-domain <domain> Change the domain used for reading preferences\n"
- " (default: %s)\n", app_prefs_domain);
+ " (default: %s)\n",
+ app_prefs_domain);
return 0;
- } else {
+ }
+ else {
ErrorF("usage: xpbproxy OPTIONS...\n"
- "Try 'xpbproxy --help' for more information.\n");
+ "Try 'xpbproxy --help' for more information.\n");
return 1;
}
}
-
- app_prefs_domain_cfstr = CFStringCreateWithCString(NULL, app_prefs_domain, kCFStringEncodingUTF8);
-
- signal (SIGINT, signal_handler);
- signal (SIGTERM, signal_handler);
- signal (SIGHUP, signal_handler);
- signal (SIGPIPE, SIG_IGN);
+
+ app_prefs_domain_cfstr =
+ CFStringCreateWithCString(NULL, app_prefs_domain,
+ kCFStringEncodingUTF8);
+
+ signal(SIGINT, signal_handler);
+ signal(SIGTERM, signal_handler);
+ signal(SIGHUP, signal_handler);
+ signal(SIGPIPE, SIG_IGN);
return xpbproxy_run();
}
diff --git a/xorg-server/hw/xquartz/pbproxy/main.m b/xorg-server/hw/xquartz/pbproxy/main.m
index 29ce83b35..b52aec8a4 100644
--- a/xorg-server/hw/xquartz/pbproxy/main.m
+++ b/xorg-server/hw/xquartz/pbproxy/main.m
@@ -51,27 +51,31 @@ extern BOOL serverRunning;
extern pthread_mutex_t serverRunningMutex;
extern pthread_cond_t serverRunningCond;
-static inline void wait_for_server_init(void) {
+static inline void
+wait_for_server_init(void)
+{
/* If the server hasn't finished initializing, wait for it... */
- if(!serverRunning) {
+ if (!serverRunning) {
pthread_mutex_lock(&serverRunningMutex);
- while(!serverRunning)
+ while (!serverRunning)
pthread_cond_wait(&serverRunningCond, &serverRunningMutex);
pthread_mutex_unlock(&serverRunningMutex);
}
}
-static int x_io_error_handler (Display *dpy) {
+static int
+x_io_error_handler(Display * dpy)
+{
/* We lost our connection to the server. */
-
- TRACE ();
+
+ TRACE();
/* trigger the thread to restart?
* NO - this would be to a "deeper" problem, and restarts would just
* make things worse...
*/
#ifdef STANDALONE_XPBPROXY
- if(xpbproxy_is_standalone)
+ if (xpbproxy_is_standalone)
exit(EXIT_FAILURE);
#endif
@@ -80,70 +84,81 @@ static int x_io_error_handler (Display *dpy) {
return 0;
}
-static int x_error_handler (Display *dpy, XErrorEvent *errevent) {
+static int
+x_error_handler(Display * dpy, XErrorEvent * errevent)
+{
return 0;
}
-int xpbproxy_run (void) {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+int
+xpbproxy_run(void)
+{
+ NSAutoreleasePool *pool =[[NSAutoreleasePool alloc] init];
size_t i;
-
+
wait_for_server_init();
-
- for(i=0, xpbproxy_dpy=NULL; !xpbproxy_dpy && i<5; i++) {
+
+ for (i = 0, xpbproxy_dpy = NULL; !xpbproxy_dpy && i < 5; i++) {
xpbproxy_dpy = XOpenDisplay(NULL);
-
- if(!xpbproxy_dpy && display) {
+
+ if (!xpbproxy_dpy && display) {
char _display[32];
+
snprintf(_display, sizeof(_display), ":%s", display);
setenv("DISPLAY", _display, TRUE);
-
- xpbproxy_dpy=XOpenDisplay(_display);
+
+ xpbproxy_dpy = XOpenDisplay(_display);
}
- if(!xpbproxy_dpy)
+ if (!xpbproxy_dpy)
sleep(1);
}
-
+
if (xpbproxy_dpy == NULL) {
ErrorF("xpbproxy: can't open default display\n");
[pool release];
return EXIT_FAILURE;
}
-
- XSetIOErrorHandler (x_io_error_handler);
- XSetErrorHandler (x_error_handler);
-
- if (!XAppleWMQueryExtension (xpbproxy_dpy, &xpbproxy_apple_wm_event_base,
- &xpbproxy_apple_wm_error_base)) {
+
+ XSetIOErrorHandler(x_io_error_handler);
+ XSetErrorHandler(x_error_handler);
+
+ if (!XAppleWMQueryExtension(xpbproxy_dpy, &xpbproxy_apple_wm_event_base,
+ &xpbproxy_apple_wm_error_base)) {
ErrorF("xpbproxy: can't open AppleWM server extension\n");
[pool release];
return EXIT_FAILURE;
}
- xpbproxy_have_xfixes = XFixesQueryExtension(xpbproxy_dpy, &xpbproxy_xfixes_event_base, &xpbproxy_xfixes_error_base);
+ xpbproxy_have_xfixes =
+ XFixesQueryExtension(xpbproxy_dpy, &xpbproxy_xfixes_event_base,
+ &xpbproxy_xfixes_error_base);
+
+ XAppleWMSelectInput(xpbproxy_dpy, AppleWMActivationNotifyMask |
+ AppleWMPasteboardNotifyMask);
- XAppleWMSelectInput (xpbproxy_dpy, AppleWMActivationNotifyMask |
- AppleWMPasteboardNotifyMask);
-
- _selection_object = [[x_selection alloc] init];
-
- if(!xpbproxy_input_register()) {
+ _selection_object =[[x_selection alloc] init];
+
+ if (!xpbproxy_input_register()) {
[pool release];
return EXIT_FAILURE;
}
-
+
[pool release];
-
+
CFRunLoopRun();
return EXIT_SUCCESS;
}
-id xpbproxy_selection_object (void) {
+id
+xpbproxy_selection_object(void)
+{
return _selection_object;
}
-Time xpbproxy_current_timestamp (void) {
+Time
+xpbproxy_current_timestamp(void)
+{
/* FIXME: may want to fetch a timestamp from the server.. */
return CurrentTime;
}
diff --git a/xorg-server/hw/xquartz/pbproxy/pbproxy.h b/xorg-server/hw/xquartz/pbproxy/pbproxy.h
index c80a660cc..bdb15aeca 100644
--- a/xorg-server/hw/xquartz/pbproxy/pbproxy.h
+++ b/xorg-server/hw/xquartz/pbproxy/pbproxy.h
@@ -65,11 +65,11 @@ extern BOOL xpbproxy_is_standalone;
#endif
/* from main.m */
-extern void xpbproxy_set_is_active (BOOL state);
-extern BOOL xpbproxy_get_is_active (void);
-extern id xpbproxy_selection_object (void);
-extern Time xpbproxy_current_timestamp (void);
-extern int xpbproxy_run (void);
+extern void xpbproxy_set_is_active(BOOL state);
+extern BOOL xpbproxy_get_is_active(void);
+extern id xpbproxy_selection_object(void);
+extern Time xpbproxy_current_timestamp(void);
+extern int xpbproxy_run(void);
extern Display *xpbproxy_dpy;
extern int xpbproxy_apple_wm_event_base, xpbproxy_apple_wm_error_base;
@@ -77,17 +77,21 @@ extern int xpbproxy_xfixes_event_base, xpbproxy_xfixes_error_base;
extern BOOL xpbproxy_have_xfixes;
/* from x-input.m */
-extern BOOL xpbproxy_input_register (void);
+extern BOOL xpbproxy_input_register(void);
/* os/log.c or app-main.m */
-extern void ErrorF(const char *f, ...) _X_ATTRIBUTE_PRINTF(1,2);
+extern void
+ErrorF(const char *f, ...)
+_X_ATTRIBUTE_PRINTF(1, 2);
/* from darwin.h */
-_X_ATTRIBUTE_PRINTF(6,7)
-extern void xq_asl_log (int level, const char *subsystem, const char *file, const char *function, int line, const char *fmt, ...);
+_X_ATTRIBUTE_PRINTF(6, 7)
+extern void
+xq_asl_log(int level, const char *subsystem, const char *file,
+ const char *function, int line, const char *fmt, ...);
#define ASL_LOG(level, subsystem, msg, args...) xq_asl_log(level, subsystem, __FILE__, __FUNCTION__, __LINE__, msg, ##args)
#define DebugF(msg, args...) ASL_LOG(ASL_LEVEL_DEBUG, "xpbproxy", msg, ##args)
#define TRACE() DebugF("TRACE")
-#endif /* PBPROXY_H */
+#endif /* PBPROXY_H */
diff --git a/xorg-server/hw/xquartz/pbproxy/trick_autotools.c b/xorg-server/hw/xquartz/pbproxy/trick_autotools.c
index a38f077b1..11aff526d 100644
--- a/xorg-server/hw/xquartz/pbproxy/trick_autotools.c
+++ b/xorg-server/hw/xquartz/pbproxy/trick_autotools.c
@@ -1,3 +1,5 @@
-int this_is_just_here_to_make_automake_work() {
- return 0;
+int
+this_is_just_here_to_make_automake_work()
+{
+ return 0;
}
diff --git a/xorg-server/hw/xquartz/pbproxy/x-input.m b/xorg-server/hw/xquartz/pbproxy/x-input.m
index ebb89980f..134bf59d8 100644
--- a/xorg-server/hw/xquartz/pbproxy/x-input.m
+++ b/xorg-server/hw/xquartz/pbproxy/x-input.m
@@ -48,126 +48,138 @@ BOOL xpbproxy_prefs_reload = NO;
/* Timestamp when the X server last told us it's active */
static Time last_activation_time;
-static void x_event_apple_wm_notify(XAppleWMNotifyEvent *e) {
+static void
+x_event_apple_wm_notify(XAppleWMNotifyEvent * e)
+{
int type = e->type - xpbproxy_apple_wm_event_base;
int kind = e->kind;
/* We want to reload prefs even if we're not active */
- if(type == AppleWMActivationNotify &&
- kind == AppleWMReloadPreferences)
- [xpbproxy_selection_object() reload_preferences];
+ if (type == AppleWMActivationNotify && kind == AppleWMReloadPreferences)
+ [xpbproxy_selection_object()reload_preferences];
- if(![xpbproxy_selection_object() is_active])
+ if (![xpbproxy_selection_object()is_active])
return;
- switch (type) {
- case AppleWMActivationNotify:
- switch (kind) {
- case AppleWMIsActive:
- last_activation_time = e->time;
- [xpbproxy_selection_object() x_active:e->time];
- break;
-
- case AppleWMIsInactive:
- [xpbproxy_selection_object() x_inactive:e->time];
- break;
- }
+ switch (type) {
+ case AppleWMActivationNotify:
+ switch (kind) {
+ case AppleWMIsActive:
+ last_activation_time = e->time;
+ [xpbproxy_selection_object()x_active:e->time];
break;
-
- case AppleWMPasteboardNotify:
- switch (kind) {
- case AppleWMCopyToPasteboard:
- [xpbproxy_selection_object() x_copy:e->time];
- }
+
+ case AppleWMIsInactive:
+ [xpbproxy_selection_object()x_inactive:e->time];
break;
+ }
+ break;
+
+ case AppleWMPasteboardNotify:
+ switch (kind) {
+ case AppleWMCopyToPasteboard:
+ [xpbproxy_selection_object()x_copy:e->time];
+ }
+ break;
}
}
-static void xpbproxy_process_xevents(void) {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-
- if(pool == nil) {
+static void
+xpbproxy_process_xevents(void)
+{
+ NSAutoreleasePool *pool =[[NSAutoreleasePool alloc] init];
+
+ if (pool == nil) {
ErrorF("unable to allocate/init auto release pool!\n");
return;
}
-
+
while (XPending(xpbproxy_dpy) != 0) {
XEvent e;
-
- XNextEvent (xpbproxy_dpy, &e);
-
- switch (e.type) {
- case SelectionClear:
- if([xpbproxy_selection_object() is_active])
- [xpbproxy_selection_object () clear_event:&e.xselectionclear];
- break;
-
- case SelectionRequest:
- [xpbproxy_selection_object () request_event:&e.xselectionrequest];
- break;
-
- case SelectionNotify:
- [xpbproxy_selection_object () notify_event:&e.xselection];
- break;
-
- case PropertyNotify:
- [xpbproxy_selection_object () property_event:&e.xproperty];
- break;
-
- default:
- if(e.type >= xpbproxy_apple_wm_event_base &&
- e.type < xpbproxy_apple_wm_event_base + AppleWMNumberEvents) {
- x_event_apple_wm_notify((XAppleWMNotifyEvent *) &e);
- } else if(e.type == xpbproxy_xfixes_event_base + XFixesSelectionNotify) {
- [xpbproxy_selection_object() xfixes_selection_notify:(XFixesSelectionNotifyEvent *)&e];
- }
- break;
+
+ XNextEvent(xpbproxy_dpy, &e);
+
+ switch (e.type) {
+ case SelectionClear:
+ if ([xpbproxy_selection_object()is_active])
+ [xpbproxy_selection_object()clear_event:&e.xselectionclear];
+ break;
+
+ case SelectionRequest:
+ [xpbproxy_selection_object()request_event:&e.xselectionrequest];
+ break;
+
+ case SelectionNotify:
+ [xpbproxy_selection_object()notify_event:&e.xselection];
+ break;
+
+ case PropertyNotify:
+ [xpbproxy_selection_object()property_event:&e.xproperty];
+ break;
+
+ default:
+ if (e.type >= xpbproxy_apple_wm_event_base &&
+ e.type < xpbproxy_apple_wm_event_base + AppleWMNumberEvents) {
+ x_event_apple_wm_notify((XAppleWMNotifyEvent *) & e);
+ }
+ else if (e.type ==
+ xpbproxy_xfixes_event_base + XFixesSelectionNotify) {
+ [xpbproxy_selection_object()xfixes_selection_notify:(XFixesSelectionNotifyEvent *) &
+ e];
+ }
+ break;
}
-
+
XFlush(xpbproxy_dpy);
}
-
+
[pool release];
}
-static BOOL add_input_socket (int sock, CFOptionFlags callback_types,
- CFSocketCallBack callback, const CFSocketContext *ctx,
- CFRunLoopSourceRef *cf_source) {
+static BOOL
+add_input_socket(int sock, CFOptionFlags callback_types,
+ CFSocketCallBack callback, const CFSocketContext * ctx,
+ CFRunLoopSourceRef * cf_source)
+{
CFSocketRef cf_sock;
-
- cf_sock = CFSocketCreateWithNative (kCFAllocatorDefault, sock,
- callback_types, callback, ctx);
+
+ cf_sock = CFSocketCreateWithNative(kCFAllocatorDefault, sock,
+ callback_types, callback, ctx);
if (cf_sock == NULL) {
- close (sock);
+ close(sock);
return FALSE;
}
-
- *cf_source = CFSocketCreateRunLoopSource (kCFAllocatorDefault,
- cf_sock, 0);
- CFRelease (cf_sock);
-
+
+ *cf_source = CFSocketCreateRunLoopSource(kCFAllocatorDefault, cf_sock, 0);
+ CFRelease(cf_sock);
+
if (*cf_source == NULL)
return FALSE;
-
- CFRunLoopAddSource (CFRunLoopGetCurrent (),
- *cf_source, kCFRunLoopDefaultMode);
+
+ CFRunLoopAddSource(CFRunLoopGetCurrent(),
+ *cf_source, kCFRunLoopDefaultMode);
return TRUE;
}
-static void x_input_callback (CFSocketRef sock, CFSocketCallBackType type,
- CFDataRef address, const void *data, void *info) {
+static void
+x_input_callback(CFSocketRef sock, CFSocketCallBackType type,
+ CFDataRef address, const void *data, void *info)
+{
#ifdef STANDALONE_XPBPROXY
- if(xpbproxy_prefs_reload) {
- [xpbproxy_selection_object() reload_preferences];
+ if (xpbproxy_prefs_reload) {
+ [xpbproxy_selection_object()reload_preferences];
xpbproxy_prefs_reload = NO;
}
#endif
-
+
xpbproxy_process_xevents();
}
-BOOL xpbproxy_input_register(void) {
- return add_input_socket(ConnectionNumber(xpbproxy_dpy), kCFSocketReadCallBack,
- x_input_callback, NULL, &xpbproxy_dpy_source);
+BOOL
+xpbproxy_input_register(void)
+{
+ return add_input_socket(ConnectionNumber(xpbproxy_dpy),
+ kCFSocketReadCallBack, x_input_callback, NULL,
+ &xpbproxy_dpy_source);
}
diff --git a/xorg-server/hw/xquartz/pbproxy/x-selection.h b/xorg-server/hw/xquartz/pbproxy/x-selection.h
index d4a39e58f..f5c6c9bd5 100644
--- a/xorg-server/hw/xquartz/pbproxy/x-selection.h
+++ b/xorg-server/hw/xquartz/pbproxy/x-selection.h
@@ -41,9 +41,9 @@
/* This stores image data or text. */
struct propdata {
- unsigned char *data;
- size_t length;
- int format;
+ unsigned char *data;
+ size_t length;
+ int format;
};
struct atom_list {
@@ -52,16 +52,13 @@ struct atom_list {
compound_text, atom_pair;
};
-
-@interface x_selection : NSObject
-{
-@private
-
- /* The unmapped window we use for fetching selections. */
+ @interface x_selection:NSObject {
+ @private
+ /* The unmapped window we use for fetching selections. */
Window _selection_window;
Atom request_atom;
-
+
struct {
struct propdata propdata;
Window requestor;
@@ -74,37 +71,40 @@ struct atom_list {
* pending_copy is > 0 we do it again.
*/
int pending_copy;
+
/*
* This is used for the same purpose as pending_copy, but for the
* CLIPBOARD. It also prevents a race with INCR transfers.
*/
- int pending_clipboard;
-
+ int pending_clipboard;
+
struct atom_list atoms[1];
}
-- (void) x_active:(Time)timestamp;
-- (void) x_inactive:(Time)timestamp;
-
-- (void) x_copy:(Time)timestamp;
-
-- (void) clear_event:(XSelectionClearEvent *)e;
-- (void) request_event:(XSelectionRequestEvent *)e;
-- (void) notify_event:(XSelectionEvent *)e;
-- (void) property_event:(XPropertyEvent *)e;
-- (void) xfixes_selection_notify:(XFixesSelectionNotifyEvent *)e;
-- (void) handle_selection:(Atom)selection type:(Atom)type propdata:(struct propdata *)pdata;
-- (void) claim_clipboard;
-- (BOOL) set_clipboard_manager_status:(BOOL)value;
-- (void) own_clipboard;
-- (void) copy_completed:(Atom)selection;
-
-- (void) reload_preferences;
-- (BOOL) is_active;
-- (void) send_none:(XSelectionRequestEvent *)e;
-@end
+ -(void) x_active:(Time) timestamp;
+ -(void) x_inactive:(Time) timestamp;
+
+ -(void) x_copy:(Time) timestamp;
+
+ -(void) clear_event:(XSelectionClearEvent *) e;
+ -(void) request_event:(XSelectionRequestEvent *) e;
+ -(void) notify_event:(XSelectionEvent *) e;
+ -(void) property_event:(XPropertyEvent *) e;
+ -(void) xfixes_selection_notify:(XFixesSelectionNotifyEvent *) e;
+ -(void) handle_selection:(Atom)
+selection type:(Atom)
+type propdata:(struct propdata *) pdata;
+-(void) claim_clipboard;
+ -(BOOL) set_clipboard_manager_status:(BOOL) value;
+-(void) own_clipboard;
+ -(void) copy_completed:(Atom) selection;
+
+-(void) reload_preferences;
+-(BOOL) is_active;
+ -(void) send_none:(XSelectionRequestEvent *) e;
+@end
/* main.m */
extern x_selection *_selection_object;
-#endif /* X_SELECTION_H */
+#endif /* X_SELECTION_H */
diff --git a/xorg-server/hw/xquartz/pbproxy/x-selection.m b/xorg-server/hw/xquartz/pbproxy/x-selection.m
index b5f4dde5c..317aed073 100644
--- a/xorg-server/hw/xquartz/pbproxy/x-selection.m
+++ b/xorg-server/hw/xquartz/pbproxy/x-selection.m
@@ -65,59 +65,61 @@
*/
static struct {
- BOOL active ;
- BOOL primary_on_grab; /* This is provided as an option for people who
- * want it and has issues that won't ever be
- * addressed to make it *always* work.
- */
+ BOOL active;
+ BOOL primary_on_grab; /* This is provided as an option for people who
+ * want it and has issues that won't ever be
+ * addressed to make it *always* work.
+ */
BOOL clipboard_to_pasteboard;
BOOL pasteboard_to_primary;
BOOL pasteboard_to_clipboard;
-} pbproxy_prefs = { YES, NO, YES, YES, YES };
+} pbproxy_prefs = {
+YES, NO, YES, YES, YES};
@implementation x_selection
-
-static struct propdata null_propdata = {NULL, 0, 0};
+ static struct propdata null_propdata = { NULL, 0, 0 };
#ifdef DEBUG
static void
-dump_prefs() {
- ErrorF(fp,
- "pbproxy preferences:\n"
- "\tactive %u\n"
- "\tprimary_on_grab %u\n"
- "\tclipboard_to_pasteboard %u\n"
- "\tpasteboard_to_primary %u\n"
- "\tpasteboard_to_clipboard %u\n",
- pbproxy_prefs.active,
- pbproxy_prefs.primary_on_grab,
- pbproxy_prefs.clipboard_to_pasteboard,
- pbproxy_prefs.pasteboard_to_primary,
- pbproxy_prefs.pasteboard_to_clipboard);
+dump_prefs()
+{
+ ErrorF(fp,
+ "pbproxy preferences:\n"
+ "\tactive %u\n"
+ "\tprimary_on_grab %u\n"
+ "\tclipboard_to_pasteboard %u\n"
+ "\tpasteboard_to_primary %u\n"
+ "\tpasteboard_to_clipboard %u\n",
+ pbproxy_prefs.active,
+ pbproxy_prefs.primary_on_grab,
+ pbproxy_prefs.clipboard_to_pasteboard,
+ pbproxy_prefs.pasteboard_to_primary,
+ pbproxy_prefs.pasteboard_to_clipboard);
}
#endif
extern CFStringRef app_prefs_domain_cfstr;
static BOOL
-prefs_get_bool (CFStringRef key, BOOL defaultValue) {
+prefs_get_bool(CFStringRef key, BOOL defaultValue)
+{
Boolean value, ok;
-
- value = CFPreferencesGetAppBooleanValue (key, app_prefs_domain_cfstr, &ok);
-
+
+ value = CFPreferencesGetAppBooleanValue(key, app_prefs_domain_cfstr, &ok);
+
return ok ? (BOOL) value : defaultValue;
}
static void
-init_propdata (struct propdata *pdata)
+init_propdata(struct propdata *pdata)
{
*pdata = null_propdata;
}
static void
-free_propdata (struct propdata *pdata)
+free_propdata(struct propdata *pdata)
{
- free (pdata->data);
+ free(pdata->data);
*pdata = null_propdata;
}
@@ -127,188 +129,175 @@ free_propdata (struct propdata *pdata)
* The property is only deleted when bytesleft is 0 if delete is True.
*/
static Bool
-get_property(Window win, Atom property, struct propdata *pdata, Bool delete, Atom *type)
+get_property(Window win, Atom property, struct propdata *pdata, Bool delete,
+ Atom *type)
{
long offset = 0;
unsigned long numitems, bytesleft = 0;
+
#ifdef TEST
/* This is used to test the growth handling. */
unsigned long length = 4UL;
#else
- unsigned long length = (100000UL + 3) / 4;
+ unsigned long length = (100000UL + 3) / 4;
#endif
unsigned char *buf = NULL, *chunk = NULL;
size_t buflen = 0, chunkbytesize = 0;
int format;
- TRACE ();
-
- if(None == property)
- return True;
-
- do
- {
- unsigned long newbuflen = 0;
- unsigned char *newbuf = NULL;
-
-#ifdef TEST
- ErrorF("bytesleft %lu\n", bytesleft);
+ TRACE();
+
+ if (None == property)
+ return True;
+
+ do {
+ unsigned long newbuflen = 0;
+ unsigned char *newbuf = NULL;
+
+#ifdef TEST
+ ErrorF("bytesleft %lu\n", bytesleft);
#endif
- if (Success != XGetWindowProperty (xpbproxy_dpy, win, property,
- offset, length, delete,
- AnyPropertyType,
- type, &format, &numitems,
- &bytesleft, &chunk))
- {
- DebugF ("Error while getting window property.\n");
- *pdata = null_propdata;
- free (buf);
- return True;
- }
-
+ if (Success != XGetWindowProperty(xpbproxy_dpy, win, property,
+ offset, length, delete,
+ AnyPropertyType,
+ type, &format, &numitems,
+ &bytesleft, &chunk)) {
+ DebugF("Error while getting window property.\n");
+ *pdata = null_propdata;
+ free(buf);
+ return True;
+ }
+
#ifdef TEST
- ErrorF("format %d numitems %lu bytesleft %lu\n",
- format, numitems, bytesleft);
-
- ErrorF("type %s\n", XGetAtomName (xpbproxy_dpy, *type));
+ ErrorF("format %d numitems %lu bytesleft %lu\n",
+ format, numitems, bytesleft);
+
+ ErrorF("type %s\n", XGetAtomName(xpbproxy_dpy, *type));
#endif
-
- /* Format is the number of bits. */
- if (format == 8)
- chunkbytesize = numitems;
- else if (format == 16)
- chunkbytesize = numitems * sizeof(short);
- else if (format == 32)
- chunkbytesize = numitems * sizeof(long);
+
+ /* Format is the number of bits. */
+ if (format == 8)
+ chunkbytesize = numitems;
+ else if (format == 16)
+ chunkbytesize = numitems * sizeof(short);
+ else if (format == 32)
+ chunkbytesize = numitems * sizeof(long);
#ifdef TEST
- ErrorF("chunkbytesize %zu\n", chunkbytesize);
+ ErrorF("chunkbytesize %zu\n", chunkbytesize);
#endif
- newbuflen = buflen + chunkbytesize;
- if (newbuflen > 0)
- {
- newbuf = realloc (buf, newbuflen);
-
- if (NULL == newbuf)
- {
- XFree (chunk);
- free (buf);
- return True;
- }
-
- memcpy (newbuf + buflen, chunk, chunkbytesize);
- XFree (chunk);
- buf = newbuf;
- buflen = newbuflen;
- /* offset is a multiple of 32 bits*/
- offset += chunkbytesize / 4;
- }
- else
- {
- if (chunk)
- XFree (chunk);
- }
-
+ newbuflen = buflen + chunkbytesize;
+ if (newbuflen > 0) {
+ newbuf = realloc(buf, newbuflen);
+
+ if (NULL == newbuf) {
+ XFree(chunk);
+ free(buf);
+ return True;
+ }
+
+ memcpy(newbuf + buflen, chunk, chunkbytesize);
+ XFree(chunk);
+ buf = newbuf;
+ buflen = newbuflen;
+ /* offset is a multiple of 32 bits */
+ offset += chunkbytesize / 4;
+ }
+ else {
+ if (chunk)
+ XFree(chunk);
+ }
+
#ifdef TEST
- ErrorF("bytesleft %lu\n", bytesleft);
+ ErrorF("bytesleft %lu\n", bytesleft);
#endif
} while (bytesleft > 0);
-
+
pdata->data = buf;
pdata->length = buflen;
pdata->format = format;
- return /*success*/ False;
+ return /*success */ False;
}
-
/* Implementation methods */
/* This finds the preferred type from a TARGETS list.*/
-- (Atom) find_preferred:(struct propdata *)pdata
-{
+ -(Atom) find_preferred:(struct propdata *) pdata {
Atom a = None;
size_t i, step;
Bool png = False, jpeg = False, utf8 = False, string = False;
- TRACE ();
-
- if (pdata->format != 32)
- {
- ErrorF("Atom list is expected to be formatted as an array of 32bit values.\n");
- return None;
- }
-
- for (i = 0, step = sizeof(long); i < pdata->length; i += step)
- {
- a = (Atom)*(long *)(pdata->data + i);
-
- if (a == atoms->image_png)
- {
- png = True;
- }
- else if (a == atoms->image_jpeg)
- {
- jpeg = True;
- }
- else if (a == atoms->utf8_string)
- {
- utf8 = True;
- }
- else if (a == atoms->string)
- {
- string = True;
- }
- else
- {
- char *type = XGetAtomName(xpbproxy_dpy, a);
- if (type)
- {
- DebugF("Unhandled X11 mime type: %s", type);
- XFree(type);
- }
- }
- }
-
- /*We prefer PNG over strings, and UTF8 over a Latin-1 string.*/
+ TRACE();
+
+ if (pdata->format != 32) {
+ ErrorF
+ ("Atom list is expected to be formatted as an array of 32bit values.\n");
+ return None;
+ }
+
+ for (i = 0, step = sizeof(long); i < pdata->length; i += step) {
+ a = (Atom) *(long *) (pdata->data + i);
+
+ if (a == atoms->image_png) {
+ png = True;
+ }
+ else if (a == atoms->image_jpeg) {
+ jpeg = True;
+ }
+ else if (a == atoms->utf8_string) {
+ utf8 = True;
+ }
+ else if (a == atoms->string) {
+ string = True;
+ }
+ else {
+ char *type = XGetAtomName(xpbproxy_dpy, a);
+
+ if (type) {
+ DebugF("Unhandled X11 mime type: %s", type);
+ XFree(type);
+ }
+ }
+ }
+
+ /*We prefer PNG over strings, and UTF8 over a Latin-1 string. */
if (png)
- return atoms->image_png;
+ return atoms->image_png;
if (jpeg)
- return atoms->image_jpeg;
+ return atoms->image_jpeg;
if (utf8)
- return atoms->utf8_string;
+ return atoms->utf8_string;
if (string)
- return atoms->string;
+ return atoms->string;
- /* This is evidently something we don't know how to handle.*/
+ /* This is evidently something we don't know how to handle. */
return None;
}
/* Return True if this is an INCR-style transfer. */
-- (Bool) is_incr_type:(XSelectionEvent *)e
-{
+ -(Bool) is_incr_type:(XSelectionEvent *) e {
Atom seltype;
int format;
unsigned long numitems = 0UL, bytesleft = 0UL;
unsigned char *chunk;
-
- TRACE ();
- if (Success != XGetWindowProperty (xpbproxy_dpy, e->requestor, e->property,
- /*offset*/ 0L, /*length*/ 4UL,
- /*Delete*/ False,
- AnyPropertyType, &seltype, &format,
- &numitems, &bytesleft, &chunk))
- {
- return False;
+ TRACE();
+
+ if (Success != XGetWindowProperty(xpbproxy_dpy, e->requestor, e->property,
+ /*offset */ 0L, /*length */ 4UL,
+ /*Delete */ False,
+ AnyPropertyType, &seltype, &format,
+ &numitems, &bytesleft, &chunk)) {
+ return False;
}
- if(chunk)
- XFree(chunk);
+ if (chunk)
+ XFree(chunk);
return (seltype == atoms->incr) ? True : False;
}
@@ -317,133 +306,122 @@ get_property(Window win, Atom property, struct propdata *pdata, Bool delete, Ato
* This should be called after a selection has been copied,
* or when the selection is unfinished before a transfer completes.
*/
-- (void) release_pending
-{
- TRACE ();
+-(void) release_pending {
+ TRACE();
- free_propdata (&pending.propdata);
+ free_propdata(&pending.propdata);
pending.requestor = None;
pending.selection = None;
}
/* Return True if an error occurs during an append.*/
/* Return False if the append succeeds. */
-- (Bool) append_to_pending:(struct propdata *)pdata requestor:(Window)requestor
+ -(Bool) append_to_pending:(struct propdata *)
+pdata requestor:(Window) requestor
{
unsigned char *newdata;
size_t newlength;
-
- TRACE ();
-
- if (requestor != pending.requestor)
- {
- [self release_pending];
- pending.requestor = requestor;
- }
-
+
+ TRACE();
+
+ if (requestor != pending.requestor) {
+ [self release_pending];
+ pending.requestor = requestor;
+ }
+
newlength = pending.propdata.length + pdata->length;
newdata = realloc(pending.propdata.data, newlength);
- if(NULL == newdata)
- {
- perror("realloc propdata");
- [self release_pending];
+ if (NULL == newdata) {
+ perror("realloc propdata");
+ [self release_pending];
return True;
}
memcpy(newdata + pending.propdata.length, pdata->data, pdata->length);
pending.propdata.data = newdata;
pending.propdata.length = newlength;
-
+
return False;
}
-
-
/* Called when X11 becomes active (i.e. has key focus) */
-- (void) x_active:(Time)timestamp
-{
+ -(void) x_active:(Time) timestamp {
static NSInteger changeCount;
NSInteger countNow;
NSPasteboard *pb;
- TRACE ();
+ TRACE();
- pb = [NSPasteboard generalPasteboard];
+ pb =[NSPasteboard generalPasteboard];
if (nil == pb)
- return;
+ return;
- countNow = [pb changeCount];
+ countNow =[pb changeCount];
- if (countNow != changeCount)
- {
- DebugF ("changed pasteboard!\n");
+ if (countNow != changeCount) {
+ DebugF("changed pasteboard!\n");
changeCount = countNow;
-
- if (pbproxy_prefs.pasteboard_to_primary)
- {
- XSetSelectionOwner (xpbproxy_dpy, atoms->primary, _selection_window, CurrentTime);
+
+ if (pbproxy_prefs.pasteboard_to_primary) {
+ XSetSelectionOwner(xpbproxy_dpy, atoms->primary, _selection_window,
+ CurrentTime);
}
-
+
if (pbproxy_prefs.pasteboard_to_clipboard) {
[self own_clipboard];
}
}
#if 0
- /*gstaplin: we should perhaps investigate something like this branch above...*/
- if ([_pasteboard availableTypeFromArray: _known_types] != nil)
- {
- /* Pasteboard has data we should proxy; I think it makes
- sense to put it on both CLIPBOARD and PRIMARY */
-
- XSetSelectionOwner (xpbproxy_dpy, atoms->clipboard,
- _selection_window, timestamp);
- XSetSelectionOwner (xpbproxy_dpy, atoms->primary,
- _selection_window, timestamp);
- }
+ /*gstaplin: we should perhaps investigate something like this branch above... */
+ if ([_pasteboard availableTypeFromArray:_known_types] != nil) {
+ /* Pasteboard has data we should proxy; I think it makes
+ sense to put it on both CLIPBOARD and PRIMARY */
+
+ XSetSelectionOwner(xpbproxy_dpy, atoms->clipboard,
+ _selection_window, timestamp);
+ XSetSelectionOwner(xpbproxy_dpy, atoms->primary,
+ _selection_window, timestamp);
+ }
#endif
}
/* Called when X11 loses key focus */
-- (void) x_inactive:(Time)timestamp
-{
- TRACE ();
+ -(void) x_inactive:(Time) timestamp {
+ TRACE();
}
/* This requests the TARGETS list from the PRIMARY selection owner. */
-- (void) x_copy_request_targets
-{
- TRACE ();
+-(void) x_copy_request_targets {
+ TRACE();
request_atom = atoms->targets;
- XConvertSelection (xpbproxy_dpy, atoms->primary, atoms->targets,
- atoms->primary, _selection_window, CurrentTime);
+ XConvertSelection(xpbproxy_dpy, atoms->primary, atoms->targets,
+ atoms->primary, _selection_window, CurrentTime);
}
/* Called when the Edit/Copy item on the main X11 menubar is selected
* and no appkit window claims it. */
-- (void) x_copy:(Time)timestamp
-{
+ -(void) x_copy:(Time) timestamp {
Window w;
- TRACE ();
+ TRACE();
- w = XGetSelectionOwner (xpbproxy_dpy, atoms->primary);
+ w = XGetSelectionOwner(xpbproxy_dpy, atoms->primary);
- if (None != w)
- {
- ++pending_copy;
-
- if (1 == pending_copy) {
- /*
- * There are no other copy operations in progress, so we
- * can proceed safely. Otherwise the copy_completed method
- * will see that the pending_copy is > 1, and do another copy.
- */
- [self x_copy_request_targets];
- }
+ if (None != w) {
+ ++pending_copy;
+
+ if (1 == pending_copy) {
+ /*
+ * There are no other copy operations in progress, so we
+ * can proceed safely. Otherwise the copy_completed method
+ * will see that the pending_copy is > 1, and do another copy.
+ */
+ [self x_copy_request_targets];
+ }
}
}
@@ -451,32 +429,37 @@ get_property(Window win, Atom property, struct propdata *pdata, Bool delete, Ato
* This prevents tools like xclipboard from causing havoc.
* Returns TRUE on success
*/
-- (BOOL) set_clipboard_manager_status:(BOOL)value
-{
- TRACE ();
+ -(BOOL) set_clipboard_manager_status:(BOOL) value {
+ TRACE();
- Window owner = XGetSelectionOwner (xpbproxy_dpy, atoms->clipboard_manager);
+ Window owner = XGetSelectionOwner(xpbproxy_dpy, atoms->clipboard_manager);
- if(value) {
- if(owner == _selection_window)
+ if (value) {
+ if (owner == _selection_window)
return TRUE;
- if(owner != None) {
- ErrorF("A clipboard manager using window 0x%lx already owns the clipboard selection. "
- "pbproxy will not sync clipboard to pasteboard.\n", owner);
+ if (owner != None) {
+ ErrorF
+ ("A clipboard manager using window 0x%lx already owns the clipboard selection. "
+ "pbproxy will not sync clipboard to pasteboard.\n", owner);
return FALSE;
}
-
- XSetSelectionOwner(xpbproxy_dpy, atoms->clipboard_manager, _selection_window, CurrentTime);
- return (_selection_window == XGetSelectionOwner(xpbproxy_dpy, atoms->clipboard_manager));
- } else {
- if(owner != _selection_window)
+
+ XSetSelectionOwner(xpbproxy_dpy, atoms->clipboard_manager,
+ _selection_window, CurrentTime);
+ return (_selection_window ==
+ XGetSelectionOwner(xpbproxy_dpy, atoms->clipboard_manager));
+ }
+ else {
+ if (owner != _selection_window)
return TRUE;
- XSetSelectionOwner(xpbproxy_dpy, atoms->clipboard_manager, None, CurrentTime);
- return(None == XGetSelectionOwner(xpbproxy_dpy, atoms->clipboard_manager));
+ XSetSelectionOwner(xpbproxy_dpy, atoms->clipboard_manager, None,
+ CurrentTime);
+ return (None ==
+ XGetSelectionOwner(xpbproxy_dpy, atoms->clipboard_manager));
}
-
+
return FALSE;
}
@@ -484,31 +467,30 @@ get_property(Window win, Atom property, struct propdata *pdata, Bool delete, Ato
* This occurs when we previously owned a selection,
* and then lost it from another client.
*/
-- (void) clear_event:(XSelectionClearEvent *)e
-{
-
+ -(void) clear_event:(XSelectionClearEvent *) e {
+
+ TRACE();
+
+ DebugF("e->selection %s\n", XGetAtomName(xpbproxy_dpy, e->selection));
- TRACE ();
-
- DebugF ("e->selection %s\n", XGetAtomName (xpbproxy_dpy, e->selection));
-
- if(e->selection == atoms->clipboard) {
+ if (e->selection == atoms->clipboard) {
/*
* We lost ownership of the CLIPBOARD.
*/
++pending_clipboard;
-
+
if (1 == pending_clipboard) {
/* Claim the clipboard contents from the new owner. */
[self claim_clipboard];
}
- } else if(e->selection == atoms->clipboard_manager) {
- if(pbproxy_prefs.clipboard_to_pasteboard) {
+ }
+ else if (e->selection == atoms->clipboard_manager) {
+ if (pbproxy_prefs.clipboard_to_pasteboard) {
/* Another CLIPBOARD_MANAGER has set itself as owner. Disable syncing
* to avoid a race.
*/
ErrorF("Another clipboard manager was started! "
- "xpbproxy is disabling syncing with clipboard.\n");
+ "xpbproxy is disabling syncing with clipboard.\n");
pbproxy_prefs.clipboard_to_pasteboard = NO;
}
}
@@ -517,73 +499,71 @@ get_property(Window win, Atom property, struct propdata *pdata, Bool delete, Ato
/*
* We greedily acquire the clipboard after it changes, and on startup.
*/
-- (void) claim_clipboard
-{
+-(void) claim_clipboard {
Window owner;
-
- TRACE ();
-
+
+ TRACE();
+
if (!pbproxy_prefs.clipboard_to_pasteboard)
return;
-
- owner = XGetSelectionOwner (xpbproxy_dpy, atoms->clipboard);
+
+ owner = XGetSelectionOwner(xpbproxy_dpy, atoms->clipboard);
if (None == owner) {
/*
* The owner probably died or we are just starting up pbproxy.
* Set pbproxy's _selection_window as the owner, and continue.
*/
- DebugF ("No clipboard owner.\n");
- [self copy_completed:atoms->clipboard];
+ DebugF("No clipboard owner.\n");
+ [self copy_completed:atoms->clipboard];
return;
- } else if (owner == _selection_window) {
- [self copy_completed:atoms->clipboard];
+ }
+ else if (owner == _selection_window) {
+ [self copy_completed:atoms->clipboard];
return;
}
-
- DebugF ("requesting targets\n");
-
+
+ DebugF("requesting targets\n");
+
request_atom = atoms->targets;
- XConvertSelection (xpbproxy_dpy, atoms->clipboard, atoms->targets,
- atoms->clipboard, _selection_window, CurrentTime);
- XFlush (xpbproxy_dpy);
+ XConvertSelection(xpbproxy_dpy, atoms->clipboard, atoms->targets,
+ atoms->clipboard, _selection_window, CurrentTime);
+ XFlush(xpbproxy_dpy);
/* Now we will get a SelectionNotify event in the future. */
}
/* Greedily acquire the clipboard. */
-- (void) own_clipboard
-{
+-(void) own_clipboard {
- TRACE ();
+ TRACE();
/* We should perhaps have a boundary limit on the number of iterations... */
- do
- {
- XSetSelectionOwner (xpbproxy_dpy, atoms->clipboard, _selection_window,
- CurrentTime);
- } while (_selection_window != XGetSelectionOwner (xpbproxy_dpy,
- atoms->clipboard));
+ do {
+ XSetSelectionOwner(xpbproxy_dpy, atoms->clipboard, _selection_window,
+ CurrentTime);
+ } while (_selection_window != XGetSelectionOwner(xpbproxy_dpy,
+ atoms->clipboard));
}
-- (void) init_reply:(XEvent *)reply request:(XSelectionRequestEvent *)e
+ -(void) init_reply:(XEvent *)
+reply request:(XSelectionRequestEvent *) e
{
reply->xselection.type = SelectionNotify;
reply->xselection.selection = e->selection;
reply->xselection.target = e->target;
reply->xselection.requestor = e->requestor;
reply->xselection.time = e->time;
- reply->xselection.property = None;
+ reply->xselection.property = None;
}
-- (void) send_reply:(XEvent *)reply
-{
+ -(void) send_reply:(XEvent *) reply {
/*
* We are supposed to use an empty event mask, and not propagate
* the event, according to the ICCCM.
*/
- DebugF ("reply->xselection.requestor 0x%lx\n", reply->xselection.requestor);
-
- XSendEvent (xpbproxy_dpy, reply->xselection.requestor, False, 0, reply);
- XFlush (xpbproxy_dpy);
+ DebugF("reply->xselection.requestor 0x%lx\n", reply->xselection.requestor);
+
+ XSendEvent(xpbproxy_dpy, reply->xselection.requestor, False, 0, reply);
+ XFlush(xpbproxy_dpy);
}
/*
@@ -594,76 +574,75 @@ get_property(Window win, Atom property, struct propdata *pdata, Bool delete, Ato
* (in Latin-1 encoding). The requestor can then make the choice based on
* the list.
*/
-- (void) send_targets:(XSelectionRequestEvent *)e pasteboard:(NSPasteboard *)pb
+ -(void) send_targets:(XSelectionRequestEvent *)
+e pasteboard:(NSPasteboard *) pb
{
XEvent reply;
NSArray *pbtypes;
- [self init_reply:&reply request:e];
+ [self init_reply: &reply request:e];
- pbtypes = [pb types];
- if (pbtypes)
- {
- long list[7]; /* Don't forget to increase this if we handle more types! */
+ pbtypes =[pb types];
+ if (pbtypes) {
+ long list[7]; /* Don't forget to increase this if we handle more types! */
long count = 0;
-
- /*
- * I'm not sure if this is needed, but some toolkits/clients list
- * TARGETS in response to targets.
- */
- list[count] = atoms->targets;
- ++count;
-
- if ([pbtypes containsObject:NSStringPboardType])
- {
- /* We have a string type that we can convert to UTF8, or Latin-1... */
- DebugF ("NSStringPboardType\n");
- list[count] = atoms->utf8_string;
- ++count;
- list[count] = atoms->string;
- ++count;
- list[count] = atoms->compound_text;
- ++count;
- }
-
- /* TODO add the NSPICTPboardType back again, once we have conversion
- * functionality in send_image.
- */
+
+ /*
+ * I'm not sure if this is needed, but some toolkits/clients list
+ * TARGETS in response to targets.
+ */
+ list[count] = atoms->targets;
+ ++count;
+
+ if ([pbtypes containsObject:NSStringPboardType]) {
+ /* We have a string type that we can convert to UTF8, or Latin-1... */
+ DebugF("NSStringPboardType\n");
+ list[count] = atoms->utf8_string;
+ ++count;
+ list[count] = atoms->string;
+ ++count;
+ list[count] = atoms->compound_text;
+ ++count;
+ }
+
+ /* TODO add the NSPICTPboardType back again, once we have conversion
+ * functionality in send_image.
+ */
#ifdef __clang__
#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations" // NSPICTPboardType
+#pragma clang diagnostic ignored "-Wdeprecated-declarations" // NSPICTPboardType
#endif
- if ([pbtypes containsObject:NSPICTPboardType]
- || [pbtypes containsObject:NSTIFFPboardType])
- {
- /* We can convert a TIFF to a PNG or JPEG. */
- DebugF ("NSTIFFPboardType\n");
- list[count] = atoms->image_png;
- ++count;
- list[count] = atoms->image_jpeg;
- ++count;
- }
+ if ([pbtypes containsObject:NSPICTPboardType]
+ ||[pbtypes containsObject:NSTIFFPboardType]) {
+ /* We can convert a TIFF to a PNG or JPEG. */
+ DebugF("NSTIFFPboardType\n");
+ list[count] = atoms->image_png;
+ ++count;
+ list[count] = atoms->image_jpeg;
+ ++count;
+ }
#ifdef __clang__
#pragma clang diagnostic pop
#endif
- if (count)
- {
- /* We have a list of ATOMs to send. */
- XChangeProperty (xpbproxy_dpy, e->requestor, e->property, atoms->atom, 32,
- PropModeReplace, (unsigned char *) list, count);
-
- reply.xselection.property = e->property;
- }
+ if (count) {
+ /* We have a list of ATOMs to send. */
+ XChangeProperty(xpbproxy_dpy, e->requestor, e->property,
+ atoms->atom, 32, PropModeReplace,
+ (unsigned char *) list, count);
+
+ reply.xselection.property = e->property;
+ }
}
- [self send_reply:&reply];
+ [self send_reply:&reply];
}
-
-- (void) send_string:(XSelectionRequestEvent *)e utf8:(BOOL)utf8 pasteboard:(NSPasteboard *)pb
+ -(void) send_string:(XSelectionRequestEvent *)
+e utf8:(BOOL)
+utf8 pasteboard:(NSPasteboard *) pb
{
XEvent reply;
NSArray *pbtypes;
@@ -671,162 +650,158 @@ get_property(Window win, Atom property, struct propdata *pdata, Bool delete, Ato
const char *bytes;
NSUInteger length;
- TRACE ();
+ TRACE();
+
+ [self init_reply: &reply request:e];
- [self init_reply:&reply request:e];
+ pbtypes =[pb types];
- pbtypes = [pb types];
-
- if (![pbtypes containsObject:NSStringPboardType])
- {
- [self send_reply:&reply];
- return;
+ if (![pbtypes containsObject:NSStringPboardType]) {
+ [self send_reply:&reply];
+ return;
}
#ifdef __LP64__
- DebugF ("pbtypes retainCount after containsObject: %lu\n", [pbtypes retainCount]);
+ DebugF("pbtypes retainCount after containsObject: %lu\n",
+ [pbtypes retainCount]);
#else
- DebugF ("pbtypes retainCount after containsObject: %u\n", [pbtypes retainCount]);
+ DebugF("pbtypes retainCount after containsObject: %u\n",
+ [pbtypes retainCount]);
#endif
- data = [pb stringForType:NSStringPboardType];
+ data =[pb stringForType:NSStringPboardType];
- if (nil == data)
- {
- [self send_reply:&reply];
- return;
- }
-
- if (utf8)
- {
- bytes = [data UTF8String];
- /*
- * We don't want the UTF-8 string length here.
- * We want the length in bytes.
- */
- length = strlen (bytes);
-
- if (length < 50) {
- DebugF ("UTF-8: %s\n", bytes);
+ if (nil == data) {
+ [self send_reply:&reply];
+ return;
+ }
+
+ if (utf8) {
+ bytes =[data UTF8String];
+ /*
+ * We don't want the UTF-8 string length here.
+ * We want the length in bytes.
+ */
+ length = strlen(bytes);
+
+ if (length < 50) {
+ DebugF("UTF-8: %s\n", bytes);
#ifdef __LP64__
- DebugF ("UTF-8 length: %lu\n", length);
+ DebugF("UTF-8 length: %lu\n", length);
#else
- DebugF ("UTF-8 length: %u\n", length);
+ DebugF("UTF-8 length: %u\n", length);
#endif
- }
- }
- else
- {
- DebugF ("Latin-1\n");
- bytes = [data cStringUsingEncoding:NSISOLatin1StringEncoding];
- /*WARNING: bytes is not NUL-terminated. */
- length = [data lengthOfBytesUsingEncoding:NSISOLatin1StringEncoding];
- }
-
- DebugF ("e->target %s\n", XGetAtomName (xpbproxy_dpy, e->target));
-
- XChangeProperty (xpbproxy_dpy, e->requestor, e->property, e->target,
- 8, PropModeReplace, (unsigned char *) bytes, length);
-
+ }
+ }
+ else {
+ DebugF("Latin-1\n");
+ bytes =[data cStringUsingEncoding:NSISOLatin1StringEncoding];
+ /*WARNING: bytes is not NUL-terminated. */
+ length =[data lengthOfBytesUsingEncoding:NSISOLatin1StringEncoding];
+ }
+
+ DebugF("e->target %s\n", XGetAtomName(xpbproxy_dpy, e->target));
+
+ XChangeProperty(xpbproxy_dpy, e->requestor, e->property, e->target,
+ 8, PropModeReplace, (unsigned char *) bytes, length);
+
reply.xselection.property = e->property;
- [self send_reply:&reply];
+ [self send_reply:&reply];
}
-- (void) send_compound_text:(XSelectionRequestEvent *)e pasteboard:(NSPasteboard *)pb
+ -(void) send_compound_text:(XSelectionRequestEvent *)
+e pasteboard:(NSPasteboard *) pb
{
XEvent reply;
NSArray *pbtypes;
-
- TRACE ();
-
- [self init_reply:&reply request:e];
-
- pbtypes = [pb types];
-
- if ([pbtypes containsObject: NSStringPboardType])
- {
- NSString *data = [pb stringForType:NSStringPboardType];
- if (nil != data)
- {
- /*
- * Cast to (void *) to avoid a const warning.
- * AFAIK Xutf8TextListToTextProperty does not modify the input memory.
- */
- void *utf8 = (void *)[data UTF8String];
- char *list[] = { utf8, NULL };
- XTextProperty textprop;
-
- textprop.value = NULL;
-
- if (Success == Xutf8TextListToTextProperty (xpbproxy_dpy, list, 1,
- XCompoundTextStyle,
- &textprop))
- {
-
- if (8 != textprop.format)
- DebugF ("textprop.format is unexpectedly not 8 - it's %d instead\n",
- textprop.format);
-
- XChangeProperty (xpbproxy_dpy, e->requestor, e->property,
- atoms->compound_text, textprop.format,
- PropModeReplace, textprop.value,
- textprop.nitems);
-
- reply.xselection.property = e->property;
- }
-
- if (textprop.value)
- XFree (textprop.value);
-
- }
- }
-
- [self send_reply:&reply];
+
+ TRACE();
+
+ [self init_reply: &reply request:e];
+
+ pbtypes =[pb types];
+
+ if ([pbtypes containsObject:NSStringPboardType]) {
+ NSString *data =[pb stringForType:NSStringPboardType];
+
+ if (nil != data) {
+ /*
+ * Cast to (void *) to avoid a const warning.
+ * AFAIK Xutf8TextListToTextProperty does not modify the input memory.
+ */
+ void *utf8 = (void *)[data UTF8String];
+ char *list[] = { utf8, NULL };
+ XTextProperty textprop;
+
+ textprop.value = NULL;
+
+ if (Success == Xutf8TextListToTextProperty(xpbproxy_dpy, list, 1,
+ XCompoundTextStyle,
+ &textprop)) {
+
+ if (8 != textprop.format)
+ DebugF
+ ("textprop.format is unexpectedly not 8 - it's %d instead\n",
+ textprop.format);
+
+ XChangeProperty(xpbproxy_dpy, e->requestor, e->property,
+ atoms->compound_text, textprop.format,
+ PropModeReplace, textprop.value,
+ textprop.nitems);
+
+ reply.xselection.property = e->property;
+ }
+
+ if (textprop.value)
+ XFree(textprop.value);
+
+ }
+ }
+
+ [self send_reply:&reply];
}
/* Finding a test application that uses MULTIPLE has proven to be difficult. */
-- (void) send_multiple:(XSelectionRequestEvent *)e
-{
+ -(void) send_multiple:(XSelectionRequestEvent *) e {
XEvent reply;
- TRACE ();
+ TRACE();
+
+ [self init_reply: &reply request:e];
- [self init_reply:&reply request:e];
+ if (None != e->property) {
- if (None != e->property)
- {
-
}
-
- [self send_reply:&reply];
+
+ [self send_reply:&reply];
}
/* Return nil if an error occured. */
/* DO NOT retain the encdata for longer than the length of an event response.
* The autorelease pool will reuse/free it.
- */
-- (NSData *) encode_image_data:(NSData *)data type:(NSBitmapImageFileType)enctype
+ */
+ -(NSData *) encode_image_data:(NSData *)
+data type:(NSBitmapImageFileType) enctype
{
- NSBitmapImageRep *bmimage = nil;
+ NSBitmapImageRep *bmimage = nil;
NSData *encdata = nil;
NSDictionary *dict = nil;
- bmimage = [[NSBitmapImageRep alloc] initWithData:data];
+ bmimage =[[NSBitmapImageRep alloc] initWithData:data];
if (nil == bmimage)
- return nil;
+ return nil;
- dict = [[NSDictionary alloc] init];
- encdata = [bmimage representationUsingType:enctype properties:dict];
+ dict =[[NSDictionary alloc] init];
+ encdata =[bmimage representationUsingType: enctype properties:dict];
- if (nil == encdata)
- {
- [dict autorelease];
- [bmimage autorelease];
- return nil;
+ if (nil == encdata) {
+ [dict autorelease];
+ [bmimage autorelease];
+ return nil;
}
-
+
[dict autorelease];
[bmimage autorelease];
@@ -835,60 +810,53 @@ get_property(Window win, Atom property, struct propdata *pdata, Bool delete, Ato
/* Return YES when an error has occured when trying to send the PICT. */
/* The caller should send a default reponse with a property of None when an error occurs. */
-- (BOOL) send_image_pict_reply:(XSelectionRequestEvent *)e
- pasteboard:(NSPasteboard *)pb
- type:(NSBitmapImageFileType)imagetype
+ -(BOOL) send_image_pict_reply: (XSelectionRequestEvent *) e pasteboard: (NSPasteboard *) pb type:(NSBitmapImageFileType) imagetype
{
XEvent reply;
NSImage *img = nil;
NSData *data = nil, *encdata = nil;
NSUInteger length;
const void *bytes = NULL;
-
- img = [[NSImage alloc] initWithPasteboard:pb];
- if (nil == img)
- {
- return YES;
+ img =[[NSImage alloc] initWithPasteboard:pb];
+
+ if (nil == img) {
+ return YES;
}
-
- data = [img TIFFRepresentation];
- if (nil == data)
- {
- [img autorelease];
- ErrorF("unable to convert PICT to TIFF!\n");
- return YES;
- }
-
- encdata = [self encode_image_data:data type:imagetype];
- if(nil == encdata)
- {
- [img autorelease];
- return YES;
- }
-
- [self init_reply:&reply request:e];
-
- length = [encdata length];
- bytes = [encdata bytes];
-
- XChangeProperty (xpbproxy_dpy, e->requestor, e->property, e->target,
- 8, PropModeReplace, bytes, length);
+ data =[img TIFFRepresentation];
+
+ if (nil == data) {
+ [img autorelease];
+ ErrorF("unable to convert PICT to TIFF!\n");
+ return YES;
+ }
+
+ encdata =[self encode_image_data: data type:imagetype];
+ if (nil == encdata) {
+ [img autorelease];
+ return YES;
+ }
+
+ [self init_reply: &reply request:e];
+
+ length =[encdata length];
+ bytes =[encdata bytes];
+
+ XChangeProperty(xpbproxy_dpy, e->requestor, e->property, e->target,
+ 8, PropModeReplace, bytes, length);
reply.xselection.property = e->property;
- [self send_reply:&reply];
+ [self send_reply:&reply];
[img autorelease];
- return NO; /*no error*/
+ return NO; /*no error */
}
/* Return YES if an error occured. */
/* The caller should send a reply with a property of None when an error occurs. */
-- (BOOL) send_image_tiff_reply:(XSelectionRequestEvent *)e
- pasteboard:(NSPasteboard *)pb
- type:(NSBitmapImageFileType)imagetype
+ -(BOOL) send_image_tiff_reply: (XSelectionRequestEvent *) e pasteboard: (NSPasteboard *) pb type:(NSBitmapImageFileType) imagetype
{
XEvent reply;
NSData *data = nil;
@@ -896,91 +864,87 @@ get_property(Window win, Atom property, struct propdata *pdata, Bool delete, Ato
NSUInteger length;
const void *bytes = NULL;
- data = [pb dataForType:NSTIFFPboardType];
+ data =[pb dataForType:NSTIFFPboardType];
if (nil == data)
- return YES;
-
- encdata = [self encode_image_data:data type:imagetype];
+ return YES;
+
+ encdata =[self encode_image_data: data type:imagetype];
- if(nil == encdata)
- return YES;
+ if (nil == encdata)
+ return YES;
+
+ [self init_reply: &reply request:e];
- [self init_reply:&reply request:e];
+ length =[encdata length];
+ bytes =[encdata bytes];
- length = [encdata length];
- bytes = [encdata bytes];
-
- XChangeProperty (xpbproxy_dpy, e->requestor, e->property, e->target,
- 8, PropModeReplace, bytes, length);
+ XChangeProperty(xpbproxy_dpy, e->requestor, e->property, e->target,
+ 8, PropModeReplace, bytes, length);
reply.xselection.property = e->property;
-
- [self send_reply:&reply];
- return NO; /*no error*/
+ [self send_reply:&reply];
+
+ return NO; /*no error */
}
-- (void) send_image:(XSelectionRequestEvent *)e pasteboard:(NSPasteboard *)pb
+ -(void) send_image:(XSelectionRequestEvent *)
+e pasteboard:(NSPasteboard *) pb
{
NSArray *pbtypes = nil;
NSBitmapImageFileType imagetype = NSPNGFileType;
- TRACE ();
+ TRACE();
if (e->target == atoms->image_png)
- imagetype = NSPNGFileType;
+ imagetype = NSPNGFileType;
else if (e->target == atoms->image_jpeg)
- imagetype = NSJPEGFileType;
- else
- {
- ErrorF("internal failure in xpbproxy! imagetype being sent isn't PNG or JPEG.\n");
+ imagetype = NSJPEGFileType;
+ else {
+ ErrorF
+ ("internal failure in xpbproxy! imagetype being sent isn't PNG or JPEG.\n");
}
- pbtypes = [pb types];
+ pbtypes =[pb types];
- if (pbtypes)
- {
- if ([pbtypes containsObject:NSTIFFPboardType])
- {
- if (NO == [self send_image_tiff_reply:e pasteboard:pb type:imagetype])
- return;
- }
+ if (pbtypes) {
+ if ([pbtypes containsObject:NSTIFFPboardType]) {
+ if (NO ==[self send_image_tiff_reply: e pasteboard: pb type:imagetype])
+ return;
+ }
#ifdef __clang__
#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations" // NSPICTPboardType
+#pragma clang diagnostic ignored "-Wdeprecated-declarations" // NSPICTPboardType
#endif
- else if ([pbtypes containsObject:NSPICTPboardType])
+ else if ([pbtypes containsObject:NSPICTPboardType])
#ifdef __clang__
#pragma clang diagnostic pop
#endif
- {
- if (NO == [self send_image_pict_reply:e pasteboard:pb type:imagetype])
- return;
+ {
+ if (NO ==[self send_image_pict_reply: e pasteboard: pb type:imagetype])
+ return;
- /* Fall through intentionally to the send_none: */
- }
+ /* Fall through intentionally to the send_none: */
+ }
}
- [self send_none:e];
+ [self send_none:e];
}
-- (void)send_none:(XSelectionRequestEvent *)e
-{
+ -(void) send_none:(XSelectionRequestEvent *) e {
XEvent reply;
- TRACE ();
+ TRACE();
- [self init_reply:&reply request:e];
- [self send_reply:&reply];
+ [self init_reply: &reply request:e];
+ [self send_reply:&reply];
}
-
/* Another client requested the data or targets of data available from the clipboard. */
-- (void)request_event:(XSelectionRequestEvent *)e
-{
+ -(void) request_event:(XSelectionRequestEvent *) e {
NSPasteboard *pb;
- TRACE ();
+ TRACE();
/* TODO We should also keep track of the time of the selection, and
* according to the ICCCM "refuse the request" if the event timestamp
@@ -992,388 +956,367 @@ get_property(Window win, Atom property, struct propdata *pdata, Bool delete, Ato
* Perhaps we should just punt and ignore races.
*/
- /*TODO we need a COMPOUND_TEXT test app*/
- /*TODO we need a MULTIPLE test app*/
+ /*TODO we need a COMPOUND_TEXT test app */
+ /*TODO we need a MULTIPLE test app */
- pb = [NSPasteboard generalPasteboard];
- if (nil == pb)
- {
- [self send_none:e];
- return;
+ pb =[NSPasteboard generalPasteboard];
+ if (nil == pb) {
+ [self send_none:e];
+ return;
}
-
if (None != e->target)
- DebugF ("e->target %s\n", XGetAtomName (xpbproxy_dpy, e->target));
-
- if (e->target == atoms->targets)
- {
- /* The paste requestor wants to know what TARGETS we support. */
- [self send_targets:e pasteboard:pb];
- }
- else if (e->target == atoms->multiple)
- {
- /*
- * This isn't finished, and may never be, unless I can find
- * a good test app.
- */
- [self send_multiple:e];
- }
- else if (e->target == atoms->utf8_string)
- {
- [self send_string:e utf8:YES pasteboard:pb];
- }
- else if (e->target == atoms->string)
- {
- [self send_string:e utf8:NO pasteboard:pb];
- }
- else if (e->target == atoms->compound_text)
- {
- [self send_compound_text:e pasteboard:pb];
- }
- else if (e->target == atoms->multiple)
- {
- [self send_multiple:e];
- }
- else if (e->target == atoms->image_png || e->target == atoms->image_jpeg)
- {
- [self send_image:e pasteboard:pb];
+ DebugF("e->target %s\n", XGetAtomName(xpbproxy_dpy, e->target));
+
+ if (e->target == atoms->targets) {
+ /* The paste requestor wants to know what TARGETS we support. */
+ [self send_targets: e pasteboard:pb];
}
- else
- {
- [self send_none:e];
+ else if (e->target == atoms->multiple) {
+ /*
+ * This isn't finished, and may never be, unless I can find
+ * a good test app.
+ */
+ [self send_multiple:e];
+ }
+ else if (e->target == atoms->utf8_string) {
+ [self send_string: e utf8: YES pasteboard:pb];
+ }
+ else if (e->target == atoms->string) {
+ [self send_string: e utf8: NO pasteboard:pb];
+ }
+ else if (e->target == atoms->compound_text) {
+ [self send_compound_text: e pasteboard:pb];
+ }
+ else if (e->target == atoms->multiple) {
+ [self send_multiple:e];
+ }
+ else if (e->target == atoms->image_png || e->target == atoms->image_jpeg) {
+ [self send_image: e pasteboard:pb];
+ }
+ else {
+ [self send_none:e];
}
}
/* This handles the events resulting from an XConvertSelection request. */
-- (void) notify_event:(XSelectionEvent *)e
-{
+ -(void) notify_event:(XSelectionEvent *) e {
Atom type;
struct propdata pdata;
-
- TRACE ();
+
+ TRACE();
[self release_pending];
-
+
if (None == e->property) {
- DebugF ("e->property is None.\n");
- [self copy_completed:e->selection];
- /* Nothing is selected. */
- return;
+ DebugF("e->property is None.\n");
+ [self copy_completed:e->selection];
+ /* Nothing is selected. */
+ return;
}
#if 0
- ErrorF("e->selection %s\n", XGetAtomName (xpbproxy_dpy, e->selection));
- ErrorF("e->property %s\n", XGetAtomName (xpbproxy_dpy, e->property));
+ ErrorF("e->selection %s\n", XGetAtomName(xpbproxy_dpy, e->selection));
+ ErrorF("e->property %s\n", XGetAtomName(xpbproxy_dpy, e->property));
#endif
- if ([self is_incr_type:e])
- {
- /*
- * This is an INCR-style transfer, which means that we
- * will get the data after a series of PropertyNotify events.
- */
- DebugF ("is INCR\n");
+ if ([self is_incr_type:e]) {
+ /*
+ * This is an INCR-style transfer, which means that we
+ * will get the data after a series of PropertyNotify events.
+ */
+ DebugF("is INCR\n");
- if (get_property (e->requestor, e->property, &pdata, /*Delete*/ True, &type))
- {
- /*
- * An error occured, so we should invoke the copy_completed:, but
- * not handle_selection:type:propdata:
- */
- [self copy_completed:e->selection];
- return;
- }
+ if (get_property
+ (e->requestor, e->property, &pdata, /*Delete */ True, &type)) {
+ /*
+ * An error occured, so we should invoke the copy_completed:, but
+ * not handle_selection:type:propdata:
+ */
+ [self copy_completed:e->selection];
+ return;
+ }
- free_propdata (&pdata);
+ free_propdata(&pdata);
- pending.requestor = e->requestor;
- pending.selection = e->selection;
+ pending.requestor = e->requestor;
+ pending.selection = e->selection;
- DebugF ("set pending.requestor to 0x%lx\n", pending.requestor);
+ DebugF("set pending.requestor to 0x%lx\n", pending.requestor);
}
- else
- {
- if (get_property (e->requestor, e->property, &pdata, /*Delete*/ True, &type))
- {
- [self copy_completed:e->selection];
- return;
- }
-
- /* We have the complete selection data.*/
- [self handle_selection:e->selection type:type propdata:&pdata];
-
- DebugF ("handled selection with the first notify_event\n");
+ else {
+ if (get_property
+ (e->requestor, e->property, &pdata, /*Delete */ True, &type)) {
+ [self copy_completed:e->selection];
+ return;
+ }
+
+ /* We have the complete selection data. */
+ [self handle_selection: e->selection type: type propdata:&pdata];
+
+ DebugF("handled selection with the first notify_event\n");
}
}
/* This is used for INCR transfers. See the ICCCM for the details. */
/* This is used to retrieve PRIMARY and CLIPBOARD selections. */
-- (void) property_event:(XPropertyEvent *)e
-{
+ -(void) property_event:(XPropertyEvent *) e {
struct propdata pdata;
Atom type;
- TRACE ();
-
- if (None != e->atom)
- {
+ TRACE();
+
+ if (None != e->atom) {
#ifdef DEBUG
- char *name = XGetAtomName (xpbproxy_dpy, e->atom);
+ char *name = XGetAtomName(xpbproxy_dpy, e->atom);
- if (name)
- {
- DebugF ("e->atom %s\n", name);
- XFree(name);
- }
+ if (name) {
+ DebugF("e->atom %s\n", name);
+ XFree(name);
+ }
#endif
}
- if (None != pending.requestor && PropertyNewValue == e->state)
- {
- DebugF ("pending.requestor 0x%lx\n", pending.requestor);
+ if (None != pending.requestor && PropertyNewValue == e->state) {
+ DebugF("pending.requestor 0x%lx\n", pending.requestor);
- if (get_property (e->window, e->atom, &pdata, /*Delete*/ True, &type))
- {
- [self copy_completed:pending.selection];
- [self release_pending];
- return;
- }
-
- if (0 == pdata.length)
- {
- /*
- * We completed the transfer.
- * handle_selection will call copy_completed: for us.
- */
- [self handle_selection:pending.selection type:type propdata:&pending.propdata];
- free_propdata(&pdata);
- pending.propdata = null_propdata;
- pending.requestor = None;
- pending.selection = None;
- }
- else
- {
- [self append_to_pending:&pdata requestor:e->window];
- free_propdata (&pdata);
- }
+ if (get_property(e->window, e->atom, &pdata, /*Delete */ True, &type)) {
+ [self copy_completed:pending.selection];
+ [self release_pending];
+ return;
+ }
+
+ if (0 == pdata.length) {
+ /*
+ * We completed the transfer.
+ * handle_selection will call copy_completed: for us.
+ */
+ [self handle_selection: pending.selection type: type propdata:&pending.
+ propdata];
+ free_propdata(&pdata);
+ pending.propdata = null_propdata;
+ pending.requestor = None;
+ pending.selection = None;
+ }
+ else {
+ [self append_to_pending: &pdata requestor:e->window];
+ free_propdata(&pdata);
+ }
}
}
-- (void) xfixes_selection_notify:(XFixesSelectionNotifyEvent *)e {
- if(!pbproxy_prefs.active)
+ -(void) xfixes_selection_notify:(XFixesSelectionNotifyEvent *) e {
+ if (!pbproxy_prefs.active)
return;
-
- switch(e->subtype) {
- case XFixesSetSelectionOwnerNotify:
- if(e->selection == atoms->primary && pbproxy_prefs.primary_on_grab)
- [self x_copy:e->timestamp];
- break;
-
- case XFixesSelectionWindowDestroyNotify:
- case XFixesSelectionClientCloseNotify:
- default:
- ErrorF("Unhandled XFixesSelectionNotifyEvent: subtype=%d\n", e->subtype);
- break;
+
+ switch (e->subtype) {
+ case XFixesSetSelectionOwnerNotify:
+ if (e->selection == atoms->primary && pbproxy_prefs.primary_on_grab)
+ [self x_copy:e->timestamp];
+ break;
+
+ case XFixesSelectionWindowDestroyNotify:
+ case XFixesSelectionClientCloseNotify:
+ default:
+ ErrorF("Unhandled XFixesSelectionNotifyEvent: subtype=%d\n",
+ e->subtype);
+ break;
}
}
-- (void) handle_targets: (Atom)selection propdata:(struct propdata *)pdata
+ -(void) handle_targets:(Atom)
+selection propdata:(struct propdata *) pdata
{
/* Find a type we can handle and prefer from the list of ATOMs. */
Atom preferred;
char *name;
- TRACE ();
+ TRACE();
+
+ preferred =[self find_preferred:pdata];
- preferred = [self find_preferred:pdata];
-
- if (None == preferred)
- {
- /*
- * This isn't required by the ICCCM, but some apps apparently
- * don't respond to TARGETS properly.
- */
- preferred = atoms->string;
+ if (None == preferred) {
+ /*
+ * This isn't required by the ICCCM, but some apps apparently
+ * don't respond to TARGETS properly.
+ */
+ preferred = atoms->string;
}
- (void)name; /* Avoid a warning with non-debug compiles. */
+ (void) name; /* Avoid a warning with non-debug compiles. */
#ifdef DEBUG
- name = XGetAtomName (xpbproxy_dpy, preferred);
+ name = XGetAtomName(xpbproxy_dpy, preferred);
- if (name)
- {
- DebugF ("requesting %s\n", name);
+ if (name) {
+ DebugF("requesting %s\n", name);
}
#endif
request_atom = preferred;
- XConvertSelection (xpbproxy_dpy, selection, preferred, selection,
- _selection_window, CurrentTime);
+ XConvertSelection(xpbproxy_dpy, selection, preferred, selection,
+ _selection_window, CurrentTime);
}
/* This handles the image type of selection (typically in CLIPBOARD). */
/* We convert to a TIFF, so that other applications can paste more easily. */
-- (void) handle_image: (struct propdata *)pdata pasteboard:(NSPasteboard *)pb
+ -(void) handle_image:(struct propdata *)
+pdata pasteboard:(NSPasteboard *) pb
{
NSArray *pbtypes;
NSUInteger length;
NSData *data, *tiff;
NSBitmapImageRep *bmimage;
- TRACE ();
+ TRACE();
length = pdata->length;
- data = [[NSData alloc] initWithBytes:pdata->data length:length];
+ data =[[NSData alloc] initWithBytes: pdata->data length:length];
- if (nil == data)
- {
- DebugF ("unable to create NSData object!\n");
- return;
+ if (nil == data) {
+ DebugF("unable to create NSData object!\n");
+ return;
}
#ifdef __LP64__
- DebugF ("data retainCount before NSBitmapImageRep initWithData: %lu\n",
- [data retainCount]);
+ DebugF("data retainCount before NSBitmapImageRep initWithData: %lu\n",
+ [data retainCount]);
#else
- DebugF ("data retainCount before NSBitmapImageRep initWithData: %u\n",
- [data retainCount]);
+ DebugF("data retainCount before NSBitmapImageRep initWithData: %u\n",
+ [data retainCount]);
#endif
- bmimage = [[NSBitmapImageRep alloc] initWithData:data];
+ bmimage =[[NSBitmapImageRep alloc] initWithData:data];
- if (nil == bmimage)
- {
- [data autorelease];
- DebugF ("unable to create NSBitmapImageRep!\n");
- return;
+ if (nil == bmimage) {
+ [data autorelease];
+ DebugF("unable to create NSBitmapImageRep!\n");
+ return;
}
#ifdef __LP64__
- DebugF ("data retainCount after NSBitmapImageRep initWithData: %lu\n",
- [data retainCount]);
+ DebugF("data retainCount after NSBitmapImageRep initWithData: %lu\n",
+ [data retainCount]);
#else
- DebugF ("data retainCount after NSBitmapImageRep initWithData: %u\n",
- [data retainCount]);
+ DebugF("data retainCount after NSBitmapImageRep initWithData: %u\n",
+ [data retainCount]);
#endif
- @try
- {
- tiff = [bmimage TIFFRepresentation];
+ @try {
+ tiff =[bmimage TIFFRepresentation];
}
- @catch (NSException *e)
- {
- DebugF ("NSTIFFException!\n");
- [data autorelease];
- [bmimage autorelease];
- return;
+ @catch(NSException * e) {
+ DebugF("NSTIFFException!\n");
+ [data autorelease];
+ [bmimage autorelease];
+ return;
}
-
+
#ifdef __LP64__
- DebugF ("bmimage retainCount after TIFFRepresentation %lu\n", [bmimage retainCount]);
+ DebugF("bmimage retainCount after TIFFRepresentation %lu\n",
+ [bmimage retainCount]);
#else
- DebugF ("bmimage retainCount after TIFFRepresentation %u\n", [bmimage retainCount]);
+ DebugF("bmimage retainCount after TIFFRepresentation %u\n",
+ [bmimage retainCount]);
#endif
- pbtypes = [NSArray arrayWithObjects:NSTIFFPboardType, nil];
+ pbtypes =[NSArray arrayWithObjects:NSTIFFPboardType, nil];
- if (nil == pbtypes)
- {
- [data autorelease];
- [bmimage autorelease];
- return;
+ if (nil == pbtypes) {
+ [data autorelease];
+ [bmimage autorelease];
+ return;
}
- [pb declareTypes:pbtypes owner:nil];
- if (YES != [pb setData:tiff forType:NSTIFFPboardType])
- {
- DebugF ("writing pasteboard data failed!\n");
+ [pb declareTypes: pbtypes owner:nil];
+ if (YES !=[pb setData: tiff forType:NSTIFFPboardType]) {
+ DebugF("writing pasteboard data failed!\n");
}
[data autorelease];
#ifdef __LP64__
- DebugF ("bmimage retainCount before release %lu\n", [bmimage retainCount]);
+ DebugF("bmimage retainCount before release %lu\n",[bmimage retainCount]);
#else
- DebugF ("bmimage retainCount before release %u\n", [bmimage retainCount]);
+ DebugF("bmimage retainCount before release %u\n",[bmimage retainCount]);
#endif
[bmimage autorelease];
}
/* This handles the UTF8_STRING type of selection. */
-- (void) handle_utf8_string:(struct propdata *)pdata pasteboard:(NSPasteboard *)pb
+ -(void) handle_utf8_string:(struct propdata *)
+pdata pasteboard:(NSPasteboard *) pb
{
NSString *string;
NSArray *pbtypes;
-
- TRACE ();
- string = [[NSString alloc] initWithBytes:pdata->data length:pdata->length encoding:NSUTF8StringEncoding];
-
+ TRACE();
+
+ string =[[NSString alloc] initWithBytes: pdata->data length: pdata->length encoding:NSUTF8StringEncoding];
+
if (nil == string)
- return;
+ return;
- pbtypes = [NSArray arrayWithObjects:NSStringPboardType, nil];
+ pbtypes =[NSArray arrayWithObjects:NSStringPboardType, nil];
- if (nil == pbtypes)
- {
- [string autorelease];
- return;
+ if (nil == pbtypes) {
+ [string autorelease];
+ return;
}
- [pb declareTypes:pbtypes owner:nil];
-
- if (YES != [pb setString:string forType:NSStringPboardType]) {
- ErrorF("pasteboard setString:forType: failed!\n");
+ [pb declareTypes: pbtypes owner:nil];
+
+ if (YES !=[pb setString: string forType:NSStringPboardType]) {
+ ErrorF("pasteboard setString:forType: failed!\n");
}
[string autorelease];
- DebugF ("done handling utf8 string\n");
+ DebugF("done handling utf8 string\n");
}
/* This handles the STRING type, which should be in Latin-1. */
-- (void) handle_string: (struct propdata *)pdata pasteboard:(NSPasteboard *)pb
+ -(void) handle_string:(struct propdata *)
+pdata pasteboard:(NSPasteboard *) pb
{
- NSString *string;
+ NSString *string;
NSArray *pbtypes;
- TRACE ();
+ TRACE();
+
+ string =[[NSString alloc] initWithBytes: pdata->data length: pdata->length encoding:NSISOLatin1StringEncoding];
- string = [[NSString alloc] initWithBytes:pdata->data length:pdata->length encoding:NSISOLatin1StringEncoding];
-
if (nil == string)
- return;
+ return;
- pbtypes = [NSArray arrayWithObjects:NSStringPboardType, nil];
+ pbtypes =[NSArray arrayWithObjects:NSStringPboardType, nil];
- if (nil == pbtypes)
- {
- [string autorelease];
- return;
+ if (nil == pbtypes) {
+ [string autorelease];
+ return;
}
- [pb declareTypes:pbtypes owner:nil];
- if (YES != [pb setString:string forType:NSStringPboardType]) {
- ErrorF("pasteboard setString:forType failed in handle_string!\n");
+ [pb declareTypes: pbtypes owner:nil];
+ if (YES !=[pb setString: string forType:NSStringPboardType]) {
+ ErrorF("pasteboard setString:forType failed in handle_string!\n");
}
[string autorelease];
}
/* This is called when the selection is completely retrieved from another client. */
/* Warning: this frees the propdata. */
-- (void) handle_selection:(Atom)selection type:(Atom)type propdata:(struct propdata *)pdata
+ -(void) handle_selection:(Atom)
+selection type:(Atom)
+type propdata:(struct propdata *) pdata
{
NSPasteboard *pb;
- TRACE ();
+ TRACE();
- pb = [NSPasteboard generalPasteboard];
+ pb =[NSPasteboard generalPasteboard];
- if (nil == pb)
- {
- [self copy_completed:selection];
- free_propdata (pdata);
- return;
+ if (nil == pb) {
+ [self copy_completed:selection];
+ free_propdata(pdata);
+ return;
}
/*
@@ -1381,205 +1324,201 @@ get_property(Window win, Atom property, struct propdata *pdata, Bool delete, Ato
* These aren't ICCCM compliant apps, but we need these to work...
*/
if (request_atom == atoms->targets
- && (type == atoms->atom || type == atoms->targets))
- {
- [self handle_targets:selection propdata:pdata];
- free_propdata(pdata);
- return;
- }
- else if (type == atoms->image_png)
- {
- [self handle_image:pdata pasteboard:pb];
- }
- else if (type == atoms->image_jpeg)
- {
- [self handle_image:pdata pasteboard:pb];
- }
- else if (type == atoms->utf8_string)
- {
- [self handle_utf8_string:pdata pasteboard:pb];
- }
- else if (type == atoms->string)
- {
- [self handle_string:pdata pasteboard:pb];
- }
-
+ && (type == atoms->atom || type == atoms->targets)) {
+ [self handle_targets: selection propdata:pdata];
+ free_propdata(pdata);
+ return;
+ }
+ else if (type == atoms->image_png) {
+ [self handle_image: pdata pasteboard:pb];
+ }
+ else if (type == atoms->image_jpeg) {
+ [self handle_image: pdata pasteboard:pb];
+ }
+ else if (type == atoms->utf8_string) {
+ [self handle_utf8_string: pdata pasteboard:pb];
+ }
+ else if (type == atoms->string) {
+ [self handle_string: pdata pasteboard:pb];
+ }
+
free_propdata(pdata);
- [self copy_completed:selection];
+ [self copy_completed:selection];
}
-
-- (void) copy_completed:(Atom)selection
-{
- TRACE ();
+ -(void) copy_completed:(Atom) selection {
+ TRACE();
char *name;
- (void)name; /* Avoid warning with non-debug compiles. */
+ (void) name; /* Avoid warning with non-debug compiles. */
#ifdef DEBUG
- name = XGetAtomName (xpbproxy_dpy, selection);
- if (name)
- {
- DebugF ("copy_completed: %s\n", name);
- XFree (name);
+ name = XGetAtomName(xpbproxy_dpy, selection);
+ if (name) {
+ DebugF("copy_completed: %s\n", name);
+ XFree(name);
}
#endif
- if (selection == atoms->primary && pending_copy > 0)
- {
- --pending_copy;
- if (pending_copy > 0)
- {
- /* Copy PRIMARY again. */
- [self x_copy_request_targets];
- return;
- }
- }
- else if (selection == atoms->clipboard && pending_clipboard > 0)
- {
- --pending_clipboard;
- if (pending_clipboard > 0)
- {
- /* Copy CLIPBOARD. */
- [self claim_clipboard];
- return;
- }
- else
- {
- /* We got the final data. Now set pbproxy as the owner. */
- [self own_clipboard];
- return;
- }
- }
-
+ if (selection == atoms->primary && pending_copy > 0) {
+ --pending_copy;
+ if (pending_copy > 0) {
+ /* Copy PRIMARY again. */
+ [self x_copy_request_targets];
+ return;
+ }
+ }
+ else if (selection == atoms->clipboard && pending_clipboard > 0) {
+ --pending_clipboard;
+ if (pending_clipboard > 0) {
+ /* Copy CLIPBOARD. */
+ [self claim_clipboard];
+ return;
+ }
+ else {
+ /* We got the final data. Now set pbproxy as the owner. */
+ [self own_clipboard];
+ return;
+ }
+ }
+
/*
* We had 1 or more primary in progress, and the clipboard arrived
* while we were busy.
*/
- if (pending_clipboard > 0)
- {
- [self claim_clipboard];
+ if (pending_clipboard > 0) {
+ [self claim_clipboard];
}
}
-- (void) reload_preferences
-{
+-(void) reload_preferences {
/*
* It's uncertain how we could handle the synchronization failing, so cast to void.
* The prefs_get_bool should fall back to defaults if the org.x.X11 plist doesn't exist or is invalid.
*/
- (void)CFPreferencesAppSynchronize(app_prefs_domain_cfstr);
+ (void) CFPreferencesAppSynchronize(app_prefs_domain_cfstr);
#ifdef STANDALONE_XPBPROXY
- if(xpbproxy_is_standalone)
+ if (xpbproxy_is_standalone)
pbproxy_prefs.active = YES;
else
#endif
- pbproxy_prefs.active = prefs_get_bool(CFSTR("sync_pasteboard"), pbproxy_prefs.active);
- pbproxy_prefs.primary_on_grab = prefs_get_bool(CFSTR("sync_primary_on_select"), pbproxy_prefs.primary_on_grab);
- pbproxy_prefs.clipboard_to_pasteboard = prefs_get_bool(CFSTR("sync_clipboard_to_pasteboard"), pbproxy_prefs.clipboard_to_pasteboard);
- pbproxy_prefs.pasteboard_to_primary = prefs_get_bool(CFSTR("sync_pasteboard_to_primary"), pbproxy_prefs.pasteboard_to_primary);
- pbproxy_prefs.pasteboard_to_clipboard = prefs_get_bool(CFSTR("sync_pasteboard_to_clipboard"), pbproxy_prefs.pasteboard_to_clipboard);
+ pbproxy_prefs.active =
+ prefs_get_bool(CFSTR("sync_pasteboard"), pbproxy_prefs.active);
+ pbproxy_prefs.primary_on_grab =
+ prefs_get_bool(CFSTR("sync_primary_on_select"),
+ pbproxy_prefs.primary_on_grab);
+ pbproxy_prefs.clipboard_to_pasteboard =
+ prefs_get_bool(CFSTR("sync_clipboard_to_pasteboard"),
+ pbproxy_prefs.clipboard_to_pasteboard);
+ pbproxy_prefs.pasteboard_to_primary =
+ prefs_get_bool(CFSTR("sync_pasteboard_to_primary"),
+ pbproxy_prefs.pasteboard_to_primary);
+ pbproxy_prefs.pasteboard_to_clipboard =
+ prefs_get_bool(CFSTR("sync_pasteboard_to_clipboard"),
+ pbproxy_prefs.pasteboard_to_clipboard);
/* This is used for debugging. */
//dump_prefs();
- if(pbproxy_prefs.active && pbproxy_prefs.primary_on_grab && !xpbproxy_have_xfixes) {
- ErrorF("Disabling sync_primary_on_select functionality due to missing XFixes extension.\n");
+ if (pbproxy_prefs.active && pbproxy_prefs.primary_on_grab &&
+ !xpbproxy_have_xfixes) {
+ ErrorF
+ ("Disabling sync_primary_on_select functionality due to missing XFixes extension.\n");
pbproxy_prefs.primary_on_grab = NO;
}
/* Claim or release the CLIPBOARD_MANAGER atom */
- if(![self set_clipboard_manager_status:(pbproxy_prefs.active && pbproxy_prefs.clipboard_to_pasteboard)])
+ if (![self set_clipboard_manager_status:(pbproxy_prefs.active &&
+ pbproxy_prefs.
+ clipboard_to_pasteboard)])
pbproxy_prefs.clipboard_to_pasteboard = NO;
-
- if(pbproxy_prefs.active && pbproxy_prefs.clipboard_to_pasteboard)
+
+ if (pbproxy_prefs.active && pbproxy_prefs.clipboard_to_pasteboard)
[self claim_clipboard];
}
-- (BOOL) is_active
-{
+-(BOOL) is_active {
return pbproxy_prefs.active;
}
/* NSPasteboard-required methods */
-- (void) paste:(id)sender
-{
- TRACE ();
+ -(void) paste:(id) sender {
+ TRACE();
}
-- (void) pasteboard:(NSPasteboard *)pb provideDataForType:(NSString *)type
+ -(void) pasteboard:(NSPasteboard *)
+pb provideDataForType:(NSString *) type
{
- TRACE ();
+ TRACE();
}
-- (void) pasteboardChangedOwner:(NSPasteboard *)pb
-{
- TRACE ();
+ -(void) pasteboardChangedOwner:(NSPasteboard *) pb {
+ TRACE();
/* Right now we don't care with this. */
}
/* Allocation */
-- init
-{
+-init {
unsigned long pixel;
- self = [super init];
+ self =[super init];
if (self == nil)
- return nil;
-
- atoms->primary = XInternAtom (xpbproxy_dpy, "PRIMARY", False);
- atoms->clipboard = XInternAtom (xpbproxy_dpy, "CLIPBOARD", False);
- atoms->text = XInternAtom (xpbproxy_dpy, "TEXT", False);
- atoms->utf8_string = XInternAtom (xpbproxy_dpy, "UTF8_STRING", False);
- atoms->string = XInternAtom (xpbproxy_dpy, "STRING", False);
- atoms->targets = XInternAtom (xpbproxy_dpy, "TARGETS", False);
- atoms->multiple = XInternAtom (xpbproxy_dpy, "MULTIPLE", False);
- atoms->cstring = XInternAtom (xpbproxy_dpy, "CSTRING", False);
- atoms->image_png = XInternAtom (xpbproxy_dpy, "image/png", False);
- atoms->image_jpeg = XInternAtom (xpbproxy_dpy, "image/jpeg", False);
- atoms->incr = XInternAtom (xpbproxy_dpy, "INCR", False);
- atoms->atom = XInternAtom (xpbproxy_dpy, "ATOM", False);
- atoms->clipboard_manager = XInternAtom (xpbproxy_dpy, "CLIPBOARD_MANAGER", False);
- atoms->compound_text = XInternAtom (xpbproxy_dpy, "COMPOUND_TEXT", False);
- atoms->atom_pair = XInternAtom (xpbproxy_dpy, "ATOM_PAIR", False);
-
- pixel = BlackPixel (xpbproxy_dpy, DefaultScreen (xpbproxy_dpy));
- _selection_window = XCreateSimpleWindow (xpbproxy_dpy, DefaultRootWindow (xpbproxy_dpy),
- 0, 0, 1, 1, 0, pixel, pixel);
+ return nil;
+
+ atoms->primary = XInternAtom(xpbproxy_dpy, "PRIMARY", False);
+ atoms->clipboard = XInternAtom(xpbproxy_dpy, "CLIPBOARD", False);
+ atoms->text = XInternAtom(xpbproxy_dpy, "TEXT", False);
+ atoms->utf8_string = XInternAtom(xpbproxy_dpy, "UTF8_STRING", False);
+ atoms->string = XInternAtom(xpbproxy_dpy, "STRING", False);
+ atoms->targets = XInternAtom(xpbproxy_dpy, "TARGETS", False);
+ atoms->multiple = XInternAtom(xpbproxy_dpy, "MULTIPLE", False);
+ atoms->cstring = XInternAtom(xpbproxy_dpy, "CSTRING", False);
+ atoms->image_png = XInternAtom(xpbproxy_dpy, "image/png", False);
+ atoms->image_jpeg = XInternAtom(xpbproxy_dpy, "image/jpeg", False);
+ atoms->incr = XInternAtom(xpbproxy_dpy, "INCR", False);
+ atoms->atom = XInternAtom(xpbproxy_dpy, "ATOM", False);
+ atoms->clipboard_manager =
+ XInternAtom(xpbproxy_dpy, "CLIPBOARD_MANAGER", False);
+ atoms->compound_text = XInternAtom(xpbproxy_dpy, "COMPOUND_TEXT", False);
+ atoms->atom_pair = XInternAtom(xpbproxy_dpy, "ATOM_PAIR", False);
+
+ pixel = BlackPixel(xpbproxy_dpy, DefaultScreen(xpbproxy_dpy));
+ _selection_window =
+ XCreateSimpleWindow(xpbproxy_dpy, DefaultRootWindow(xpbproxy_dpy), 0, 0,
+ 1, 1, 0, pixel, pixel);
/* This is used to get PropertyNotify events when doing INCR transfers. */
- XSelectInput (xpbproxy_dpy, _selection_window, PropertyChangeMask);
+ XSelectInput(xpbproxy_dpy, _selection_window, PropertyChangeMask);
request_atom = None;
- init_propdata (&pending.propdata);
+ init_propdata(&pending.propdata);
pending.requestor = None;
pending.selection = None;
pending_copy = 0;
pending_clipboard = 0;
- if(xpbproxy_have_xfixes)
- XFixesSelectSelectionInput(xpbproxy_dpy, _selection_window, atoms->primary,
+ if (xpbproxy_have_xfixes)
+ XFixesSelectSelectionInput(xpbproxy_dpy, _selection_window,
+ atoms->primary,
XFixesSetSelectionOwnerNotifyMask);
[self reload_preferences];
-
+
return self;
}
-- (void) dealloc
-{
- if (None != _selection_window)
- {
- XDestroyWindow (xpbproxy_dpy, _selection_window);
- _selection_window = None;
+-(void) dealloc {
+ if (None != _selection_window) {
+ XDestroyWindow(xpbproxy_dpy, _selection_window);
+ _selection_window = None;
}
- free_propdata (&pending.propdata);
+ free_propdata(&pending.propdata);
[super dealloc];
}