From 8768ce315f36b41e4645dfa099bb9c5a60b0d964 Mon Sep 17 00:00:00 2001 From: ben Date: Fri, 13 Dec 2002 00:02:48 +0000 Subject: [PATCH] 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 --- mac/README.mac | 24 ++++++++++++++++---- mac/mac.c | 20 ++++++++++++++++- mac/mac.h | 3 +++ mac/macterm.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- mkfiles.pl | 3 ++- 5 files changed, 112 insertions(+), 8 deletions(-) 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 -- 2.11.0