X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/blobdiff_plain/11ddab61475d6b28bf953f924d6545ffb6bad8ff..9547a2acebe7707dca4b4ebea17dcc8c2071359d:/mac/macterm.c diff --git a/mac/macterm.c b/mac/macterm.c index 062f8c12..19ba7fa5 100644 --- a/mac/macterm.c +++ b/mac/macterm.c @@ -1,4 +1,4 @@ -/* $Id: macterm.c,v 1.17 2002/12/07 15:21:56 ben Exp $ */ +/* $Id: macterm.c,v 1.25 2002/12/28 22:25:31 ben Exp $ */ /* * Copyright (c) 1999 Simon Tatham * Copyright (c) 1999, 2002 Ben Harris @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -45,8 +46,10 @@ #include #include #include +#include #include #include +#include #include #include @@ -74,13 +77,17 @@ (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); static void mac_drawgrowicon(Session *s); +static pascal void mac_growtermdraghook(void); static pascal void mac_scrolltracker(ControlHandle, short); static pascal void do_text_for_device(short, short, GDHandle, long); -static pascal void mac_set_attr_mask(short, short, GDHandle, long); static int mac_keytrans(Session *, EventRecord *, unsigned char *); static void text_click(Session *, EventRecord *); @@ -112,7 +119,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); @@ -133,7 +140,6 @@ void mac_newsession(void) { Session *s; UInt32 starttime; char msg[128]; - OSErr err; /* This should obviously be initialised by other means */ s = smalloc(sizeof(*s)); @@ -179,10 +185,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); @@ -199,9 +208,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. @@ -218,10 +264,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; @@ -709,15 +755,51 @@ void request_paste(void *frontend) term_do_paste(s->term); } +static struct { + Rect msgrect; + Point msgorigin; + Point startmouse; + Session *s; + char oldmsg[20]; +} growterm_state; + void mac_growterm(WindowPtr window, EventRecord *event) { Rect limits; long grow_result; int newrows, newcols; Session *s; + DragGrayRgnUPP draghooksave; + GrafPtr portsave; + FontInfo fi; s = (Session *)GetWRefCon(window); + + draghooksave = LMGetDragHook(); + growterm_state.oldmsg[0] = '\0'; + growterm_state.startmouse = event->where; + growterm_state.s = s; + GetPort(&portsave); + SetPort(s->window); + BackColor(whiteColor); + ForeColor(blackColor); + TextFont(systemFont); + TextFace(0); + TextSize(12); + GetFontInfo(&fi); + SetRect(&growterm_state.msgrect, 0, 0, + StringWidth("\p99999x99999") + 4, fi.ascent + fi.descent + 4); + SetPt(&growterm_state.msgorigin, 2, fi.ascent + 2); + LMSetDragHook(NewDragGrayRgnUPP(mac_growtermdraghook)); + SetRect(&limits, s->font_width + 15, s->font_height, SHRT_MAX, SHRT_MAX); grow_result = GrowWindow(window, event->where, &limits); + + DisposeDragGrayRgnUPP(LMGetDragHook()); + LMSetDragHook(draghooksave); + InvalRect(&growterm_state.msgrect); + + SetPort(portsave); + if (grow_result != 0) { newrows = HiWord(grow_result) / s->font_height; newcols = (LoWord(grow_result) - 15) / s->font_width; @@ -726,6 +808,35 @@ void mac_growterm(WindowPtr window, EventRecord *event) { } } +static pascal void mac_growtermdraghook(void) +{ + Session *s = growterm_state.s; + GrafPtr portsave; + Point mouse; + char buf[20]; + int newrows, newcols; + + GetMouse(&mouse); + newrows = (mouse.v - growterm_state.startmouse.v) / s->font_height + + s->term->rows; + if (newrows < 1) newrows = 1; + newcols = (mouse.h - growterm_state.startmouse.h) / s->font_width + + s->term->cols; + 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); + + GetPort(&portsave); + SetPort(growterm_state.s->window); + EraseRect(&growterm_state.msgrect); + MoveTo(growterm_state.msgorigin.h, growterm_state.msgorigin.v); + DrawString((StringPtr)buf); + SetPort(portsave); +} + void mac_activateterm(WindowPtr window, Boolean active) { Session *s; @@ -812,6 +923,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); @@ -823,6 +939,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; @@ -944,8 +1074,8 @@ void pre_paint(Session *s) { GDHandle gdh; Rect myrect, tmprect; - s->term->attr_mask = 0xffffffff; if (HAVE_COLOR_QD()) { + s->term->attr_mask = 0; SetPort(s->window); myrect = (*s->window->visRgn)->rgnBBox; LocalToGlobal((Point *)&myrect.top); @@ -959,15 +1089,20 @@ void pre_paint(Session *s) { switch ((*(*gdh)->gdPMap)->pixelSize) { case 1: if (s->cfg.bold_colour) - s->term->attr_mask &= ~ATTR_BOLD; - /* FALLTHROUGH */ + s->term->attr_mask |= ~(ATTR_COLOURS | + (s->cfg.bold_colour ? ATTR_BOLD : 0)); + break; case 2: - s->term->attr_mask &= ~ATTR_COLOURS; + s->term->attr_mask |= ~ATTR_COLOURS; + break; + default: + s->term->attr_mask = ~0; + return; /* No point checking more screens. */ } } } } else - s->term->attr_mask &= ~(ATTR_COLOURS | + s->term->attr_mask = ~(ATTR_COLOURS | (s->cfg.bold_colour ? ATTR_BOLD : 0)); }