-/* $Id: macterm.c,v 1.18 2002/12/08 01:17:31 ben Exp $ */
+/* $Id: macterm.c,v 1.23 2002/12/13 00:02:48 ben Exp $ */
/*
* Copyright (c) 1999 Simon Tatham
* Copyright (c) 1999, 2002 Ben Harris
#include <Scrap.h>
#include <Script.h>
#include <Sound.h>
+#include <TextCommon.h>
#include <Threads.h>
#include <ToolUtils.h>
+#include <UnicodeConverter.h>
#include <assert.h>
#include <limits.h>
(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 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 *);
term_out(s->term);
}
+static UnicodeToTextFallbackUPP uni_to_font_fallback_upp;
+
static void mac_initfont(Session *s) {
Str255 macfont;
FontInfo fi;
-
+ TextEncoding enc;
+ OSStatus err;
+
SetPort(s->window);
macfont[0] = sprintf((char *)&macfont[1], "%s", s->cfg.font);
GetFNum(macfont, &s->fontnum);
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.
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 style = 0;
struct do_text_args a;
RgnHandle textrgn;
+ char mactextbuf[1024];
+ UniChar unitextbuf[1024];
+ int i;
+
+ assert(len <= 1024);
SetPort(s->window);
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;
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);
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));
}