diff --git a/mac/README.mac b/mac/README.mac index 657d5a33..c15882d5 100644 --- a/mac/README.mac +++ b/mac/README.mac @@ -1,4 +1,4 @@ -$Id: README.mac,v 1.20 2003/01/25 17:20:54 ben Exp $ +$Id: README.mac,v 1.21 2003/01/25 19:23:03 ben Exp $ Information about PuTTY for the Mac OS -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= @@ -60,6 +60,7 @@ Known bugs: insists on displaying the graphic version, so I think we need a font switch at this point. This can be seen as a special case of the need to switch fonts to get odd characters. + * Pasting large blocks of text doesn't work. Unimplemented features (should be done before release): * TCP urgent data. @@ -67,7 +68,6 @@ Unimplemented features (should be done before release): * Clipping host resize requests to screen size. * Changing font size in reponse to resize requests. * Full screen mode. - * TEXT paste. * Catching up with current keyboard mapping in other ports. * Session configuration. * Filename abstraction (we want to use alias records). @@ -84,7 +84,7 @@ Unimplemented features (should be done before release): Wishlist (after release): * SFTP client (GUI?) * Carbon compatibility (requires Open Transport and Navigation Services). - * 'styl' paste, for script codes? + * 'styl' paste, for script codes. * Handle 'gurl' Apple Events. Local Variables: diff --git a/mac/macterm.c b/mac/macterm.c index 7fb9fbcb..377ea010 100644 --- a/mac/macterm.c +++ b/mac/macterm.c @@ -1,4 +1,4 @@ -/* $Id: macterm.c,v 1.55 2003/01/25 17:20:54 ben Exp $ */ +/* $Id: macterm.c,v 1.56 2003/01/25 19:23:03 ben Exp $ */ /* * Copyright (c) 1999 Simon Tatham * Copyright (c) 1999, 2002 Ben Harris @@ -593,26 +593,76 @@ void write_clip(void *cookie, wchar_t *data, int len, int must_deselect) void get_clip(void *frontend, wchar_t **p, int *lenp) { Session *s = frontend; static Handle h = NULL; + static wchar_t *data = NULL; + Handle texth; long offset; + int textlen; + TextEncoding enc; + TextToUnicodeInfo scrap_to_uni; + ByteCount iread, olen; + int charset; + char *tptr; + OSErr err; if (p == NULL) { /* release memory */ if (h != NULL) DisposeHandle(h); h = NULL; - } else - /* XXX Support TEXT-format scrap as well. */ + if (data != NULL) + sfree(data); + data = NULL; + } else { if (GetScrap(NULL, 'utxt', &offset) > 0) { - h = NewHandle(0); + if (h == NULL) + h = NewHandle(0); *lenp = GetScrap(h, 'utxt', &offset) / sizeof(**p); HLock(h); *p = (wchar_t *)*h; - if (*p == NULL || *lenp <= 0) - fatalbox("Empty scrap"); + } else if (GetScrap(NULL, 'TEXT', &offset) > 0) { + texth = NewHandle(0); + textlen = GetScrap(texth, 'TEXT', &offset); + HLock(texth); + data = smalloc(textlen * 2); + /* XXX should use 'styl' scrap if it's there. */ + if (mac_gestalts.encvvers != 0 && + UpgradeScriptInfoToTextEncoding(smSystemScript, + kTextLanguageDontCare, + kTextRegionDontCare, NULL, + &enc) == noErr && + CreateTextToUnicodeInfoByEncoding(enc, &scrap_to_uni) == + noErr) { + err = ConvertFromTextToUnicode(scrap_to_uni, textlen, + *texth, 0, 0, NULL, NULL, NULL, + textlen * 2, + &iread, &olen, data); + DisposeTextToUnicodeInfo(&scrap_to_uni); + if (err == noErr) { + *p = data; + *lenp = olen / sizeof(**p); + } else { + *p = NULL; + *lenp = 0; + } + } else { + charset = + charset_from_macenc(GetScriptManagerVariable(smSysScript), + GetScriptManagerVariable(smRegionCode), + mac_gestalts.sysvers, NULL); + if (charset != CS_NONE) { + tptr = *texth; + *lenp = charset_to_unicode(&tptr, &textlen, data, + textlen * 2, charset, NULL, + NULL, 0); + } + *p = data; + } + DisposeHandle(texth); } else { *p = NULL; *lenp = 0; } + } } static pascal void mac_scrolltracker(ControlHandle control, short part) {