-/* $Id: macterm.c,v 1.21 2002/12/09 22:49:56 ben Exp $ */
+/* $Id: macterm.c,v 1.30 2003/01/01 19:51:13 ben Exp $ */
/*
* Copyright (c) 1999 Simon Tatham
* Copyright (c) 1999, 2002 Ben Harris
#include <Scrap.h>
#include <Script.h>
#include <Sound.h>
+#include <StandardFile.h>
+#include <TextCommon.h>
#include <Threads.h>
#include <ToolUtils.h>
+#include <UnicodeConverter.h>
#include <assert.h>
#include <limits.h>
#include "macresid.h"
#include "putty.h"
+#include "charset.h"
#include "mac.h"
+#include "storage.h"
#include "terminal.h"
#define NCOLOURS (lenof(((Config *)0)->colours))
(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 display_resource(Session *s, unsigned long type, short id) {
Handle h;
- int len, i;
+ int len;
char *t;
h = GetResource(type, id);
DisposeHandle(h);
}
-
-void mac_newsession(void) {
+void mac_opensession(void) {
Session *s;
- UInt32 starttime;
- char msg[128];
- OSErr err;
+ StandardFileReply sfr;
+ static const OSType sftypes[] = { 'Sess', 0, 0, 0 };
+ void *sesshandle;
- /* This should obviously be initialised by other means */
s = smalloc(sizeof(*s));
memset(s, 0, sizeof(*s));
- do_defaults(NULL, &s->cfg);
+
+ 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);
s->back = &loop_backend;
-
+ mac_startsession(s);
+ return;
+
+ fail:
+ sfree(s);
+ return;
+}
+
+void mac_startsession(Session *s)
+{
+ UInt32 starttime;
+ char msg[128];
+
/* XXX: Own storage management? */
if (HAVE_COLOR_QD())
s->window = GetNewCWindow(wTerminal, NULL, (WindowPtr)-1);
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);
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) {
+ 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;
+ }
+ } else {
+ 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);
}
+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;
+ /*
+ * What I'd _like_ to do here is to somehow generate the
+ * missing-character glyph that every font is required to have.
+ * Unfortunately (and somewhat surprisingly), I can't find any way
+ * to actually ask for it explicitly. Bah.
+ */
+ *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 i;
if (!HAVE_COLOR_QD())
return;
int style = 0;
struct do_text_args a;
RgnHandle textrgn;
+ char mactextbuf[1024];
+ UniChar unitextbuf[1024];
+ wchar_t *unitextptr;
+ int i;
+ ByteCount iread, olen;
+ OSStatus err;
+
+ assert(len <= 1024);
SetPort(s->window);
if (!RectInRgn(&a.textrect, s->window->visRgn))
return;
+ /* Unpack Unicode from the mad format we get passed */
+ for (i = 0; i < len; i++)
+ unitextbuf[i] = (unsigned char)text[i] | (attr & CSET_MASK);
+
+ if (s->uni_to_font != NULL) {
+ err = ConvertFromUnicodeToText(s->uni_to_font, len * sizeof(UniChar),
+ unitextbuf, kUnicodeUseFallbacksMask,
+ 0, NULL, NULL, NULL,
+ 1024, &iread, &olen, mactextbuf);
+ if (err != noErr && err != kTECUsedFallbacksStatus)
+ /* XXX Should handle this more sensibly */
+ return;
+ } else if (s->font_charset != CS_NONE) {
+ /* XXX this is bogus if wchar_t and UniChar are different sizes. */
+ unitextptr = (wchar_t *)unitextbuf;
+ olen = charset_from_unicode(&unitextptr, &len, mactextbuf, 1024,
+ s->font_charset, NULL, ".", 1);
+ } else
+ return;
+
a.s = s;
- a.text = text;
- a.len = len;
+ a.text = mactextbuf;
+ a.len = olen;
a.attr = attr;
a.lattr = lattr;
a.numer.h = a.numer.v = a.denom.h = a.denom.v = 1;