X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/801e70ea26818b146f92f0b5af886a1c7790b86e..7770ad29ff6a03300960407f1a5bf998c2284ffe:/mac/macterm.c diff --git a/mac/macterm.c b/mac/macterm.c index 9a26abed..18cc3927 100644 --- a/mac/macterm.c +++ b/mac/macterm.c @@ -1,4 +1,4 @@ -/* $Id: macterm.c,v 1.29 2002/12/31 22:49:03 ben Exp $ */ +/* $Id: macterm.c,v 1.38 2003/01/09 22:51:41 ben Exp $ */ /* * Copyright (c) 1999 Simon Tatham * Copyright (c) 1999, 2002 Ben Harris @@ -143,6 +143,7 @@ void mac_opensession(void) { StandardFileReply sfr; static const OSType sftypes[] = { 'Sess', 0, 0, 0 }; void *sesshandle; + int i; s = smalloc(sizeof(*s)); memset(s, 0, sizeof(*s)); @@ -154,7 +155,20 @@ void mac_opensession(void) { if (sesshandle == NULL) goto fail; load_open_settings(sesshandle, TRUE, &s->cfg); close_settings_r(sesshandle); - s->back = &loop_backend; + + /* + * Select protocol. This is farmed out into a table in a + * separate file to enable an ssh-free variant. + */ + s->back = NULL; + for (i = 0; backends[i].backend != NULL; i++) + if (backends[i].protocol == s->cfg.protocol) { + s->back = backends[i].backend; + break; + } + if (s->back == NULL) { + fatalbox("Unsupported protocol number found"); + } mac_startsession(s); return; @@ -167,6 +181,7 @@ void mac_startsession(Session *s) { UInt32 starttime; char msg[128]; + char *errmsg; /* XXX: Own storage management? */ if (HAVE_COLOR_QD()) @@ -177,10 +192,21 @@ void mac_startsession(Session *s) s->scrollbar = GetNewControl(cVScroll, s->window); s->term = term_init(&s->cfg, s); + mac_initfont(s); + mac_initpalette(s); + if (HAVE_COLOR_QD()) { + /* Set to FALSE to not get palette updates in the background. */ + SetPalette(s->window, s->palette, TRUE); + ActivatePalette(s->window); + } + s->logctx = log_init(s); term_provide_logctx(s->term, s->logctx); - s->back->init(s->term, &s->backhandle, "localhost", 23, &s->realhost, 0); + errmsg = s->back->init(s->term, &s->backhandle, s->cfg.host, s->cfg.port, + &s->realhost, s->cfg.tcp_nodelay); + if (errmsg != NULL) + inbuf_putstr(s, errmsg); s->back->provide_logctx(s->backhandle, s->logctx); term_provide_resize_fn(s->term, s->back->size, s->backhandle); @@ -191,19 +217,16 @@ void mac_startsession(Session *s) s->ldisc = ldisc_create(&s->cfg, s->term, s->back, s->backhandle, s); ldisc_send(s->ldisc, NULL, 0, 0);/* cause ldisc to notice changes */ - mac_initfont(s); - mac_initpalette(s); - if (HAVE_COLOR_QD()) { - /* Set to FALSE to not get palette updates in the background. */ - SetPalette(s->window, s->palette, TRUE); - ActivatePalette(s->window); - } ShowWindow(s->window); starttime = TickCount(); display_resource(s, 'pTST', 128); sprintf(msg, "Elapsed ticks: %d\015\012", TickCount() - starttime); inbuf_putstr(s, msg); term_out(s->term); + s->next = sesslist; + s->prev = s->next->prev; + s->next->prev = &s->next; + sesslist = s; } static UnicodeToTextFallbackUPP uni_to_font_fallback_upp; @@ -212,9 +235,10 @@ 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); + c2pstrcpy(macfont, s->cfg.font); GetFNum(macfont, &s->fontnum); TextFont(s->fontnum); TextFace(s->cfg.fontisbold ? bold : 0); @@ -232,24 +256,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); @@ -274,6 +304,18 @@ static pascal OSStatus uni_to_font_fallback(UniChar *ucp, return noErr; } +/* + * Called every time round the event loop. + */ +void mac_pollterm(void) +{ + Session *s; + + for (s = sesslist; s != NULL; s = s->next) { + term_out(s->term); + term_update(s->term); + } +} /* * To be called whenever the window size changes. @@ -329,7 +371,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); @@ -785,7 +827,7 @@ void request_paste(void *frontend) static struct { Rect msgrect; Point msgorigin; - Point startmouse; + Point zeromouse; Session *s; char oldmsg[20]; } growterm_state; @@ -803,7 +845,9 @@ void mac_growterm(WindowPtr window, EventRecord *event) { draghooksave = LMGetDragHook(); growterm_state.oldmsg[0] = '\0'; - growterm_state.startmouse = event->where; + growterm_state.zeromouse = event->where; + growterm_state.zeromouse.h -= s->term->cols * s->font_width; + growterm_state.zeromouse.v -= s->term->rows * s->font_height; growterm_state.s = s; GetPort(&portsave); SetPort(s->window); @@ -841,26 +885,25 @@ static pascal void mac_growtermdraghook(void) GrafPtr portsave; Point mouse; char buf[20]; + unsigned char pbuf[20]; int newrows, newcols; GetMouse(&mouse); - newrows = (mouse.v - growterm_state.startmouse.v) / s->font_height + - s->term->rows; + newrows = (mouse.v - growterm_state.zeromouse.v) / s->font_height; if (newrows < 1) newrows = 1; - newcols = (mouse.h - growterm_state.startmouse.h) / s->font_width + - s->term->cols; + newcols = (mouse.h - growterm_state.zeromouse.h) / s->font_width; if (newcols < 1) newcols = 1; sprintf(buf, "%dx%d", newcols, newrows); if (strcmp(buf, growterm_state.oldmsg) == 0) return; strcpy(growterm_state.oldmsg, buf); - c2pstr(buf); + c2pstrcpy(pbuf, buf); GetPort(&portsave); SetPort(growterm_state.s->window); EraseRect(&growterm_state.msgrect); MoveTo(growterm_state.msgorigin.h, growterm_state.msgorigin.v); - DrawString((StringPtr)buf); + DrawString(pbuf); SetPort(portsave); } @@ -979,15 +1022,14 @@ void do_text(Context ctx, int x, int y, char *text, int len, 0, NULL, NULL, NULL, 1024, &iread, &olen, mactextbuf); if (err != noErr && err != kTECUsedFallbacksStatus) - /* XXX Should handle this more sensibly */ - return; - } else { + 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; - /* XXX Should choose charset based on script, font etc. */ olen = charset_from_unicode(&unitextptr, &len, mactextbuf, 1024, - CS_MAC_ROMAN, NULL, ".", 1); - } + s->font_charset, NULL, ".", 1); + } else + olen = 0; a.s = s; a.text = mactextbuf; @@ -1174,8 +1216,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 @@ -1228,7 +1269,7 @@ void set_title(void *frontend, char *title) { Session *s = frontend; Str255 mactitle; - mactitle[0] = sprintf((char *)&mactitle[1], "%s", title); + c2pstrcpy(mactitle, title); SetWTitle(s->window, mactitle); } @@ -1485,7 +1526,7 @@ void do_scroll(void *frontend, int topline, int botline, int lines) { void logevent(void *frontend, char *str) { - /* XXX Do something */ + fprintf(stderr, "%s\n", str); } /* Dummy routine, only required in plink. */