X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/blobdiff_plain/d1c57171786c3e6ef1cbed7373b6f403d61590b2..6e1063b182cb70929314875b94e3a0428a860565:/mac/macterm.c?ds=sidebyside diff --git a/mac/macterm.c b/mac/macterm.c index 8218f2b1..2cc85b95 100644 --- a/mac/macterm.c +++ b/mac/macterm.c @@ -1,4 +1,4 @@ -/* $Id: macterm.c,v 1.28 2002/12/31 20:11:38 ben Exp $ */ +/* $Id: macterm.c,v 1.32 2003/01/04 00:13:18 ben Exp $ */ /* * Copyright (c) 1999 Simon Tatham * Copyright (c) 1999, 2002 Ben Harris @@ -60,6 +60,7 @@ #include "macresid.h" #include "putty.h" +#include "charset.h" #include "mac.h" #include "storage.h" #include "terminal.h" @@ -211,6 +212,7 @@ static void mac_initfont(Session *s) { Str255 macfont; FontInfo fi; TextEncoding enc; + OptionBits fbflags; SetPort(s->window); macfont[0] = sprintf((char *)&macfont[1], "%s", s->cfg.font); @@ -231,24 +233,30 @@ 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); + fbflags = kUnicodeFallbackCustomOnly; + if (mac_gestalts.uncvattr & kTECAddFallbackInterruptMask) + fbflags |= kUnicodeFallbackInterruptSafeMask; if (SetFallbackUnicodeToText(s->uni_to_font, - uni_to_font_fallback_upp, - kUnicodeFallbackCustomOnly | kUnicodeFallbackInterruptSafeMask, - NULL) != noErr) { + uni_to_font_fallback_upp, fbflags, NULL) != noErr) { DisposeUnicodeToTextInfo(&s->uni_to_font); - s->uni_to_font = NULL; + goto no_encv; } + } else { + no_encv: + 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); @@ -328,7 +336,7 @@ static void mac_adjustwinbg(Session *s) { if (!HAVE_COLOR_QD()) return; -#if TARGET_RT_CFM /* XXX doesn't link (at least for 68k) */ +#if !TARGET_CPU_68K if (mac_gestalts.windattr & gestaltWindowMgrPresent) SetWindowContentColor(s->window, &(*s->palette)->pmInfo[DEFAULT_BG].ciRGB); @@ -951,7 +959,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); @@ -965,23 +976,28 @@ 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) + olen = 0; + } 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 + olen = 0; 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; @@ -1164,8 +1180,7 @@ void set_sbar(void *frontend, int total, int start, int page) { (*s->scrollbar)->contrlMin = 0; (*s->scrollbar)->contrlMax = total - page; SetControlValue(s->scrollbar, start); -#if TARGET_RT_CFM - /* XXX: This doesn't link for me. */ +#if !TARGET_CPU_68K if (mac_gestalts.cntlattr & gestaltControlMgrPresent) SetControlViewSize(s->scrollbar, page); #endif