X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/0a0fa8cd31ffd677ff7d4d27941f927cb93c010a..6cb61a05b6157236bbea7b351cfc741eb6853605:/mac/macterm.c diff --git a/mac/macterm.c b/mac/macterm.c index 4be59596..6d0904bd 100644 --- a/mac/macterm.c +++ b/mac/macterm.c @@ -1,4 +1,4 @@ -/* $Id: macterm.c,v 1.21 2002/12/09 22:49:56 ben Exp $ */ +/* $Id: macterm.c,v 1.27 2002/12/31 01:40:14 ben Exp $ */ /* * Copyright (c) 1999 Simon Tatham * Copyright (c) 1999, 2002 Ben Harris @@ -46,8 +46,11 @@ #include #include #include +#include +#include #include #include +#include #include #include @@ -58,6 +61,7 @@ #include "macresid.h" #include "putty.h" #include "mac.h" +#include "storage.h" #include "terminal.h" #define NCOLOURS (lenof(((Config *)0)->colours)) @@ -75,6 +79,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); @@ -113,7 +121,7 @@ static void inbuf_putstr(Session *s, const char *c) { static void display_resource(Session *s, unsigned long type, short id) { Handle h; - int len, i; + int len; char *t; h = GetResource(type, id); @@ -129,19 +137,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]; - OSErr err; + 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); @@ -180,10 +205,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; + SetPort(s->window); macfont[0] = sprintf((char *)&macfont[1], "%s", s->cfg.font); GetFNum(macfont, &s->fontnum); @@ -200,9 +228,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. @@ -219,10 +284,10 @@ static void mac_adjustsize(Session *s, int newrows, int newcols) { MoveControl(s->scrollbar, winwidth - 15, -1); SizeControl(s->scrollbar, 16, winheight - 13); ShowControl(s->scrollbar); + mac_drawgrowicon(s); } static void mac_initpalette(Session *s) { - int i; if (!HAVE_COLOR_QD()) return; @@ -878,6 +943,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); @@ -889,6 +959,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;