Rename reclaim_clipboard to claim_clipboard.
Convert the puts usage to use DB().
Add the initial handle_image method.
Check for nil in the NSString instantiation in various places.
Add some commentary to enhance the clarity of why I did some things.
(cherry picked from commit 37361567b6
)
This commit is contained in:
parent
adbe6881c8
commit
7c21789633
|
@ -334,10 +334,8 @@ read_prop_32 (Window id, Atom prop, int *nitems_ret)
|
||||||
|
|
||||||
if (None != w)
|
if (None != w)
|
||||||
{
|
{
|
||||||
|
DB ("requesting targets\n");
|
||||||
request_atom = atoms->targets;
|
request_atom = atoms->targets;
|
||||||
|
|
||||||
puts("Asking for targets");
|
|
||||||
|
|
||||||
XConvertSelection (x_dpy, atoms->primary, atoms->targets,
|
XConvertSelection (x_dpy, atoms->primary, atoms->targets,
|
||||||
atoms->primary, _selection_window, CurrentTime);
|
atoms->primary, _selection_window, CurrentTime);
|
||||||
}
|
}
|
||||||
|
@ -376,7 +374,7 @@ read_prop_32 (Window id, Atom prop, int *nitems_ret)
|
||||||
/*
|
/*
|
||||||
* We lost ownership of the CLIPBOARD.
|
* We lost ownership of the CLIPBOARD.
|
||||||
*/
|
*/
|
||||||
[self reclaim_clipboard];
|
[self claim_clipboard];
|
||||||
}
|
}
|
||||||
else if (atoms->clipboard_manager == e->selection)
|
else if (atoms->clipboard_manager == e->selection)
|
||||||
{
|
{
|
||||||
|
@ -393,7 +391,7 @@ read_prop_32 (Window id, Atom prop, int *nitems_ret)
|
||||||
/*
|
/*
|
||||||
* We greedily acquire the clipboard after it changes, and on startup.
|
* We greedily acquire the clipboard after it changes, and on startup.
|
||||||
*/
|
*/
|
||||||
- (void) reclaim_clipboard
|
- (void) claim_clipboard
|
||||||
{
|
{
|
||||||
Window owner;
|
Window owner;
|
||||||
|
|
||||||
|
@ -404,6 +402,8 @@ read_prop_32 (Window id, Atom prop, int *nitems_ret)
|
||||||
* The owner probably died or we are just starting up pbproxy.
|
* The owner probably died or we are just starting up pbproxy.
|
||||||
* Set pbproxy's _selection_window as the owner, and continue.
|
* Set pbproxy's _selection_window as the owner, and continue.
|
||||||
*/
|
*/
|
||||||
|
DB ("No clipboard owner.\n");
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
XSetSelectionOwner (x_dpy, atoms->clipboard, _selection_window,
|
XSetSelectionOwner (x_dpy, atoms->clipboard, _selection_window,
|
||||||
|
@ -414,6 +414,8 @@ read_prop_32 (Window id, Atom prop, int *nitems_ret)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DB ("requesting targets\n");
|
||||||
|
|
||||||
request_atom = atoms->targets;
|
request_atom = atoms->targets;
|
||||||
XConvertSelection (x_dpy, atoms->clipboard, atoms->targets,
|
XConvertSelection (x_dpy, atoms->clipboard, atoms->targets,
|
||||||
atoms->clipboard, _selection_window, CurrentTime);
|
atoms->clipboard, _selection_window, CurrentTime);
|
||||||
|
@ -439,7 +441,7 @@ convert_1 (XSelectionRequestEvent *e, NSString *data, Atom target, Atom prop)
|
||||||
const char *bytes;
|
const char *bytes;
|
||||||
|
|
||||||
if (target == XA_STRING)
|
if (target == XA_STRING)
|
||||||
bytes = [data lossyCString];
|
bytes = [data cStringUsingEncoding:NSISOLatin1StringEncoding];
|
||||||
else
|
else
|
||||||
bytes = [data UTF8String];
|
bytes = [data UTF8String];
|
||||||
|
|
||||||
|
@ -452,6 +454,8 @@ convert_1 (XSelectionRequestEvent *e, NSString *data, Atom target, Atom prop)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* FIXME: handle COMPOUND_TEXT target */
|
/* FIXME: handle COMPOUND_TEXT target */
|
||||||
|
/*gstaplin: should we [data release]? */
|
||||||
|
[data release];
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -482,6 +486,8 @@ convert_1 (XSelectionRequestEvent *e, NSString *data, Atom target, Atom prop)
|
||||||
data[0] = atoms->utf8_string;
|
data[0] = atoms->utf8_string;
|
||||||
data[1] = XA_STRING;
|
data[1] = XA_STRING;
|
||||||
|
|
||||||
|
/*TODO add handling for when the data can be represented as an image. */
|
||||||
|
|
||||||
XChangeProperty (x_dpy, e->requestor, e->property, target,
|
XChangeProperty (x_dpy, e->requestor, e->property, target,
|
||||||
8, PropModeReplace, (unsigned char *) &data,
|
8, PropModeReplace, (unsigned char *) &data,
|
||||||
sizeof (data));
|
sizeof (data));
|
||||||
|
@ -532,9 +538,9 @@ convert_1 (XSelectionRequestEvent *e, NSString *data, Atom target, Atom prop)
|
||||||
|
|
||||||
[self release_pending];
|
[self release_pending];
|
||||||
|
|
||||||
puts ("NOTIFY EVENT");
|
DB ("notify_event\n");
|
||||||
if (None == e->property) {
|
if (None == e->property) {
|
||||||
puts("Nothing");
|
DB ("e->property is None.\n");
|
||||||
/* Nothing is selected. */
|
/* Nothing is selected. */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -546,7 +552,7 @@ convert_1 (XSelectionRequestEvent *e, NSString *data, Atom target, Atom prop)
|
||||||
* will get the data after a series of PropertyNotify events.
|
* will get the data after a series of PropertyNotify events.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
puts("IS INCR");
|
DB ("is INCR\n");
|
||||||
|
|
||||||
if (get_property (e->requestor, e->property, &pdata, /*Delete*/ True, &type))
|
if (get_property (e->requestor, e->property, &pdata, /*Delete*/ True, &type))
|
||||||
{
|
{
|
||||||
|
@ -565,13 +571,12 @@ convert_1 (XSelectionRequestEvent *e, NSString *data, Atom target, Atom prop)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
puts("HANDLING NOW");
|
|
||||||
|
|
||||||
/* We have the complete selection data.*/
|
/* We have the complete selection data.*/
|
||||||
[self handle_selection: e->selection type:type propdata:&pdata];
|
[self handle_selection: e->selection type:type propdata:&pdata];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This is used for INCR transfers. See the ICCCM for the details. */
|
||||||
- (void) property_event:(XPropertyEvent *)e
|
- (void) property_event:(XPropertyEvent *)e
|
||||||
{
|
{
|
||||||
struct propdata pdata;
|
struct propdata pdata;
|
||||||
|
@ -601,6 +606,7 @@ convert_1 (XSelectionRequestEvent *e, NSString *data, Atom target, Atom prop)
|
||||||
|
|
||||||
- (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 = find_preferred (pdata);
|
Atom preferred = find_preferred (pdata);
|
||||||
|
|
||||||
if (None == preferred)
|
if (None == preferred)
|
||||||
|
@ -612,30 +618,66 @@ convert_1 (XSelectionRequestEvent *e, NSString *data, Atom target, Atom prop)
|
||||||
preferred = XA_STRING;
|
preferred = XA_STRING;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DB ("requesting %s\n", XGetAtomName (x_dpy, preferred));
|
||||||
request_atom = preferred;
|
request_atom = preferred;
|
||||||
XConvertSelection (x_dpy, selection, preferred, selection,
|
XConvertSelection (x_dpy, selection, preferred, selection,
|
||||||
_selection_window, CurrentTime);
|
_selection_window, CurrentTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This handles the image/png type of selection (typically in CLIPBOARD). */
|
/* This handles the image type of selection (typically in CLIPBOARD). */
|
||||||
- (void) handle_png: (struct propdata *)pdata
|
- (void) handle_image: (struct propdata *)pdata extension:(NSString *)fileext
|
||||||
{
|
{
|
||||||
/* TODO Use the NSPasteboard code I wrote that may work... */
|
NSString *pbtype;
|
||||||
|
NSArray *pbtypes;
|
||||||
|
NSUInteger length;
|
||||||
|
NSData *data;
|
||||||
|
|
||||||
|
pbtype = NSCreateFileContentsPboardType (fileext);
|
||||||
|
if (nil == pbtype)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "unknown extension or unable to create PboardType\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DB ("%s\n", [pbtype cStringUsingEncoding:NSISOLatin1StringEncoding]);
|
||||||
|
|
||||||
|
pbtypes = [NSArray arrayWithObject: pbtype];
|
||||||
|
if (nil == pbtypes)
|
||||||
|
{
|
||||||
|
DB ("error creating NSArray\n");
|
||||||
|
[pbtype release];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
length = pdata->length;
|
||||||
|
data = [[NSData alloc] initWithBytes:pdata->data length:length];
|
||||||
|
if (nil == data)
|
||||||
|
{
|
||||||
|
[pbtype release];
|
||||||
|
[pbtypes release];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
[_pasteboard declareTypes:pbtypes owner:self];
|
||||||
|
if (YES != [_pasteboard setData:data forType:pbtype])
|
||||||
|
{
|
||||||
|
DB ("writing pasteboard data failed!\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
[pbtype release];
|
||||||
|
[pbtypes release];
|
||||||
|
[data release];
|
||||||
|
|
||||||
|
DB ("handled image\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This handles the UTF8_STRING type of selection. */
|
/* This handles the UTF8_STRING type of selection. */
|
||||||
- (void) handle_utf8_string: (struct propdata *)pdata
|
- (void) handle_utf8_string: (struct propdata *)pdata
|
||||||
{
|
{
|
||||||
size_t i;
|
|
||||||
unsigned char *p = pdata->data;
|
|
||||||
|
|
||||||
puts("HANDLE UTF8_STRING");
|
|
||||||
for (i = 0; i < pdata->length; ++i) {
|
|
||||||
printf("%c", p[i]);
|
|
||||||
}
|
|
||||||
puts("");
|
|
||||||
|
|
||||||
NSString *string = [[NSString alloc] initWithBytes:pdata->data length:pdata->length encoding:NSUTF8StringEncoding];
|
NSString *string = [[NSString alloc] initWithBytes:pdata->data length:pdata->length encoding:NSUTF8StringEncoding];
|
||||||
|
if (nil == string)
|
||||||
|
return;
|
||||||
|
|
||||||
[_pasteboard setString:string forType:NSStringPboardType];
|
[_pasteboard setString:string forType:NSStringPboardType];
|
||||||
[string release];
|
[string release];
|
||||||
}
|
}
|
||||||
|
@ -643,13 +685,15 @@ convert_1 (XSelectionRequestEvent *e, NSString *data, Atom target, Atom prop)
|
||||||
/* This handles the XA_STRING type, which should be in Latin-1. */
|
/* This handles the XA_STRING type, which should be in Latin-1. */
|
||||||
- (void) handle_string: (struct propdata *)pdata
|
- (void) handle_string: (struct propdata *)pdata
|
||||||
{
|
{
|
||||||
puts("STRING");
|
|
||||||
|
|
||||||
NSString *string = [[NSString alloc] initWithBytes:pdata->data length:pdata->length encoding:NSISOLatin1StringEncoding];
|
NSString *string = [[NSString alloc] initWithBytes:pdata->data length:pdata->length encoding:NSISOLatin1StringEncoding];
|
||||||
|
if (nil == string)
|
||||||
|
return;
|
||||||
|
|
||||||
[_pasteboard setString:string forType:NSStringPboardType];
|
[_pasteboard setString:string forType:NSStringPboardType];
|
||||||
[string release];
|
[string release];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This is called when the selection is completely retrieved from another client. */
|
||||||
/* Warning: this frees the propdata in most cases. */
|
/* Warning: this frees the propdata in most cases. */
|
||||||
- (void) handle_selection:(Atom)selection type:(Atom)type propdata:(struct propdata *)pdata
|
- (void) handle_selection:(Atom)selection type:(Atom)type propdata:(struct propdata *)pdata
|
||||||
{
|
{
|
||||||
|
@ -659,7 +703,11 @@ convert_1 (XSelectionRequestEvent *e, NSString *data, Atom target, Atom prop)
|
||||||
}
|
}
|
||||||
else if (type == atoms->image_png)
|
else if (type == atoms->image_png)
|
||||||
{
|
{
|
||||||
[self handle_png:pdata];
|
[self handle_image:pdata extension:@".png"];
|
||||||
|
}
|
||||||
|
else if (type == atoms->image_jpeg)
|
||||||
|
{
|
||||||
|
[self handle_image:pdata extension:@".jpeg"];
|
||||||
}
|
}
|
||||||
else if (type == atoms->utf8_string)
|
else if (type == atoms->utf8_string)
|
||||||
{
|
{
|
||||||
|
@ -674,7 +722,7 @@ convert_1 (XSelectionRequestEvent *e, NSString *data, Atom target, Atom prop)
|
||||||
free_propdata(pdata);
|
free_propdata(pdata);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (selection == atoms->clipboard)
|
if (selection == atoms->clipboard && pdata->data)
|
||||||
{
|
{
|
||||||
free_propdata(&request_data.propdata);
|
free_propdata(&request_data.propdata);
|
||||||
request_data.propdata = *pdata;
|
request_data.propdata = *pdata;
|
||||||
|
@ -697,7 +745,7 @@ convert_1 (XSelectionRequestEvent *e, NSString *data, Atom target, Atom prop)
|
||||||
{
|
{
|
||||||
TRACE ();
|
TRACE ();
|
||||||
|
|
||||||
puts("PB changed owner");
|
DB ("PB changed owner");
|
||||||
|
|
||||||
/* Right now we don't care with this. */
|
/* Right now we don't care with this. */
|
||||||
}
|
}
|
||||||
|
@ -721,6 +769,7 @@ convert_1 (XSelectionRequestEvent *e, NSString *data, Atom target, Atom prop)
|
||||||
_selection_window = XCreateSimpleWindow (x_dpy, DefaultRootWindow (x_dpy),
|
_selection_window = XCreateSimpleWindow (x_dpy, DefaultRootWindow (x_dpy),
|
||||||
0, 0, 1, 1, 0, pixel, pixel);
|
0, 0, 1, 1, 0, pixel, pixel);
|
||||||
|
|
||||||
|
/* This is used to get PropertyNotify events when doing INCR transfers. */
|
||||||
XSelectInput (x_dpy, _selection_window, PropertyChangeMask);
|
XSelectInput (x_dpy, _selection_window, PropertyChangeMask);
|
||||||
|
|
||||||
request_atom = None;
|
request_atom = None;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user