1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-10 01:48:00 +00:00

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.

[originally from svn r2315]
This commit is contained in:
Ben Harris 2002-12-13 00:02:48 +00:00
parent c6bbb682a3
commit 93f12a008d
5 changed files with 112 additions and 8 deletions

View File

@ -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
<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.

View File

@ -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 <Gestalt.h>
#include <Resources.h>
#include <Script.h>
#include <TextCommon.h>
#include <ToolUtils.h>
#include <UnicodeConverter.h>
#include <assert.h>
#include <limits.h>
@ -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);
}

View File

@ -10,6 +10,7 @@
#include <Gestalt.h>
#include <MacWindows.h>
#include <Palettes.h>
#include <UnicodeConverter.h>
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

View File

@ -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 <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>
@ -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;

View File

@ -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