devdraw: update OS X snarf for 32-bit Rune
fixes #29 http://code.swtch.com/plan9port/issues/29/ http://codereview.appspot.com/117057
This commit is contained in:
parent
6ad2891094
commit
dd73705611
1 changed files with 9 additions and 40 deletions
|
|
@ -732,7 +732,7 @@ struct {
|
||||||
char*
|
char*
|
||||||
getsnarf(void)
|
getsnarf(void)
|
||||||
{
|
{
|
||||||
char *s;
|
char *s, *t;
|
||||||
CFArrayRef flavors;
|
CFArrayRef flavors;
|
||||||
CFDataRef data;
|
CFDataRef data;
|
||||||
CFIndex nflavor, ndata, j;
|
CFIndex nflavor, ndata, j;
|
||||||
|
|
@ -741,9 +741,6 @@ getsnarf(void)
|
||||||
PasteboardItemID id;
|
PasteboardItemID id;
|
||||||
PasteboardSyncFlags flags;
|
PasteboardSyncFlags flags;
|
||||||
UInt32 i;
|
UInt32 i;
|
||||||
u16int *u;
|
|
||||||
Fmt fmt;
|
|
||||||
Rune r;
|
|
||||||
|
|
||||||
/* fprint(2, "applegetsnarf\n"); */
|
/* fprint(2, "applegetsnarf\n"); */
|
||||||
qlock(&clip.lk);
|
qlock(&clip.lk);
|
||||||
|
|
@ -778,26 +775,15 @@ getsnarf(void)
|
||||||
continue;
|
continue;
|
||||||
if(PasteboardCopyItemFlavorData(clip.apple, id, type, &data) != noErr)
|
if(PasteboardCopyItemFlavorData(clip.apple, id, type, &data) != noErr)
|
||||||
continue;
|
continue;
|
||||||
|
ndata = CFDataGetLength(data);
|
||||||
qunlock(&clip.lk);
|
qunlock(&clip.lk);
|
||||||
ndata = CFDataGetLength(data)/2;
|
s = smprint("%.*S", ndata/2, (Rune*)CFDataGetBytePtr(data));
|
||||||
u = (u16int*)CFDataGetBytePtr(data);
|
|
||||||
fmtstrinit(&fmt);
|
|
||||||
// decode utf-16. what was apple thinking?
|
|
||||||
for(i=0; i<ndata; i++) {
|
|
||||||
r = u[i];
|
|
||||||
if(0xd800 <= r && r < 0xdc00 && i+1 < ndata && 0xdc00 <= u[i+1] && u[i+1] < 0xe000) {
|
|
||||||
r = (((r - 0xd800)<<10) | (u[i+1] - 0xdc00)) + 0x10000;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
else if(0xd800 <= r && r < 0xe000)
|
|
||||||
r = Runeerror;
|
|
||||||
if(r == '\r')
|
|
||||||
r = '\n';
|
|
||||||
fmtrune(&fmt, r);
|
|
||||||
}
|
|
||||||
CFRelease(flavors);
|
CFRelease(flavors);
|
||||||
CFRelease(data);
|
CFRelease(data);
|
||||||
return fmtstrflush(&fmt);
|
for(t=s; *t; t++)
|
||||||
|
if(*t == '\r')
|
||||||
|
*t = '\n';
|
||||||
|
return s;
|
||||||
}
|
}
|
||||||
CFRelease(flavors);
|
CFRelease(flavors);
|
||||||
}
|
}
|
||||||
|
|
@ -810,9 +796,6 @@ putsnarf(char *s)
|
||||||
{
|
{
|
||||||
CFDataRef cfdata;
|
CFDataRef cfdata;
|
||||||
PasteboardSyncFlags flags;
|
PasteboardSyncFlags flags;
|
||||||
u16int *u, *p;
|
|
||||||
Rune r;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* fprint(2, "appleputsnarf\n"); */
|
/* fprint(2, "appleputsnarf\n"); */
|
||||||
|
|
||||||
|
|
@ -833,23 +816,9 @@ putsnarf(char *s)
|
||||||
qunlock(&clip.lk);
|
qunlock(&clip.lk);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
u = malloc(runestrlen(clip.rbuf)*4);
|
assert(sizeof(clip.rbuf[0]) == 2);
|
||||||
p = u;
|
|
||||||
for(i=0; clip.rbuf[i]; i++) {
|
|
||||||
r = clip.rbuf[i];
|
|
||||||
// convert to utf-16
|
|
||||||
if(0xd800 <= r && r < 0xe000)
|
|
||||||
r = Runeerror;
|
|
||||||
if(r >= 0x10000) {
|
|
||||||
r -= 0x10000;
|
|
||||||
*p++ = 0xd800 + (r>>10);
|
|
||||||
*p++ = 0xdc00 + (r & ((1<<10)-1));
|
|
||||||
} else
|
|
||||||
*p++ = r;
|
|
||||||
}
|
|
||||||
cfdata = CFDataCreate(kCFAllocatorDefault,
|
cfdata = CFDataCreate(kCFAllocatorDefault,
|
||||||
(uchar*)u, (p-u)*2);
|
(uchar*)clip.rbuf, runestrlen(clip.rbuf)*2);
|
||||||
free(u);
|
|
||||||
if(cfdata == nil){
|
if(cfdata == nil){
|
||||||
fprint(2, "apple pasteboard cfdatacreate failed\n");
|
fprint(2, "apple pasteboard cfdatacreate failed\n");
|
||||||
qunlock(&clip.lk);
|
qunlock(&clip.lk);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue