X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/5eec331cccfb226c1058f3c3be656a765822c922..b537dd42c1da03890c832e94a4f47369ca3d99af:/mac/macterm.c diff --git a/mac/macterm.c b/mac/macterm.c index 59bca7fe..b24e3d46 100644 --- a/mac/macterm.c +++ b/mac/macterm.c @@ -1,4 +1,4 @@ -/* $Id: macterm.c,v 1.43 2003/01/12 14:44:12 ben Exp $ */ +/* $Id: macterm.c,v 1.52 2003/01/18 20:09:21 ben Exp $ */ /* * Copyright (c) 1999 Simon Tatham * Copyright (c) 1999, 2002 Ben Harris @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -46,9 +47,7 @@ #include #include #include -#include #include -#include #include #include @@ -62,7 +61,6 @@ #include "putty.h" #include "charset.h" #include "mac.h" -#include "storage.h" #include "terminal.h" #define NCOLOURS (lenof(((Config *)0)->colours)) @@ -109,49 +107,11 @@ static RoutineDescriptor do_text_for_device_upp = #define do_text_for_device_upp do_text_for_device #endif /* not TARGET_RT_MAC_CFM */ -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)); - - 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); - - /* - * 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; - - fail: - sfree(s); - return; -} - void mac_startsession(Session *s) { char *errmsg; + init_ucs(s); /* XXX: Own storage management? */ if (HAVE_COLOR_QD()) s->window = GetNewCWindow(wTerminal, NULL, (WindowPtr)-1); @@ -159,7 +119,7 @@ void mac_startsession(Session *s) s->window = GetNewWindow(wTerminal, NULL, (WindowPtr)-1); SetWRefCon(s->window, (long)s); s->scrollbar = GetNewControl(cVScroll, s->window); - s->term = term_init(&s->cfg, s); + s->term = term_init(&s->cfg, &s->ucsdata, s); mac_initfont(s); mac_initpalette(s); @@ -169,14 +129,15 @@ void mac_startsession(Session *s) ActivatePalette(s->window); } - s->logctx = log_init(s); + s->logctx = log_init(s, &s->cfg); term_provide_logctx(s->term, s->logctx); - errmsg = s->back->init(s->term, &s->backhandle, s->cfg.host, s->cfg.port, - &s->realhost, s->cfg.tcp_nodelay); + errmsg = s->back->init(s->term, &s->backhandle, &s->cfg, 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); + set_title(s, s->realhost); term_provide_resize_fn(s->term, s->back->size, s->backhandle); @@ -188,12 +149,47 @@ void mac_startsession(Session *s) ShowWindow(s->window); s->next = sesslist; - s->prev = s->next->prev; + s->prev = &sesslist; if (s->next != NULL) s->next->prev = &s->next; sesslist = s; } +/* + * Try to work out a horizontal scaling factor for the current font + * that will give a chracter width of wantwidth. Return it in numer + * and denom (suitable for passing to StdText()). + */ +static void mac_workoutfontscale(Session *s, int wantwidth, + Point *numerp, Point *denomp) +{ + Point numer, denom, tmpnumer, tmpdenom; + int gotwidth, i; + const char text = 'W'; + FontInfo fi; + + numer.v = denom.v = 1; /* always */ + numer.h = denom.h = 1; + for (i = 0; i < 3; i++) { + tmpnumer = numer; + tmpdenom = denom; + if (s->window->grafProcs != NULL) + gotwidth = InvokeQDTxMeasUPP(1, &text, &tmpnumer, &tmpdenom, &fi, + s->window->grafProcs->txMeasProc); + else + gotwidth = StdTxMeas(1, &text, &tmpnumer, &tmpdenom, &fi); + /* The result of StdTxMeas must be scaled by the factors it returns. */ + gotwidth = FixRound(FixMul(gotwidth << 16, + FixRatio(tmpnumer.h, tmpdenom.h))); + if (gotwidth == wantwidth) + break; + numer.h *= wantwidth; + denom.h *= gotwidth; + } + *numerp = numer; + *denomp = denom; +} + static UnicodeToTextFallbackUPP uni_to_font_fallback_upp; static void mac_initfont(Session *s) { @@ -213,6 +209,14 @@ static void mac_initfont(Session *s) { s->font_ascent = fi.ascent; s->font_leading = fi.leading; s->font_height = s->font_ascent + fi.descent + s->font_leading; + mac_workoutfontscale(s, s->font_width, + &s->font_stdnumer, &s->font_stddenom); + mac_workoutfontscale(s, s->font_width * 2, + &s->font_widenumer, &s->font_widedenom); + TextSize(s->cfg.fontheight * 2); + mac_workoutfontscale(s, s->font_width * 2, + &s->font_bignumer, &s->font_bigdenom); + TextSize(s->cfg.fontheight); if (!s->cfg.bold_colour) { TextFace(bold); s->font_boldadjust = s->font_width - CharWidth('W'); @@ -396,6 +400,9 @@ void mac_adjusttermmenus(WindowPtr window) { long offset; s = (Session *)GetWRefCon(window); + menu = GetMenuHandle(mFile); + DisableItem(menu, iSave); /* XXX enable if modified */ + EnableItem(menu, iSaveAs); menu = GetMenuHandle(mEdit); EnableItem(menu, 0); DisableItem(menu, iUndo); @@ -872,6 +879,25 @@ static pascal void mac_growtermdraghook(void) SetPort(portsave); } +void mac_closeterm(WindowPtr window) +{ + Session *s = (Session *)GetWRefCon(window); + + /* XXX warn on close */ + HideWindow(s->window); + *s->prev = s->next; + s->next->prev = s->prev; + ldisc_free(s->ldisc); + s->back->free(s->backhandle); + log_free(s->logctx); + if (s->uni_to_font != NULL) + DisposeUnicodeToTextInfo(&s->uni_to_font); + term_free(s->term); + DisposeWindow(s->window); + DisposePalette(s->palette); + sfree(s); +} + void mac_activateterm(WindowPtr window, Boolean active) { Session *s; @@ -957,23 +983,29 @@ void do_text(Context ctx, int x, int y, char *text, int len, Session *s = ctx; int style = 0; struct do_text_args a; - RgnHandle textrgn; + RgnHandle textrgn, saveclip; char mactextbuf[1024]; UniChar unitextbuf[1024]; wchar_t *unitextptr; - int i; + int i, fontwidth; ByteCount iread, olen; OSStatus err; assert(len <= 1024); SetPort(s->window); - + + fontwidth = s->font_width; + if ((lattr & LATTR_MODE) != LATTR_NORM) + fontwidth *= 2; + /* First check this text is relevant */ a.textrect.top = y * s->font_height; a.textrect.bottom = (y + 1) * s->font_height; - a.textrect.left = x * s->font_width; - a.textrect.right = (x + len) * s->font_width; + a.textrect.left = x * fontwidth; + a.textrect.right = (x + len) * fontwidth; + if (a.textrect.right > s->term->cols * s->font_width) + a.textrect.right = s->term->cols * s->font_width; if (!RectInRgn(&a.textrect, s->window->visRgn)) return; @@ -1001,7 +1033,24 @@ void do_text(Context ctx, int x, int y, char *text, int len, a.len = olen; a.attr = attr; a.lattr = lattr; - a.numer.h = a.numer.v = a.denom.h = a.denom.v = 1; + switch (lattr & LATTR_MODE) { + case LATTR_NORM: + TextSize(s->cfg.fontheight); + a.numer = s->font_stdnumer; + a.denom = s->font_stddenom; + break; + case LATTR_WIDE: + TextSize(s->cfg.fontheight); + a.numer = s->font_widenumer; + a.denom = s->font_widedenom; + break; + case LATTR_TOP: + case LATTR_BOT: + TextSize(s->cfg.fontheight * 2); + a.numer = s->font_bignumer; + a.denom = s->font_bigdenom; + break; + } SetPort(s->window); TextFont(s->fontnum); if (s->cfg.fontisbold || (attr & ATTR_BOLD) && !s->cfg.bold_colour) @@ -1009,7 +1058,6 @@ void do_text(Context ctx, int x, int y, char *text, int len, if (attr & ATTR_UNDER) style |= underline; TextFace(style); - TextSize(s->cfg.fontheight); TextMode(srcOr); if (HAVE_COLOR_QD()) if (style & bold) { @@ -1019,12 +1067,17 @@ void do_text(Context ctx, int x, int y, char *text, int len, SpaceExtra(0); CharExtra(0); } + saveclip = NewRgn(); + GetClip(saveclip); + ClipRect(&a.textrect); textrgn = NewRgn(); RectRgn(textrgn, &a.textrect); if (HAVE_COLOR_QD()) DeviceLoop(textrgn, &do_text_for_device_upp, (long)&a, 0); else do_text_for_device(1, 0, NULL, (long)&a); + SetClip(saveclip); + DisposeRgn(saveclip); DisposeRgn(textrgn); /* Tell the window manager about it in case this isn't an update */ ValidRect(&a.textrect); @@ -1080,7 +1133,19 @@ static pascal void do_text_for_device(short depth, short devflags, } EraseRect(&a->textrect); - MoveTo(a->textrect.left, a->textrect.top + a->s->font_ascent); + switch (a->lattr & LATTR_MODE) { + case LATTR_NORM: + case LATTR_WIDE: + MoveTo(a->textrect.left, a->textrect.top + a->s->font_ascent); + break; + case LATTR_TOP: + MoveTo(a->textrect.left, a->textrect.top + a->s->font_ascent * 2); + break; + case LATTR_BOT: + MoveTo(a->textrect.left, + a->textrect.top - a->s->font_height + a->s->font_ascent * 2); + break; + } /* FIXME: Sort out bold width adjustments on Original QuickDraw. */ if (a->s->window->grafProcs != NULL) InvokeQDTextUPP(a->len, a->text, a->numer, a->denom, @@ -1255,8 +1320,7 @@ void set_raw_mouse_mode(void *frontend, int activate) void request_resize(void *frontend, int w, int h) { Session *s = frontend; - s->term->cols = w; - s->term->rows = h; + term_size(s->term, h, w, s->cfg.savelines); mac_initfont(s); }