X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/8095091bedbd70c8eadf54a0fd098fbf251fe25d..5eec331cccfb226c1058f3c3be656a765822c922:/mac/macterm.c diff --git a/mac/macterm.c b/mac/macterm.c index fe692fd5..59bca7fe 100644 --- a/mac/macterm.c +++ b/mac/macterm.c @@ -1,4 +1,4 @@ -/* $Id: macterm.c,v 1.33 2003/01/04 00:48:13 ben Exp $ */ +/* $Id: macterm.c,v 1.43 2003/01/12 14:44:12 ben Exp $ */ /* * Copyright (c) 1999 Simon Tatham * Copyright (c) 1999, 2002 Ben Harris @@ -109,40 +109,12 @@ static RoutineDescriptor do_text_for_device_upp = #define do_text_for_device_upp do_text_for_device #endif /* not TARGET_RT_MAC_CFM */ -static void inbuf_putc(Session *s, int c) { - char ch = c; - - from_backend(s->term, 0, &ch, 1); -} - -static void inbuf_putstr(Session *s, const char *c) { - - from_backend(s->term, 0, (char *)c, strlen(c)); -} - -static void display_resource(Session *s, unsigned long type, short id) { - Handle h; - int len; - char *t; - - h = GetResource(type, id); - if (h == NULL) - fatalbox("Can't get test resource"); - len = GetResourceSizeOnDisk(h); - DetachResource(h); - HNoPurge(h); - HLock(h); - t = *h; - from_backend(s->term, 0, t, len); - term_out(s->term); - DisposeHandle(h); -} - void mac_opensession(void) { Session *s; 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 +126,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; @@ -165,8 +150,7 @@ void mac_opensession(void) { void mac_startsession(Session *s) { - UInt32 starttime; - char msg[128]; + char *errmsg; /* XXX: Own storage management? */ if (HAVE_COLOR_QD()) @@ -177,10 +161,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) + fatalbox("%s", errmsg); s->back->provide_logctx(s->backhandle, s->logctx); term_provide_resize_fn(s->term, s->back->size, s->backhandle); @@ -191,19 +186,12 @@ 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; + if (s->next != NULL) + s->next->prev = &s->next; + sesslist = s; } static UnicodeToTextFallbackUPP uni_to_font_fallback_upp; @@ -215,7 +203,7 @@ static void mac_initfont(Session *s) { 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); @@ -281,6 +269,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. @@ -850,6 +850,7 @@ static pascal void mac_growtermdraghook(void) GrafPtr portsave; Point mouse; char buf[20]; + unsigned char pbuf[20]; int newrows, newcols; GetMouse(&mouse); @@ -861,13 +862,13 @@ static pascal void mac_growtermdraghook(void) 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); } @@ -1233,7 +1234,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); } @@ -1366,9 +1367,12 @@ void get_window_pixels(void *frontend, int *x, int *y) char *get_window_title(void *frontend, int icon) { Session *s = frontend; + Str255 ptitle; + static char title[256]; - /* Erm, we don't save this at the moment */ - return ""; + GetWTitle(s->window, ptitle); + p2cstrcpy(title, ptitle); + return title; } /* @@ -1490,7 +1494,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. */