From: ben Date: Fri, 13 Dec 2002 00:02:48 +0000 (+0000) Subject: Use the Unicode Converter to convert from Unicode to the display encoding X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/commitdiff_plain/8768ce315f36b41e4645dfa099bb9c5a60b0d964 Use the Unicode Converter to convert from Unicode to the display encoding if it's available. Linking against the static Unicode Converter library costs us about 30k on Classic 68K, which I can live with. Because the default fallback converter can generate multiple output characters for a single input character, we provide our own fallback that doesn't. It converts everything to '?' instead. git-svn-id: svn://svn.tartarus.org/sgt/putty@2315 cda61777-01e9-0310-a592-d414129be87e --- diff --git a/mac/README.mac b/mac/README.mac index 2cf6cf0c..f07c08fc 100644 --- a/mac/README.mac +++ b/mac/README.mac @@ -1,4 +1,4 @@ -$Id: README.mac,v 1.1 2002/12/11 18:34:49 ben Exp $ +$Id: README.mac,v 1.2 2002/12/13 00:02:48 ben Exp $ Information about PuTTY for the Mac OS -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= @@ -7,9 +7,25 @@ Compiling it: See ../README for generic information. - I compile PuTTY using MPW, with Universal Headers 3.4.2. The - "mkputty.mpw" script does most of the work, but currently needs you - to run "Rez -append -o PuTTY mac_res.r {Includes}" to get the + To compile PuTTY for Mac OS you will need: + + MPW + + + Universal Headers (optional) + + + Text Encoding Converter SDK + + + Install MPW, install the new Universal Headers (optional), then put + the contents of the "68K Static Libraries" directory of the Text + Encoding Converter SDK into "Interfaces&Libraries:Libraries:Libraries". + + The "mkputty.mpw" script does most of the work, but currently needs + you to run "Rez -append -o PuTTY mac_res.r {Includes}" to get the resources compiled in. The Makefile currently only generates a Classic 68K application. Other architectures will come later. diff --git a/mac/mac.c b/mac/mac.c index 5083cdd9..779792fb 100644 --- a/mac/mac.c +++ b/mac/mac.c @@ -1,4 +1,4 @@ -/* $Id: mac.c,v 1.6 2002/12/10 01:11:40 ben Exp $ */ +/* $Id: mac.c,v 1.7 2002/12/13 00:02:48 ben Exp $ */ /* * Copyright (c) 1999 Ben Harris * All rights reserved. @@ -42,7 +42,9 @@ #include #include #include +#include #include +#include #include #include @@ -100,6 +102,7 @@ int main (int argc, char **argv) { static void mac_startup(void) { Handle menuBar; + TECInfoHandle ti; /* Init Memory Manager */ MaxApplZone(); @@ -142,6 +145,19 @@ static void mac_startup(void) { /* Mac OS 8.5 Window Manager? */ if (Gestalt(gestaltWindowMgrAttr, &mac_gestalts.windattr) != noErr) mac_gestalts.windattr = 0; + /* Text Encoding Conversion Manager? */ + if ( +#if TARGET_RT_MAC_CFM + &TECGetInfo == kUnresolvedCFragSymbolAddress || +#else + InitializeUnicodeConverter(NULL) != noErr || +#endif + TECGetInfo(&ti) != noErr) + mac_gestalts.encvvers = 0; + else { + mac_gestalts.encvvers = (*ti)->tecVersion; + DisposeHandle((Handle)ti); + } /* We've been tested with the Appearance Manager */ if (mac_gestalts.apprvers != 0) @@ -548,6 +564,8 @@ static void mac_adjustcursor(RgnHandle cursrgn) { static void mac_shutdown(void) { + if (mac_gestalts.encvvers != 0) + TerminateUnicodeConverter(); exit(0); } diff --git a/mac/mac.h b/mac/mac.h index 2e4c267d..626ca519 100644 --- a/mac/mac.h +++ b/mac/mac.h @@ -10,6 +10,7 @@ #include #include #include +#include struct mac_gestalts { long sysvers; @@ -17,6 +18,7 @@ struct mac_gestalts { long apprvers; long cntlattr; long windattr; + long encvvers; }; extern struct mac_gestalts mac_gestalts; @@ -64,6 +66,7 @@ typedef struct { ControlHandle scrollbar; WCTabHandle wctab; int raw_mouse; + UnicodeToTextInfo uni_to_font; } Session; #endif diff --git a/mac/macterm.c b/mac/macterm.c index 23ac22a6..185c7eb8 100644 --- a/mac/macterm.c +++ b/mac/macterm.c @@ -1,4 +1,4 @@ -/* $Id: macterm.c,v 1.22 2002/12/09 23:26:52 ben Exp $ */ +/* $Id: macterm.c,v 1.23 2002/12/13 00:02:48 ben Exp $ */ /* * Copyright (c) 1999 Simon Tatham * Copyright (c) 1999, 2002 Ben Harris @@ -46,8 +46,10 @@ #include #include #include +#include #include #include +#include #include #include @@ -75,6 +77,10 @@ (y) / s->font_height) static void mac_initfont(Session *); +static pascal OSStatus uni_to_font_fallback(UniChar *, ByteCount, ByteCount *, + TextPtr, ByteCount, ByteCount *, + LogicalAddress *, + ConstUnicodeMappingPtr); static void mac_initpalette(Session *); static void mac_adjustwinbg(Session *); static void mac_adjustsize(Session *, int, int); @@ -180,10 +186,14 @@ void mac_newsession(void) { term_out(s->term); } +static UnicodeToTextFallbackUPP uni_to_font_fallback_upp; + static void mac_initfont(Session *s) { Str255 macfont; FontInfo fi; - + TextEncoding enc; + OSStatus err; + SetPort(s->window); macfont[0] = sprintf((char *)&macfont[1], "%s", s->cfg.font); GetFNum(macfont, &s->fontnum); @@ -200,9 +210,46 @@ static void mac_initfont(Session *s) { s->font_boldadjust = s->font_width - CharWidth('W'); } else s->font_boldadjust = 0; + + if (s->uni_to_font != NULL) + DisposeUnicodeToTextInfo(&s->uni_to_font); + if (mac_gestalts.encvvers == 0 || + UpgradeScriptInfoToTextEncoding(kTextScriptDontCare, + kTextLanguageDontCare, + kTextRegionDontCare, macfont, + &enc) != noErr || + CreateUnicodeToTextInfoByEncoding(enc, &s->uni_to_font) != noErr) { + s->uni_to_font = NULL; + } else { + if (uni_to_font_fallback_upp == NULL) + uni_to_font_fallback_upp = + NewUnicodeToTextFallbackProc(&uni_to_font_fallback); + if (SetFallbackUnicodeToText(s->uni_to_font, + uni_to_font_fallback_upp, + kUnicodeFallbackCustomOnly | kUnicodeFallbackInterruptSafeMask, + NULL) != noErr) { + DisposeUnicodeToTextInfo(&s->uni_to_font); + s->uni_to_font = NULL; + } + } + mac_adjustsize(s, s->term->rows, s->term->cols); } +static pascal OSStatus uni_to_font_fallback(UniChar *ucp, + ByteCount ilen, ByteCount *iusedp, TextPtr obuf, ByteCount olen, + ByteCount *ousedp, LogicalAddress *cookie, ConstUnicodeMappingPtr mapping) +{ + + if (olen < 1) + return kTECOutputBufferFullStatus; + *obuf = '?'; + *iusedp = ilen; + *ousedp = 1; + return noErr; +} + + /* * To be called whenever the window size changes. * rows and cols should be desired values. @@ -879,6 +926,11 @@ void do_text(Context ctx, int x, int y, char *text, int len, int style = 0; struct do_text_args a; RgnHandle textrgn; + char mactextbuf[1024]; + UniChar unitextbuf[1024]; + int i; + + assert(len <= 1024); SetPort(s->window); @@ -890,6 +942,20 @@ void do_text(Context ctx, int x, int y, char *text, int len, if (!RectInRgn(&a.textrect, s->window->visRgn)) return; + if (s->uni_to_font != NULL) { + ByteCount iread, olen; + OSStatus err; + + for (i = 0; i < len; i++) + unitextbuf[i] = (unsigned char)text[i] | (attr & CSET_MASK); + err = ConvertFromUnicodeToText(s->uni_to_font, len * sizeof(UniChar), + unitextbuf, kUnicodeUseFallbacksMask, + 0, NULL, NULL, NULL, + 1024, &iread, &olen, mactextbuf); + if (err == noErr || err == kTECUsedFallbacksStatus) + text = mactextbuf; len = olen; + } + a.s = s; a.text = text; a.len = len; diff --git a/mkfiles.pl b/mkfiles.pl index 842d7cb3..af99f1bf 100755 --- a/mkfiles.pl +++ b/mkfiles.pl @@ -601,7 +601,8 @@ Libs_68K = "{CLibraries}StdCLib.o" \xb6 "{Libraries}Interface.o" \xb6 "{Libraries}OpenTransport.o" \xb6 "{Libraries}OpenTransportApp.o" \xb6 - "{Libraries}OpenTptInet.o" + "{Libraries}OpenTptInet.o" \xb6 + "{Libraries}UnicodeConverterLib.far.o" Libs_PPC = "{SharedLibraries}InterfaceLib" \xb6 "{SharedLibraries}StdCLib" \xb6