XQuartz: pbproxy: Add an X error handler that returns 0.
Move the struct atom_list into the x-selection class, so that it's
no longer a global variable named atoms. This may ease pthread
integration and reduce the chances of symbols conflicting.
(cherry picked from commit c1403c713c
)
This commit is contained in:
parent
7fa6fc5ad0
commit
852a0b0dde
|
@ -14,9 +14,6 @@
|
||||||
Display *x_dpy;
|
Display *x_dpy;
|
||||||
int x_apple_wm_event_base, x_apple_wm_error_base;
|
int x_apple_wm_event_base, x_apple_wm_error_base;
|
||||||
|
|
||||||
struct atom_list atom_list_inst;
|
|
||||||
struct atom_list *atoms = &atom_list_inst;
|
|
||||||
|
|
||||||
static int x_grab_count;
|
static int x_grab_count;
|
||||||
static Bool x_grab_synced;
|
static Bool x_grab_synced;
|
||||||
|
|
||||||
|
@ -57,6 +54,10 @@ static int x_io_error_handler (Display *dpy) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int x_error_handler (Display *dpy, XErrorEvent *errevent) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void x_init (void) {
|
static void x_init (void) {
|
||||||
x_dpy = XOpenDisplay (NULL);
|
x_dpy = XOpenDisplay (NULL);
|
||||||
if (x_dpy == NULL) {
|
if (x_dpy == NULL) {
|
||||||
|
@ -65,20 +66,7 @@ static void x_init (void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
XSetIOErrorHandler (x_io_error_handler);
|
XSetIOErrorHandler (x_io_error_handler);
|
||||||
atoms->primary = XInternAtom (x_dpy, "PRIMARY", False);
|
XSetErrorHandler (x_error_handler);
|
||||||
atoms->clipboard = XInternAtom (x_dpy, "CLIPBOARD", False);
|
|
||||||
atoms->text = XInternAtom (x_dpy, "TEXT", False);
|
|
||||||
atoms->utf8_string = XInternAtom (x_dpy, "UTF8_STRING", False);
|
|
||||||
atoms->targets = XInternAtom (x_dpy, "TARGETS", False);
|
|
||||||
atoms->multiple = XInternAtom (x_dpy, "MULTIPLE", False);
|
|
||||||
atoms->cstring = XInternAtom (x_dpy, "CSTRING", False);
|
|
||||||
atoms->image_png = XInternAtom (x_dpy, "image/png", False);
|
|
||||||
atoms->image_jpeg = XInternAtom (x_dpy, "image/jpeg", False);
|
|
||||||
atoms->incr = XInternAtom (x_dpy, "INCR", False);
|
|
||||||
atoms->atom = XInternAtom (x_dpy, "ATOM", False);
|
|
||||||
atoms->clipboard_manager = XInternAtom (x_dpy, "CLIPBOARD_MANAGER", False);
|
|
||||||
atoms->compound_text = XInternAtom (x_dpy, "COMPOUND_TEXT", False);
|
|
||||||
atoms->atom_pair = XInternAtom (x_dpy, "ATOM_PAIR", False);
|
|
||||||
|
|
||||||
if (!XAppleWMQueryExtension (x_dpy, &x_apple_wm_event_base,
|
if (!XAppleWMQueryExtension (x_dpy, &x_apple_wm_event_base,
|
||||||
&x_apple_wm_error_base)) {
|
&x_apple_wm_error_base)) {
|
||||||
|
|
|
@ -23,14 +23,6 @@ extern Time x_current_timestamp (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;
|
||||||
|
|
||||||
struct atom_list {
|
|
||||||
Atom primary, clipboard, text, utf8_string, string, targets, multiple,
|
|
||||||
cstring, image_png, image_jpeg, incr, atom, clipboard_manager,
|
|
||||||
compound_text, atom_pair;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern struct atom_list *atoms;
|
|
||||||
|
|
||||||
/* from x-input.m */
|
/* from x-input.m */
|
||||||
extern void x_input_register (void);
|
extern void x_input_register (void);
|
||||||
extern void x_input_run (void);
|
extern void x_input_run (void);
|
||||||
|
|
|
@ -40,6 +40,13 @@ struct propdata {
|
||||||
size_t length;
|
size_t length;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct atom_list {
|
||||||
|
Atom primary, clipboard, text, utf8_string, string, targets, multiple,
|
||||||
|
cstring, image_png, image_jpeg, incr, atom, clipboard_manager,
|
||||||
|
compound_text, atom_pair;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
@interface x_selection : NSObject
|
@interface x_selection : NSObject
|
||||||
{
|
{
|
||||||
@private
|
@private
|
||||||
|
@ -79,6 +86,8 @@ struct propdata {
|
||||||
* CLIPBOARD. It also prevents a race with INCR transfers.
|
* 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_active:(Time)timestamp;
|
||||||
|
|
|
@ -85,80 +85,6 @@ free_propdata (struct propdata *pdata)
|
||||||
*pdata = null_propdata;
|
*pdata = null_propdata;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return True if this is an INCR-style transfer. */
|
|
||||||
static Bool
|
|
||||||
is_incr_type (XSelectionEvent *e)
|
|
||||||
{
|
|
||||||
Atom seltype;
|
|
||||||
int format;
|
|
||||||
unsigned long numitems = 0UL, bytesleft = 0UL;
|
|
||||||
unsigned char *chunk;
|
|
||||||
|
|
||||||
TRACE ();
|
|
||||||
|
|
||||||
if (Success != XGetWindowProperty (x_dpy, e->requestor, e->property,
|
|
||||||
/*offset*/ 0L, /*length*/ 4UL,
|
|
||||||
/*Delete*/ False,
|
|
||||||
AnyPropertyType, &seltype, &format,
|
|
||||||
&numitems, &bytesleft, &chunk))
|
|
||||||
{
|
|
||||||
return False;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(chunk)
|
|
||||||
XFree(chunk);
|
|
||||||
|
|
||||||
return (seltype == atoms->incr) ? True : False;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This finds the preferred type from a TARGETS list.*/
|
|
||||||
static Atom
|
|
||||||
find_preferred (struct propdata *pdata)
|
|
||||||
{
|
|
||||||
Atom a = None;
|
|
||||||
size_t i;
|
|
||||||
Bool png = False, utf8 = False, string = False;
|
|
||||||
|
|
||||||
TRACE ();
|
|
||||||
|
|
||||||
if (pdata->length % sizeof (a))
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Atom list is not a multiple of the size of an atom!\n");
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < pdata->length; i += sizeof (a))
|
|
||||||
{
|
|
||||||
memcpy (&a, pdata->data + i, sizeof (a));
|
|
||||||
|
|
||||||
if (a == atoms->image_png)
|
|
||||||
{
|
|
||||||
png = True;
|
|
||||||
}
|
|
||||||
else if (a == atoms->utf8_string)
|
|
||||||
{
|
|
||||||
utf8 = True;
|
|
||||||
}
|
|
||||||
else if (a == atoms->string)
|
|
||||||
{
|
|
||||||
string = True;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*We prefer PNG over strings, and UTF8 over a Latin-1 string.*/
|
|
||||||
if (png)
|
|
||||||
return atoms->image_png;
|
|
||||||
|
|
||||||
if (utf8)
|
|
||||||
return atoms->utf8_string;
|
|
||||||
|
|
||||||
if (string)
|
|
||||||
return atoms->string;
|
|
||||||
|
|
||||||
/* This is evidently something we don't know how to handle.*/
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return True if an error occurs. Return False if pdata has data
|
* Return True if an error occurs. Return False if pdata has data
|
||||||
* and we finished.
|
* and we finished.
|
||||||
|
@ -268,6 +194,80 @@ read_prop_32 (Window id, Atom prop, int *nitems_ret)
|
||||||
return (unsigned long *) data;
|
return (unsigned long *) data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Implementation methods */
|
||||||
|
|
||||||
|
/* This finds the preferred type from a TARGETS list.*/
|
||||||
|
- (Atom) find_preferred:(struct propdata *)pdata
|
||||||
|
{
|
||||||
|
Atom a = None;
|
||||||
|
size_t i;
|
||||||
|
Bool png = False, utf8 = False, string = False;
|
||||||
|
|
||||||
|
TRACE ();
|
||||||
|
|
||||||
|
if (pdata->length % sizeof (a))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Atom list is not a multiple of the size of an atom!\n");
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < pdata->length; i += sizeof (a))
|
||||||
|
{
|
||||||
|
memcpy (&a, pdata->data + i, sizeof (a));
|
||||||
|
|
||||||
|
if (a == atoms->image_png)
|
||||||
|
{
|
||||||
|
png = True;
|
||||||
|
}
|
||||||
|
else if (a == atoms->utf8_string)
|
||||||
|
{
|
||||||
|
utf8 = True;
|
||||||
|
}
|
||||||
|
else if (a == atoms->string)
|
||||||
|
{
|
||||||
|
string = True;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*We prefer PNG over strings, and UTF8 over a Latin-1 string.*/
|
||||||
|
if (png)
|
||||||
|
return atoms->image_png;
|
||||||
|
|
||||||
|
if (utf8)
|
||||||
|
return atoms->utf8_string;
|
||||||
|
|
||||||
|
if (string)
|
||||||
|
return atoms->string;
|
||||||
|
|
||||||
|
/* 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
|
||||||
|
{
|
||||||
|
Atom seltype;
|
||||||
|
int format;
|
||||||
|
unsigned long numitems = 0UL, bytesleft = 0UL;
|
||||||
|
unsigned char *chunk;
|
||||||
|
|
||||||
|
TRACE ();
|
||||||
|
|
||||||
|
if (Success != XGetWindowProperty (x_dpy, e->requestor, e->property,
|
||||||
|
/*offset*/ 0L, /*length*/ 4UL,
|
||||||
|
/*Delete*/ False,
|
||||||
|
AnyPropertyType, &seltype, &format,
|
||||||
|
&numitems, &bytesleft, &chunk))
|
||||||
|
{
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(chunk)
|
||||||
|
XFree(chunk);
|
||||||
|
|
||||||
|
return (seltype == atoms->incr) ? True : False;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This should be called after a selection has been copied,
|
* This should be called after a selection has been copied,
|
||||||
* or when the selection is unfinished before a transfer completes.
|
* or when the selection is unfinished before a transfer completes.
|
||||||
|
@ -870,7 +870,7 @@ read_prop_32 (Window id, Atom prop, int *nitems_ret)
|
||||||
DB ("e->selection %s\n", XGetAtomName (x_dpy, e->selection));
|
DB ("e->selection %s\n", XGetAtomName (x_dpy, e->selection));
|
||||||
DB ("e->property %s\n", XGetAtomName (x_dpy, e->property));
|
DB ("e->property %s\n", XGetAtomName (x_dpy, e->property));
|
||||||
|
|
||||||
if (is_incr_type (e))
|
if ([self is_incr_type:e])
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* This is an INCR-style transfer, which means that we
|
* This is an INCR-style transfer, which means that we
|
||||||
|
@ -956,7 +956,7 @@ read_prop_32 (Window id, Atom prop, int *nitems_ret)
|
||||||
|
|
||||||
TRACE ();
|
TRACE ();
|
||||||
|
|
||||||
preferred = find_preferred (pdata);
|
preferred = [self find_preferred:pdata];
|
||||||
|
|
||||||
if (None == preferred)
|
if (None == preferred)
|
||||||
{
|
{
|
||||||
|
@ -1195,6 +1195,21 @@ read_prop_32 (Window id, Atom prop, int *nitems_ret)
|
||||||
if (self == nil)
|
if (self == nil)
|
||||||
return nil;
|
return nil;
|
||||||
|
|
||||||
|
atoms->primary = XInternAtom (x_dpy, "PRIMARY", False);
|
||||||
|
atoms->clipboard = XInternAtom (x_dpy, "CLIPBOARD", False);
|
||||||
|
atoms->text = XInternAtom (x_dpy, "TEXT", False);
|
||||||
|
atoms->utf8_string = XInternAtom (x_dpy, "UTF8_STRING", False);
|
||||||
|
atoms->targets = XInternAtom (x_dpy, "TARGETS", False);
|
||||||
|
atoms->multiple = XInternAtom (x_dpy, "MULTIPLE", False);
|
||||||
|
atoms->cstring = XInternAtom (x_dpy, "CSTRING", False);
|
||||||
|
atoms->image_png = XInternAtom (x_dpy, "image/png", False);
|
||||||
|
atoms->image_jpeg = XInternAtom (x_dpy, "image/jpeg", False);
|
||||||
|
atoms->incr = XInternAtom (x_dpy, "INCR", False);
|
||||||
|
atoms->atom = XInternAtom (x_dpy, "ATOM", False);
|
||||||
|
atoms->clipboard_manager = XInternAtom (x_dpy, "CLIPBOARD_MANAGER", False);
|
||||||
|
atoms->compound_text = XInternAtom (x_dpy, "COMPOUND_TEXT", False);
|
||||||
|
atoms->atom_pair = XInternAtom (x_dpy, "ATOM_PAIR", False);
|
||||||
|
|
||||||
_pasteboard = [[NSPasteboard generalPasteboard] retain];
|
_pasteboard = [[NSPasteboard generalPasteboard] retain];
|
||||||
|
|
||||||
_known_types = [[NSArray arrayWithObject:NSStringPboardType] retain];
|
_known_types = [[NSArray arrayWithObject:NSStringPboardType] retain];
|
||||||
|
|
Loading…
Reference in New Issue
Block a user