X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/fabd1805a8f429ca83b4271aabd1206ac3537ebb..4fa38586e9af919db6853d0436ea96478bdec477:/mac/macterm.c diff --git a/mac/macterm.c b/mac/macterm.c index 02232a57..dde1530e 100644 --- a/mac/macterm.c +++ b/mac/macterm.c @@ -1,4 +1,4 @@ -/* $Id: macterm.c,v 1.50 2003/01/15 23:30:21 ben Exp $ */ +/* $Id: macterm.c,v 1.64 2003/02/04 00:01:33 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)) @@ -91,7 +89,6 @@ 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 int mac_keytrans(Session *, EventRecord *, unsigned char *); static void text_click(Session *, EventRecord *); void pre_paint(Session *s); @@ -109,23 +106,12 @@ 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; +void mac_startsession(Session *s) +{ + char *errmsg; 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); + init_ucs(s); /* * Select protocol. This is farmed out into a table in a @@ -137,22 +123,9 @@ void mac_opensession(void) { s->back = backends[i].backend; break; } - if (s->back == NULL) { + 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); @@ -234,17 +207,15 @@ static void mac_workoutfontscale(Session *s, int wantwidth, static UnicodeToTextFallbackUPP uni_to_font_fallback_upp; static void mac_initfont(Session *s) { - Str255 macfont; FontInfo fi; TextEncoding enc; OptionBits fbflags; SetPort(s->window); - c2pstrcpy(macfont, s->cfg.font); - GetFNum(macfont, &s->fontnum); + GetFNum(s->cfg.font.name, &s->fontnum); TextFont(s->fontnum); - TextFace(s->cfg.fontisbold ? bold : 0); - TextSize(s->cfg.fontheight); + TextFace(s->cfg.font.face); + TextSize(s->cfg.font.size); GetFontInfo(&fi); s->font_width = CharWidth('W'); /* Well, it's what NCSA uses. */ s->font_ascent = fi.ascent; @@ -254,10 +225,10 @@ static void mac_initfont(Session *s) { &s->font_stdnumer, &s->font_stddenom); mac_workoutfontscale(s, s->font_width * 2, &s->font_widenumer, &s->font_widedenom); - TextSize(s->cfg.fontheight * 2); + TextSize(s->cfg.font.size * 2); mac_workoutfontscale(s, s->font_width * 2, &s->font_bignumer, &s->font_bigdenom); - TextSize(s->cfg.fontheight); + TextSize(s->cfg.font.size); if (!s->cfg.bold_colour) { TextFace(bold); s->font_boldadjust = s->font_width - CharWidth('W'); @@ -269,7 +240,7 @@ static void mac_initfont(Session *s) { if (mac_gestalts.encvvers != 0 && UpgradeScriptInfoToTextEncoding(kTextScriptDontCare, kTextLanguageDontCare, - kTextRegionDontCare, macfont, + kTextRegionDontCare, s->cfg.font.name, &enc) == noErr && CreateUnicodeToTextInfoByEncoding(enc, &s->uni_to_font) == noErr) { if (uni_to_font_fallback_upp == NULL) @@ -284,12 +255,15 @@ static void mac_initfont(Session *s) { goto no_encv; } } else { + char cfontname[256]; + no_encv: s->uni_to_font = NULL; + p2cstrcpy(cfontname, s->cfg.font.name); s->font_charset = charset_from_macenc(FontToScript(s->fontnum), GetScriptManagerVariable(smRegionCode), - mac_gestalts.sysvers, s->cfg.font); + mac_gestalts.sysvers, cfontname); } mac_adjustsize(s, s->term->rows, s->term->cols); @@ -441,6 +415,10 @@ void mac_adjusttermmenus(WindowPtr window) { long offset; s = (Session *)GetWRefCon(window); + menu = GetMenuHandle(mFile); + DisableItem(menu, iSave); /* XXX enable if modified */ + EnableItem(menu, iSaveAs); + EnableItem(menu, iDuplicate); menu = GetMenuHandle(mEdit); EnableItem(menu, 0); DisableItem(menu, iUndo); @@ -524,8 +502,8 @@ static void text_click(Session *s, EventRecord *event) { lastact == MA_3CLK ? MA_CLICK : MA_NOTHING); else lastact = MA_CLICK; - /* Fake right button with shift key */ - term_mouse(s->term, event->modifiers & shiftKey ? MBT_RIGHT : MBT_LEFT, + term_mouse(s->term, MBT_LEFT, + event->modifiers & shiftKey ? MBT_EXTEND : MBT_SELECT, lastact, col, row, event->modifiers & shiftKey, event->modifiers & controlKey, event->modifiers & optionKey); lastsess = s; @@ -535,8 +513,8 @@ static void text_click(Session *s, EventRecord *event) { GetMouse(&localwhere); col = PTOCC(localwhere.h); row = PTOCR(localwhere.v); - term_mouse(s->term, - event->modifiers & shiftKey ? MBT_RIGHT : MBT_LEFT, + term_mouse(s->term, MBT_LEFT, + event->modifiers & shiftKey ? MBT_EXTEND : MBT_SELECT, MA_DRAG, col, row, event->modifiers & shiftKey, event->modifiers & controlKey, event->modifiers & optionKey); @@ -545,63 +523,146 @@ static void text_click(Session *s, EventRecord *event) { else if (row < 0) term_scroll(s->term, 0, row); } - term_mouse(s->term, event->modifiers & shiftKey ? MBT_RIGHT : MBT_LEFT, + term_mouse(s->term, MBT_LEFT, + event->modifiers & shiftKey ? MBT_EXTEND : MBT_SELECT, MA_RELEASE, col, row, event->modifiers & shiftKey, event->modifiers & controlKey, event->modifiers & optionKey); lastwhen = TickCount(); } -Mouse_Button translate_button(void *frontend, Mouse_Button button) +void write_clip(void *cookie, wchar_t *data, int len, int must_deselect) { + Session *s = cookie; + char *mactextbuf; + ByteCount iread, olen; + wchar_t *unitextptr; + StScrpRec *stsc; + size_t stsz; + OSErr err; + int i; - switch (button) { - case MBT_LEFT: - return MBT_SELECT; - case MBT_RIGHT: - return MBT_EXTEND; - default: - return 0; - } -} - -void write_clip(void *cookie, wchar_t *data, int len, int must_deselect) { - /* * See "Programming with the Text Encoding Conversion Manager" * Appendix E for Unicode scrap conventions. * - * XXX Need to support TEXT/styl scrap as well. - * See STScrpRec in TextEdit (Inside Macintosh: Text) for styl details. * XXX Maybe PICT scrap too. */ if (ZeroScrap() != noErr) return; PutScrap(len * sizeof(*data), 'utxt', data); + + /* Replace LINE SEPARATORs with CR for TEXT output. */ + for (i = 0; i < len; i++) + if (data[i] == 0x2028) + data[i] = 0x000d; + + mactextbuf = smalloc(len); /* XXX DBCS */ + if (s->uni_to_font != NULL) { + err = ConvertFromUnicodeToText(s->uni_to_font, len * sizeof(UniChar), + (UniChar *)data, + kUnicodeUseFallbacksMask, + 0, NULL, NULL, NULL, + len, &iread, &olen, mactextbuf); + if (err != noErr && err != kTECUsedFallbacksStatus) + return; + } else if (s->font_charset != CS_NONE) { + unitextptr = data; + olen = charset_from_unicode(&unitextptr, &len, mactextbuf, 1024, + s->font_charset, NULL, ".", 1); + } else + return; + PutScrap(olen, 'TEXT', mactextbuf); + sfree(mactextbuf); + + stsz = offsetof(StScrpRec, scrpStyleTab) + sizeof(ScrpSTElement); + stsc = smalloc(stsz); + stsc->scrpNStyles = 1; + stsc->scrpStyleTab[0].scrpStartChar = 0; + stsc->scrpStyleTab[0].scrpHeight = s->font_height; + stsc->scrpStyleTab[0].scrpAscent = s->font_ascent; + stsc->scrpStyleTab[0].scrpFont = s->fontnum; + stsc->scrpStyleTab[0].scrpFace = 0; + stsc->scrpStyleTab[0].scrpSize = s->cfg.font.size; + stsc->scrpStyleTab[0].scrpColor.red = 0; + stsc->scrpStyleTab[0].scrpColor.green = 0; + stsc->scrpStyleTab[0].scrpColor.blue = 0; + PutScrap(stsz, 'styl', stsc); + sfree(stsc); } void get_clip(void *frontend, wchar_t **p, int *lenp) { Session *s = frontend; static Handle h = NULL; + static wchar_t *data = NULL; + Handle texth; long offset; + int textlen; + TextEncoding enc; + TextToUnicodeInfo scrap_to_uni; + ByteCount iread, olen; + int charset; + char *tptr; + OSErr err; if (p == NULL) { /* release memory */ if (h != NULL) DisposeHandle(h); h = NULL; - } else - /* XXX Support TEXT-format scrap as well. */ + if (data != NULL) + sfree(data); + data = NULL; + } else { if (GetScrap(NULL, 'utxt', &offset) > 0) { - h = NewHandle(0); + if (h == NULL) + h = NewHandle(0); *lenp = GetScrap(h, 'utxt', &offset) / sizeof(**p); HLock(h); *p = (wchar_t *)*h; - if (*p == NULL || *lenp <= 0) - fatalbox("Empty scrap"); + } else if (GetScrap(NULL, 'TEXT', &offset) > 0) { + texth = NewHandle(0); + textlen = GetScrap(texth, 'TEXT', &offset); + HLock(texth); + data = smalloc(textlen * 2); + /* XXX should use 'styl' scrap if it's there. */ + if (mac_gestalts.encvvers != 0 && + UpgradeScriptInfoToTextEncoding(smSystemScript, + kTextLanguageDontCare, + kTextRegionDontCare, NULL, + &enc) == noErr && + CreateTextToUnicodeInfoByEncoding(enc, &scrap_to_uni) == + noErr) { + err = ConvertFromTextToUnicode(scrap_to_uni, textlen, + *texth, 0, 0, NULL, NULL, NULL, + textlen * 2, + &iread, &olen, data); + DisposeTextToUnicodeInfo(&scrap_to_uni); + if (err == noErr) { + *p = data; + *lenp = olen / sizeof(**p); + } else { + *p = NULL; + *lenp = 0; + } + } else { + charset = + charset_from_macenc(GetScriptManagerVariable(smSysScript), + GetScriptManagerVariable(smRegionCode), + mac_gestalts.sysvers, NULL); + if (charset != CS_NONE) { + tptr = *texth; + *lenp = charset_to_unicode(&tptr, &textlen, data, + textlen * 2, charset, NULL, + NULL, 0); + } + *p = data; + } + DisposeHandle(texth); } else { *p = NULL; *lenp = 0; } + } } static pascal void mac_scrolltracker(ControlHandle control, short part) { @@ -624,202 +685,144 @@ static pascal void mac_scrolltracker(ControlHandle control, short part) { } } -#define K_BS 0x3300 -#define K_F1 0x7a00 -#define K_F2 0x7800 -#define K_F3 0x6300 -#define K_F4 0x7600 -#define K_F5 0x6000 -#define K_F6 0x6100 -#define K_F7 0x6200 -#define K_F8 0x6400 -#define K_F9 0x6500 -#define K_F10 0x6d00 -#define K_F11 0x6700 -#define K_F12 0x6f00 -#define K_F13 0x6900 -#define K_F14 0x6b00 -#define K_F15 0x7100 -#define K_INSERT 0x7200 -#define K_HOME 0x7300 -#define K_PRIOR 0x7400 -#define K_DELETE 0x7500 -#define K_END 0x7700 -#define K_NEXT 0x7900 -#define K_LEFT 0x7b00 -#define K_RIGHT 0x7c00 -#define K_DOWN 0x7d00 -#define K_UP 0x7e00 -#define KP_0 0x5200 -#define KP_1 0x5300 -#define KP_2 0x5400 -#define KP_3 0x5500 -#define KP_4 0x5600 -#define KP_5 0x5700 -#define KP_6 0x5800 -#define KP_7 0x5900 -#define KP_8 0x5b00 -#define KP_9 0x5c00 -#define KP_CLEAR 0x4700 -#define KP_EQUAL 0x5100 -#define KP_SLASH 0x4b00 -#define KP_STAR 0x4300 -#define KP_PLUS 0x4500 -#define KP_MINUS 0x4e00 -#define KP_DOT 0x4100 -#define KP_ENTER 0x4c00 - void mac_keyterm(WindowPtr window, EventRecord *event) { - unsigned char buf[20]; - int len; - Session *s; + Session *s = (Session *)GetWRefCon(window); + Key_Sym keysym = PK_NULL; + unsigned int mods = 0, flags = PKF_NUMLOCK; + UniChar utxt[1]; + char txt[1]; + size_t len = 0; + ScriptCode key_script; - s = (Session *)GetWRefCon(window); - len = mac_keytrans(s, event, buf); - ldisc_send(s->ldisc, (char *)buf, len, 1); ObscureCursor(); - term_seen_key_event(s->term); - term_out(s->term); - term_update(s->term); -} -static int mac_keytrans(Session *s, EventRecord *event, - unsigned char *output) { - unsigned char *p = output; - int code; +#if 0 + fprintf(stderr, "Got key event %08x\n", event->message); +#endif /* No meta key yet -- that'll be rather fun. */ /* Keys that we handle locally */ if (event->modifiers & shiftKey) { - switch (event->message & keyCodeMask) { - case K_PRIOR: /* shift-pageup */ + switch ((event->message & keyCodeMask) >> 8) { + case 0x74: /* shift-pageup */ term_scroll(s->term, 0, -(s->term->rows - 1)); - return 0; - case K_NEXT: /* shift-pagedown */ + return; + case 0x79: /* shift-pagedown */ term_scroll(s->term, 0, +(s->term->rows - 1)); - return 0; - } - } - - /* - * Control-2 should return ^@ (0x00), Control-6 should return - * ^^ (0x1E), and Control-Minus should return ^_ (0x1F). Since - * the DOS keyboard handling did it, and we have nothing better - * to do with the key combo in question, we'll also map - * Control-Backquote to ^\ (0x1C). - */ - - if (event->modifiers & controlKey) { - switch (event->message & charCodeMask) { - case ' ': case '2': - *p++ = 0x00; - return p - output; - case '`': - *p++ = 0x1c; - return p - output; - case '6': - *p++ = 0x1e; - return p - output; - case '/': - *p++ = 0x1f; - return p - output; + return; } } - /* - * First, all the keys that do tilde codes. (ESC '[' nn '~', - * for integer decimal nn.) - * - * We also deal with the weird ones here. Linux VCs replace F1 - * to F5 by ESC [ [ A to ESC [ [ E. rxvt doesn't do _that_, but - * does replace Home and End (1~ and 4~) by ESC [ H and ESC O w - * respectively. - */ - code = 0; - switch (event->message & keyCodeMask) { - case K_F1: code = (event->modifiers & shiftKey ? 23 : 11); break; - case K_F2: code = (event->modifiers & shiftKey ? 24 : 12); break; - case K_F3: code = (event->modifiers & shiftKey ? 25 : 13); break; - case K_F4: code = (event->modifiers & shiftKey ? 26 : 14); break; - case K_F5: code = (event->modifiers & shiftKey ? 28 : 15); break; - case K_F6: code = (event->modifiers & shiftKey ? 29 : 17); break; - case K_F7: code = (event->modifiers & shiftKey ? 31 : 18); break; - case K_F8: code = (event->modifiers & shiftKey ? 32 : 19); break; - case K_F9: code = (event->modifiers & shiftKey ? 33 : 20); break; - case K_F10: code = (event->modifiers & shiftKey ? 34 : 21); break; - case K_F11: code = 23; break; - case K_F12: code = 24; break; - case K_HOME: code = 1; break; - case K_INSERT: code = 2; break; - case K_DELETE: code = 3; break; - case K_END: code = 4; break; - case K_PRIOR: code = 5; break; - case K_NEXT: code = 6; break; - } - if (s->cfg.funky_type == 1 && code >= 11 && code <= 15) { - p += sprintf((char *)p, "\x1B[[%c", code + 'A' - 11); - return p - output; - } - if (s->cfg.rxvt_homeend && (code == 1 || code == 4)) { - p += sprintf((char *)p, code == 1 ? "\x1B[H" : "\x1BOw"); - return p - output; - } - if (code) { - p += sprintf((char *)p, "\x1B[%d~", code); - return p - output; + if (event->modifiers & shiftKey) + mods |= PKM_SHIFT; + if (event->modifiers & controlKey) + mods |= PKM_CONTROL; + if (event->what == autoKey) + flags |= PKF_REPEAT; + + /* Mac key events consist of a virtual key code and a character code. */ + + switch ((event->message & keyCodeMask) >> 8) { + case 0x24: keysym = PK_RETURN; break; + case 0x30: keysym = PK_TAB; break; + case 0x33: keysym = PK_BACKSPACE; break; + case 0x35: keysym = PK_ESCAPE; break; + + case 0x7A: keysym = PK_F1; break; + case 0x78: keysym = PK_F2; break; + case 0x63: keysym = PK_F3; break; + case 0x76: keysym = PK_F4; break; + case 0x60: keysym = PK_F5; break; + case 0x61: keysym = PK_F6; break; + case 0x62: keysym = PK_F7; break; + case 0x64: keysym = PK_F8; break; + case 0x65: keysym = PK_F9; break; + case 0x6D: keysym = PK_F10; break; + case 0x67: keysym = PK_F11; break; + case 0x6F: keysym = PK_F12; break; + case 0x69: keysym = PK_F13; break; + case 0x6B: keysym = PK_F14; break; + case 0x71: keysym = PK_F15; break; + + case 0x72: keysym = PK_INSERT; break; + case 0x73: keysym = PK_HOME; break; + case 0x74: keysym = PK_PAGEUP; break; + case 0x75: keysym = PK_DELETE; break; + case 0x77: keysym = PK_END; break; + case 0x79: keysym = PK_PAGEDOWN; break; + + case 0x47: keysym = PK_PF1; break; + case 0x51: keysym = PK_PF2; break; + case 0x4B: keysym = PK_PF3; break; + case 0x43: keysym = PK_PF4; break; + case 0x4E: keysym = PK_KPMINUS; break; + case 0x45: keysym = PK_KPCOMMA; break; + case 0x41: keysym = PK_KPDECIMAL; break; + case 0x4C: keysym = PK_KPENTER; break; + case 0x52: keysym = PK_KP0; break; + case 0x53: keysym = PK_KP1; break; + case 0x54: keysym = PK_KP2; break; + case 0x55: keysym = PK_KP3; break; + case 0x56: keysym = PK_KP4; break; + case 0x57: keysym = PK_KP5; break; + case 0x58: keysym = PK_KP6; break; + case 0x59: keysym = PK_KP7; break; + case 0x5B: keysym = PK_KP8; break; + case 0x5C: keysym = PK_KP9; break; + + case 0x7B: keysym = PK_LEFT; break; + case 0x7C: keysym = PK_RIGHT; break; + case 0x7D: keysym = PK_DOWN; break; + case 0x7E: keysym = PK_UP; break; } - if (s->term->app_keypad_keys) { - switch (event->message & keyCodeMask) { - case KP_ENTER: p += sprintf((char *)p, "\x1BOM"); return p - output; - case KP_CLEAR: p += sprintf((char *)p, "\x1BOP"); return p - output; - case KP_EQUAL: p += sprintf((char *)p, "\x1BOQ"); return p - output; - case KP_SLASH: p += sprintf((char *)p, "\x1BOR"); return p - output; - case KP_STAR: p += sprintf((char *)p, "\x1BOS"); return p - output; - case KP_PLUS: p += sprintf((char *)p, "\x1BOl"); return p - output; - case KP_MINUS: p += sprintf((char *)p, "\x1BOm"); return p - output; - case KP_DOT: p += sprintf((char *)p, "\x1BOn"); return p - output; - case KP_0: p += sprintf((char *)p, "\x1BOp"); return p - output; - case KP_1: p += sprintf((char *)p, "\x1BOq"); return p - output; - case KP_2: p += sprintf((char *)p, "\x1BOr"); return p - output; - case KP_3: p += sprintf((char *)p, "\x1BOs"); return p - output; - case KP_4: p += sprintf((char *)p, "\x1BOt"); return p - output; - case KP_5: p += sprintf((char *)p, "\x1BOu"); return p - output; - case KP_6: p += sprintf((char *)p, "\x1BOv"); return p - output; - case KP_7: p += sprintf((char *)p, "\x1BOw"); return p - output; - case KP_8: p += sprintf((char *)p, "\x1BOx"); return p - output; - case KP_9: p += sprintf((char *)p, "\x1BOy"); return p - output; + /* Map from key script to Unicode. */ + txt[0] = event->message & charCodeMask; + key_script = GetScriptManagerVariable(smKeyScript); + + if (mac_gestalts.encvvers != 0) { + static TextToUnicodeInfo key_to_uni = NULL; + static ScriptCode key_to_uni_script; + TextEncoding enc; + ByteCount iread, olen; + OSErr err; + + if (key_to_uni != NULL && key_to_uni_script != key_script) + DisposeTextToUnicodeInfo(&key_to_uni); + if (key_to_uni == NULL || key_to_uni_script != key_script) { + if (UpgradeScriptInfoToTextEncoding(key_script, + kTextLanguageDontCare, + kTextRegionDontCare, NULL, + &enc) == noErr && + CreateTextToUnicodeInfoByEncoding(enc, &key_to_uni) == noErr) + key_to_uni_script = key_script; + else + key_to_uni = NULL; + } + if (key_to_uni != NULL) { + err = ConvertFromTextToUnicode(key_to_uni, 1, txt, + (kUnicodeKeepInfoMask | + kUnicodeStringUnterminatedMask), + 0, NULL, NULL, NULL, + sizeof(utxt), &iread, &olen, utxt); + if (err == noErr) + len = olen / sizeof(*utxt); + } + } else { + int charset; + char *tptr = txt; + int tlen = 1; + + charset = charset_from_macenc(key_script, + GetScriptManagerVariable(smRegionCode), + mac_gestalts.sysvers, NULL); + if (charset != CS_NONE) { + len = charset_to_unicode(&tptr, &tlen, utxt, sizeof(utxt), charset, + NULL, NULL, 0); } } - - switch (event->message & keyCodeMask) { - case K_UP: - p += sprintf((char *)p, - s->term->app_cursor_keys ? "\x1BOA" : "\x1B[A"); - return p - output; - case K_DOWN: - p += sprintf((char *)p, - s->term->app_cursor_keys ? "\x1BOB" : "\x1B[B"); - return p - output; - case K_RIGHT: - p += sprintf((char *)p, - s->term->app_cursor_keys ? "\x1BOC" : "\x1B[C"); - return p - output; - case K_LEFT: - p += sprintf((char *)p, - s->term->app_cursor_keys ? "\x1BOD" : "\x1B[D"); - return p - output; - case KP_ENTER: - *p++ = 0x0d; - return p - output; - case K_BS: - *p++ = (s->cfg.bksp_is_delete ? 0x7f : 0x08); - return p - output; - default: - *p++ = event->message & charCodeMask; - return p - output; - } + term_key(s->term, keysym, utxt, len, mods, flags); } void request_paste(void *frontend) @@ -1019,7 +1022,7 @@ struct do_text_args { void do_text(Context ctx, int x, int y, char *text, int len, unsigned long attr, int lattr) { Session *s = ctx; - int style = 0; + int style; struct do_text_args a; RgnHandle textrgn, saveclip; char mactextbuf[1024]; @@ -1073,25 +1076,26 @@ void do_text(Context ctx, int x, int y, char *text, int len, a.lattr = lattr; switch (lattr & LATTR_MODE) { case LATTR_NORM: - TextSize(s->cfg.fontheight); + TextSize(s->cfg.font.size); a.numer = s->font_stdnumer; a.denom = s->font_stddenom; break; case LATTR_WIDE: - TextSize(s->cfg.fontheight); + TextSize(s->cfg.font.size); a.numer = s->font_widenumer; a.denom = s->font_widedenom; break; case LATTR_TOP: case LATTR_BOT: - TextSize(s->cfg.fontheight * 2); + TextSize(s->cfg.font.size * 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) + style = s->cfg.font.face; + if ((attr & ATTR_BOLD) && !s->cfg.bold_colour) style |= bold; if (attr & ATTR_UNDER) style |= underline; @@ -1136,8 +1140,10 @@ static pascal void do_text_for_device(short depth, short devflags, if (HAVE_COLOR_QD()) { if (depth > 2) { - fgcolour = ((a->attr & ATTR_FGMASK) >> ATTR_FGSHIFT) * 2; - bgcolour = ((a->attr & ATTR_BGMASK) >> ATTR_BGSHIFT) * 2; + fgcolour = ((a->attr & ATTR_FGMASK) >> ATTR_FGSHIFT); + fgcolour = (fgcolour & 0xF) * 2 + (fgcolour & 0x10 ? 1 : 0); + bgcolour = ((a->attr & ATTR_BGMASK) >> ATTR_BGSHIFT); + bgcolour = (bgcolour & 0xF) * 2 + (bgcolour & 0x10 ? 1 : 0); } else { /* * NB: bold reverse in 2bpp breaks with the usual PuTTY model and @@ -1152,7 +1158,7 @@ static pascal void do_text_for_device(short depth, short devflags, bgcolour = tmp; } if (bright && depth > 2) - fgcolour++; + fgcolour |= 1; if ((a->attr & TATTR_ACTCURS) && depth > 1) { fgcolour = CURSOR_FG; bgcolour = CURSOR_BG; @@ -1548,8 +1554,8 @@ void palette_reset(void *frontend) { * Scroll the screen. (`lines' is +ve for scrolling forward, -ve * for backward.) */ -void do_scroll(void *frontend, int topline, int botline, int lines) { - Session *s = frontend; +void do_scroll(Context ctx, int topline, int botline, int lines) { + Session *s = ctx; Rect r; RgnHandle scrollrgn = NewRgn(); RgnHandle movedupdate = NewRgn(); @@ -1636,7 +1642,7 @@ void frontend_keypress(void *handle) * Ask whether to wipe a session log file before writing to it. * Returns 2 for wipe, 1 for append, 0 for cancel (don't log). */ -int askappend(void *frontend, char *filename) +int askappend(void *frontend, Filename filename) { /* FIXME: not implemented yet. */