X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/83d435491be43d9ff46608b7a79a02d1296fbd08..991039a7b3a2f1b6388841c8a0b28fba0c6610eb:/mac/macterm.c?ds=sidebyside diff --git a/mac/macterm.c b/mac/macterm.c index 19ba7fa5..2e1a406b 100644 --- a/mac/macterm.c +++ b/mac/macterm.c @@ -1,4 +1,4 @@ -/* $Id: macterm.c,v 1.25 2002/12/28 22:25:31 ben Exp $ */ +/* $Id: macterm.c,v 1.30 2003/01/01 19:51:13 ben Exp $ */ /* * Copyright (c) 1999 Simon Tatham * Copyright (c) 1999, 2002 Ben Harris @@ -46,6 +46,7 @@ #include #include #include +#include #include #include #include @@ -59,7 +60,9 @@ #include "macresid.h" #include "putty.h" +#include "charset.h" #include "mac.h" +#include "storage.h" #include "terminal.h" #define NCOLOURS (lenof(((Config *)0)->colours)) @@ -135,18 +138,36 @@ static void display_resource(Session *s, unsigned long type, short id) { DisposeHandle(h); } - -void mac_newsession(void) { +void mac_opensession(void) { Session *s; - UInt32 starttime; - char msg[128]; + StandardFileReply sfr; + static const OSType sftypes[] = { 'Sess', 0, 0, 0 }; + void *sesshandle; - /* This should obviously be initialised by other means */ s = smalloc(sizeof(*s)); memset(s, 0, sizeof(*s)); - do_defaults(NULL, &s->cfg); + + StandardGetFile(NULL, 1, sftypes, &sfr); + if (!sfr.sfGood) goto fail; + + sesshandle = open_settings_r_fsp(&sfr.sfFile); + if (sesshandle == NULL) goto fail; + load_open_settings(sesshandle, TRUE, &s->cfg); + close_settings_r(sesshandle); s->back = &loop_backend; - + mac_startsession(s); + return; + + fail: + sfree(s); + return; +} + +void mac_startsession(Session *s) +{ + UInt32 starttime; + char msg[128]; + /* XXX: Own storage management? */ if (HAVE_COLOR_QD()) s->window = GetNewCWindow(wTerminal, NULL, (WindowPtr)-1); @@ -211,14 +232,12 @@ static void mac_initfont(Session *s) { if (s->uni_to_font != NULL) DisposeUnicodeToTextInfo(&s->uni_to_font); - if (mac_gestalts.encvvers == 0 || + 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 { + &enc) == noErr && + CreateUnicodeToTextInfoByEncoding(enc, &s->uni_to_font) == noErr) { if (uni_to_font_fallback_upp == NULL) uni_to_font_fallback_upp = NewUnicodeToTextFallbackProc(&uni_to_font_fallback); @@ -229,6 +248,12 @@ static void mac_initfont(Session *s) { DisposeUnicodeToTextInfo(&s->uni_to_font); s->uni_to_font = NULL; } + } else { + s->uni_to_font = NULL; + s->font_charset = + charset_from_macenc(FontToScript(s->fontnum), + GetScriptManagerVariable(smRegionCode), + mac_gestalts.sysvers, s->cfg.font); } mac_adjustsize(s, s->term->rows, s->term->cols); @@ -241,7 +266,13 @@ static pascal OSStatus uni_to_font_fallback(UniChar *ucp, if (olen < 1) return kTECOutputBufferFullStatus; - *obuf = '?'; + /* + * What I'd _like_ to do here is to somehow generate the + * missing-character glyph that every font is required to have. + * Unfortunately (and somewhat surprisingly), I can't find any way + * to actually ask for it explicitly. Bah. + */ + *obuf = '.'; *iusedp = ilen; *ousedp = 1; return noErr; @@ -925,7 +956,10 @@ void do_text(Context ctx, int x, int y, char *text, int len, RgnHandle textrgn; char mactextbuf[1024]; UniChar unitextbuf[1024]; + wchar_t *unitextptr; int i; + ByteCount iread, olen; + OSStatus err; assert(len <= 1024); @@ -939,23 +973,29 @@ 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; + /* Unpack Unicode from the mad format we get passed */ + for (i = 0; i < len; i++) + unitextbuf[i] = (unsigned char)text[i] | (attr & CSET_MASK); - for (i = 0; i < len; i++) - unitextbuf[i] = (unsigned char)text[i] | (attr & CSET_MASK); + if (s->uni_to_font != NULL) { 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; - } + if (err != noErr && err != kTECUsedFallbacksStatus) + /* XXX Should handle this more sensibly */ + return; + } else if (s->font_charset != CS_NONE) { + /* XXX this is bogus if wchar_t and UniChar are different sizes. */ + unitextptr = (wchar_t *)unitextbuf; + olen = charset_from_unicode(&unitextptr, &len, mactextbuf, 1024, + s->font_charset, NULL, ".", 1); + } else + return; a.s = s; - a.text = text; - a.len = len; + a.text = mactextbuf; + a.len = olen; a.attr = attr; a.lattr = lattr; a.numer.h = a.numer.v = a.denom.h = a.denom.v = 1;