mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-12 11:10:07 +00:00
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*
|
||||
getsnarf(void)
|
||||
{
|
||||
char *s;
|
||||
char *s, *t;
|
||||
CFArrayRef flavors;
|
||||
CFDataRef data;
|
||||
CFIndex nflavor, ndata, j;
|
||||
|
@ -741,9 +741,6 @@ getsnarf(void)
|
|||
PasteboardItemID id;
|
||||
PasteboardSyncFlags flags;
|
||||
UInt32 i;
|
||||
u16int *u;
|
||||
Fmt fmt;
|
||||
Rune r;
|
||||
|
||||
/* fprint(2, "applegetsnarf\n"); */
|
||||
qlock(&clip.lk);
|
||||
|
@ -778,26 +775,15 @@ getsnarf(void)
|
|||
continue;
|
||||
if(PasteboardCopyItemFlavorData(clip.apple, id, type, &data) != noErr)
|
||||
continue;
|
||||
ndata = CFDataGetLength(data);
|
||||
qunlock(&clip.lk);
|
||||
ndata = CFDataGetLength(data)/2;
|
||||
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);
|
||||
}
|
||||
s = smprint("%.*S", ndata/2, (Rune*)CFDataGetBytePtr(data));
|
||||
CFRelease(flavors);
|
||||
CFRelease(data);
|
||||
return fmtstrflush(&fmt);
|
||||
for(t=s; *t; t++)
|
||||
if(*t == '\r')
|
||||
*t = '\n';
|
||||
return s;
|
||||
}
|
||||
CFRelease(flavors);
|
||||
}
|
||||
|
@ -810,9 +796,6 @@ putsnarf(char *s)
|
|||
{
|
||||
CFDataRef cfdata;
|
||||
PasteboardSyncFlags flags;
|
||||
u16int *u, *p;
|
||||
Rune r;
|
||||
int i;
|
||||
|
||||
/* fprint(2, "appleputsnarf\n"); */
|
||||
|
||||
|
@ -833,23 +816,9 @@ putsnarf(char *s)
|
|||
qunlock(&clip.lk);
|
||||
return;
|
||||
}
|
||||
u = malloc(runestrlen(clip.rbuf)*4);
|
||||
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;
|
||||
}
|
||||
assert(sizeof(clip.rbuf[0]) == 2);
|
||||
cfdata = CFDataCreate(kCFAllocatorDefault,
|
||||
(uchar*)u, (p-u)*2);
|
||||
free(u);
|
||||
(uchar*)clip.rbuf, runestrlen(clip.rbuf)*2);
|
||||
if(cfdata == nil){
|
||||
fprint(2, "apple pasteboard cfdatacreate failed\n");
|
||||
qunlock(&clip.lk);
|
||||
|
|
Loading…
Reference in a new issue