-$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
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
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
+ <ftp://ftp.apple.com/developer/Tool_Chest/Core_Mac_OS_Tools/MPW_etc./
+ MPW-GM_Images/MPW-GM.img.bin>
+
+ Universal Headers (optional)
+ <ftp://ftp.apple.com/developer/Development_Kits/
+ UniversalHeaders3.4.2.img.bin>
+
+ Text Encoding Converter SDK
+ <ftp://ftp.apple.com/developer/Development_Kits/TEC_1.5.sit.hqx>
+
+ 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.
-/* $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.
#include <Gestalt.h>
#include <Resources.h>
#include <Script.h>
+#include <TextCommon.h>
#include <ToolUtils.h>
+#include <UnicodeConverter.h>
#include <assert.h>
#include <limits.h>
static void mac_startup(void) {
Handle menuBar;
+ TECInfoHandle ti;
/* Init Memory Manager */
MaxApplZone();
/* 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)
static void mac_shutdown(void) {
+ if (mac_gestalts.encvvers != 0)
+ TerminateUnicodeConverter();
exit(0);
}
-/* $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
#include <Scrap.h>
#include <Script.h>
#include <Sound.h>
+#include <TextCommon.h>
#include <Threads.h>
#include <ToolUtils.h>
+#include <UnicodeConverter.h>
#include <assert.h>
#include <limits.h>
(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);
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);
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.
int style = 0;
struct do_text_args a;
RgnHandle textrgn;
+ char mactextbuf[1024];
+ UniChar unitextbuf[1024];
+ int i;
+
+ assert(len <= 1024);
SetPort(s->window);
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;