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
|
||||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
||||
@ -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.
|
||||
|
||||
|
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
|
||||
* 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);
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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,9 +186,13 @@ 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);
|
||||
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user