mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-10 09:58:01 +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:
parent
c6bbb682a3
commit
93f12a008d
@ -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
|
Information about PuTTY for the Mac OS
|
||||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||||
@ -7,9 +7,25 @@ Compiling it:
|
|||||||
|
|
||||||
See ../README for generic information.
|
See ../README for generic information.
|
||||||
|
|
||||||
I compile PuTTY using MPW, with Universal Headers 3.4.2. The
|
To compile PuTTY for Mac OS you will need:
|
||||||
"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
|
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
|
resources compiled in. The Makefile currently only generates a
|
||||||
Classic 68K application. Other architectures will come later.
|
Classic 68K application. Other architectures will come later.
|
||||||
|
|
||||||
|
20
mac/mac.c
20
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
|
* Copyright (c) 1999 Ben Harris
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
@ -42,7 +42,9 @@
|
|||||||
#include <Gestalt.h>
|
#include <Gestalt.h>
|
||||||
#include <Resources.h>
|
#include <Resources.h>
|
||||||
#include <Script.h>
|
#include <Script.h>
|
||||||
|
#include <TextCommon.h>
|
||||||
#include <ToolUtils.h>
|
#include <ToolUtils.h>
|
||||||
|
#include <UnicodeConverter.h>
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
@ -100,6 +102,7 @@ int main (int argc, char **argv) {
|
|||||||
|
|
||||||
static void mac_startup(void) {
|
static void mac_startup(void) {
|
||||||
Handle menuBar;
|
Handle menuBar;
|
||||||
|
TECInfoHandle ti;
|
||||||
|
|
||||||
/* Init Memory Manager */
|
/* Init Memory Manager */
|
||||||
MaxApplZone();
|
MaxApplZone();
|
||||||
@ -142,6 +145,19 @@ static void mac_startup(void) {
|
|||||||
/* Mac OS 8.5 Window Manager? */
|
/* Mac OS 8.5 Window Manager? */
|
||||||
if (Gestalt(gestaltWindowMgrAttr, &mac_gestalts.windattr) != noErr)
|
if (Gestalt(gestaltWindowMgrAttr, &mac_gestalts.windattr) != noErr)
|
||||||
mac_gestalts.windattr = 0;
|
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 */
|
/* We've been tested with the Appearance Manager */
|
||||||
if (mac_gestalts.apprvers != 0)
|
if (mac_gestalts.apprvers != 0)
|
||||||
@ -548,6 +564,8 @@ static void mac_adjustcursor(RgnHandle cursrgn) {
|
|||||||
|
|
||||||
static void mac_shutdown(void) {
|
static void mac_shutdown(void) {
|
||||||
|
|
||||||
|
if (mac_gestalts.encvvers != 0)
|
||||||
|
TerminateUnicodeConverter();
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include <Gestalt.h>
|
#include <Gestalt.h>
|
||||||
#include <MacWindows.h>
|
#include <MacWindows.h>
|
||||||
#include <Palettes.h>
|
#include <Palettes.h>
|
||||||
|
#include <UnicodeConverter.h>
|
||||||
|
|
||||||
struct mac_gestalts {
|
struct mac_gestalts {
|
||||||
long sysvers;
|
long sysvers;
|
||||||
@ -17,6 +18,7 @@ struct mac_gestalts {
|
|||||||
long apprvers;
|
long apprvers;
|
||||||
long cntlattr;
|
long cntlattr;
|
||||||
long windattr;
|
long windattr;
|
||||||
|
long encvvers;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct mac_gestalts mac_gestalts;
|
extern struct mac_gestalts mac_gestalts;
|
||||||
@ -64,6 +66,7 @@ typedef struct {
|
|||||||
ControlHandle scrollbar;
|
ControlHandle scrollbar;
|
||||||
WCTabHandle wctab;
|
WCTabHandle wctab;
|
||||||
int raw_mouse;
|
int raw_mouse;
|
||||||
|
UnicodeToTextInfo uni_to_font;
|
||||||
} Session;
|
} Session;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -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 Simon Tatham
|
||||||
* Copyright (c) 1999, 2002 Ben Harris
|
* Copyright (c) 1999, 2002 Ben Harris
|
||||||
@ -46,8 +46,10 @@
|
|||||||
#include <Scrap.h>
|
#include <Scrap.h>
|
||||||
#include <Script.h>
|
#include <Script.h>
|
||||||
#include <Sound.h>
|
#include <Sound.h>
|
||||||
|
#include <TextCommon.h>
|
||||||
#include <Threads.h>
|
#include <Threads.h>
|
||||||
#include <ToolUtils.h>
|
#include <ToolUtils.h>
|
||||||
|
#include <UnicodeConverter.h>
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
@ -75,6 +77,10 @@
|
|||||||
(y) / s->font_height)
|
(y) / s->font_height)
|
||||||
|
|
||||||
static void mac_initfont(Session *);
|
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_initpalette(Session *);
|
||||||
static void mac_adjustwinbg(Session *);
|
static void mac_adjustwinbg(Session *);
|
||||||
static void mac_adjustsize(Session *, int, int);
|
static void mac_adjustsize(Session *, int, int);
|
||||||
@ -180,10 +186,14 @@ void mac_newsession(void) {
|
|||||||
term_out(s->term);
|
term_out(s->term);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static UnicodeToTextFallbackUPP uni_to_font_fallback_upp;
|
||||||
|
|
||||||
static void mac_initfont(Session *s) {
|
static void mac_initfont(Session *s) {
|
||||||
Str255 macfont;
|
Str255 macfont;
|
||||||
FontInfo fi;
|
FontInfo fi;
|
||||||
|
TextEncoding enc;
|
||||||
|
OSStatus err;
|
||||||
|
|
||||||
SetPort(s->window);
|
SetPort(s->window);
|
||||||
macfont[0] = sprintf((char *)&macfont[1], "%s", s->cfg.font);
|
macfont[0] = sprintf((char *)&macfont[1], "%s", s->cfg.font);
|
||||||
GetFNum(macfont, &s->fontnum);
|
GetFNum(macfont, &s->fontnum);
|
||||||
@ -200,9 +210,46 @@ static void mac_initfont(Session *s) {
|
|||||||
s->font_boldadjust = s->font_width - CharWidth('W');
|
s->font_boldadjust = s->font_width - CharWidth('W');
|
||||||
} else
|
} else
|
||||||
s->font_boldadjust = 0;
|
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);
|
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.
|
* To be called whenever the window size changes.
|
||||||
* rows and cols should be desired values.
|
* 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;
|
int style = 0;
|
||||||
struct do_text_args a;
|
struct do_text_args a;
|
||||||
RgnHandle textrgn;
|
RgnHandle textrgn;
|
||||||
|
char mactextbuf[1024];
|
||||||
|
UniChar unitextbuf[1024];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
assert(len <= 1024);
|
||||||
|
|
||||||
SetPort(s->window);
|
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))
|
if (!RectInRgn(&a.textrect, s->window->visRgn))
|
||||||
return;
|
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.s = s;
|
||||||
a.text = text;
|
a.text = text;
|
||||||
a.len = len;
|
a.len = len;
|
||||||
|
@ -601,7 +601,8 @@ Libs_68K = "{CLibraries}StdCLib.o" \xb6
|
|||||||
"{Libraries}Interface.o" \xb6
|
"{Libraries}Interface.o" \xb6
|
||||||
"{Libraries}OpenTransport.o" \xb6
|
"{Libraries}OpenTransport.o" \xb6
|
||||||
"{Libraries}OpenTransportApp.o" \xb6
|
"{Libraries}OpenTransportApp.o" \xb6
|
||||||
"{Libraries}OpenTptInet.o"
|
"{Libraries}OpenTptInet.o" \xb6
|
||||||
|
"{Libraries}UnicodeConverterLib.far.o"
|
||||||
|
|
||||||
Libs_PPC = "{SharedLibraries}InterfaceLib" \xb6
|
Libs_PPC = "{SharedLibraries}InterfaceLib" \xb6
|
||||||
"{SharedLibraries}StdCLib" \xb6
|
"{SharedLibraries}StdCLib" \xb6
|
||||||
|
Loading…
Reference in New Issue
Block a user