diff options
Diffstat (limited to 'src/cmd/devdraw')
-rw-r--r-- | src/cmd/devdraw/osx-screen.c | 49 |
1 files changed, 9 insertions, 40 deletions
diff --git a/src/cmd/devdraw/osx-screen.c b/src/cmd/devdraw/osx-screen.c index 7c686ed9..abf276aa 100644 --- a/src/cmd/devdraw/osx-screen.c +++ b/src/cmd/devdraw/osx-screen.c @@ -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); |