X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=mac%2Fmacterm.c;h=a80b113a7804048ce1f2d6e3de223a892fb91b7c;hb=ea225b588968f307f333eef56463e5d1c52d6c86;hp=283cc5c126cfd149ab0e3d66571d7dbf8869928e;hpb=13feddf9ea60c998958a786f89e94b8676005af2;p=PuTTY.git diff --git a/mac/macterm.c b/mac/macterm.c index 283cc5c1..a80b113a 100644 --- a/mac/macterm.c +++ b/mac/macterm.c @@ -1,4 +1,4 @@ -/* $Id: macterm.c,v 1.65 2003/02/04 01:53:50 ben Exp $ */ +/* $Id$ */ /* * Copyright (c) 1999 Simon Tatham * Copyright (c) 1999, 2002 Ben Harris @@ -63,14 +63,12 @@ #include "mac.h" #include "terminal.h" -#define NCOLOURS (lenof(((Config *)0)->colours)) - -#define DEFAULT_FG 16 -#define DEFAULT_FG_BOLD 17 -#define DEFAULT_BG 18 -#define DEFAULT_BG_BOLD 19 -#define CURSOR_FG 20 -#define CURSOR_BG 21 +#define DEFAULT_FG 256 +#define DEFAULT_FG_BOLD 257 +#define DEFAULT_BG 258 +#define DEFAULT_BG_BOLD 259 +#define CURSOR_FG 260 +#define CURSOR_BG 261 #define PTOCC(x) ((x) < 0 ? -(-(x - s->font_width - 1) / s->font_width) : \ (x) / s->font_width) @@ -90,14 +88,24 @@ 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 void text_click(Session *, EventRecord *); +static void mac_activateterm(WindowPtr, EventRecord *); +static void mac_adjusttermcursor(WindowPtr, Point, RgnHandle); +static void mac_adjusttermmenus(WindowPtr); +static void mac_updateterm(WindowPtr); +static void mac_clickterm(WindowPtr, EventRecord *); +static void mac_growterm(WindowPtr, EventRecord *); +static void mac_keyterm(WindowPtr, EventRecord *); +static void mac_menuterm(WindowPtr, short, short); +static void mac_closeterm(WindowPtr); void pre_paint(Session *s); void post_paint(Session *s); void mac_startsession(Session *s) { - char *errmsg; + const char *errmsg; int i; + WinInfo *wi; init_ucs(s); @@ -119,7 +127,20 @@ void mac_startsession(Session *s) s->window = GetNewCWindow(wTerminal, NULL, (WindowPtr)-1); else s->window = GetNewWindow(wTerminal, NULL, (WindowPtr)-1); - SetWRefCon(s->window, (long)s); + wi = snew(WinInfo); + memset(wi, 0, sizeof(*wi)); + wi->s = s; + wi->wtype = wTerminal; + wi->activate = &mac_activateterm; + wi->adjustcursor = &mac_adjusttermcursor; + wi->adjustmenus = &mac_adjusttermmenus; + wi->update = &mac_updateterm; + wi->click = &mac_clickterm; + wi->grow = &mac_growterm; + wi->key = &mac_keyterm; + wi->menu = &mac_menuterm; + wi->close = &mac_closeterm; + SetWRefCon(s->window, (long)wi); s->scrollbar = GetNewControl(cVScroll, s->window); s->term = term_init(&s->cfg, &s->ucsdata, s); @@ -131,11 +152,12 @@ void mac_startsession(Session *s) ActivatePalette(s->window); } - s->logctx = log_init(s, &s->cfg); + s->logctx = log_init(s->term, &s->cfg); term_provide_logctx(s->term, s->logctx); - errmsg = s->back->init(s->term, &s->backhandle, &s->cfg, s->cfg.host, - s->cfg.port, &s->realhost, s->cfg.tcp_nodelay); + errmsg = s->back->init(s, &s->backhandle, &s->cfg, s->cfg.host, + s->cfg.port, &s->realhost, s->cfg.tcp_nodelay, + s->cfg.tcp_keepalives); if (errmsg != NULL) fatalbox("%s", errmsg); s->back->provide_logctx(s->backhandle, s->logctx); @@ -170,9 +192,9 @@ static void mac_workoutfontscale(Session *s, int wantwidth, const char text = 'W'; FontInfo fi; #if TARGET_API_MAC_CARBON - CQDProcsPtr gp = GetPortGrafProcs(GetWindowPort(s->window));; + CQDProcsPtr gp = GetPortGrafProcs(GetWindowPort(s->window)); #else - QDProcsPtr gp = s->window->grafProcs;; + QDProcsPtr gp = s->window->grafProcs; #endif numer.v = denom.v = 1; /* always */ @@ -199,12 +221,13 @@ static void mac_workoutfontscale(Session *s, int wantwidth, static UnicodeToTextFallbackUPP uni_to_font_fallback_upp; -static void mac_initfont(Session *s) { +static void mac_initfont(Session *s) +{ FontInfo fi; TextEncoding enc; OptionBits fbflags; - SetPort(GetWindowPort(s->window)); + SetPort((GrafPtr)GetWindowPort(s->window)); GetFNum(s->cfg.font.name, &s->fontnum); TextFont(s->fontnum); TextFace(s->cfg.font.face); @@ -289,7 +312,6 @@ void mac_pollterm(void) Session *s; for (s = sesslist; s != NULL; s = s->next) { - term_out(s->term); term_update(s->term); } } @@ -302,18 +324,23 @@ void mac_pollterm(void) */ static void mac_adjustsize(Session *s, int newrows, int newcols) { int winwidth, winheight; + int extraforscroll; - winwidth = newcols * s->font_width + 15; + extraforscroll=s->cfg.scrollbar ? 15 : 0; + winwidth = newcols * s->font_width + extraforscroll; winheight = newrows * s->font_height; SizeWindow(s->window, winwidth, winheight, true); - HideControl(s->scrollbar); - MoveControl(s->scrollbar, winwidth - 15, -1); - SizeControl(s->scrollbar, 16, winheight - 13); - ShowControl(s->scrollbar); + if (s->cfg.scrollbar) { + HideControl(s->scrollbar); + MoveControl(s->scrollbar, winwidth - extraforscroll, -1); + SizeControl(s->scrollbar, extraforscroll + 1, winheight - 13); + ShowControl(s->scrollbar); + } mac_drawgrowicon(s); } -static void mac_initpalette(Session *s) { +static void mac_initpalette(Session *s) +{ if (!HAVE_COLOR_QD()) return; @@ -325,7 +352,7 @@ static void mac_initpalette(Session *s) { #define PM_NORMAL ( pmTolerant | pmInhibitC2 | \ pmInhibitG2 | pmInhibitG4 | pmInhibitG8 ) #define PM_TOLERANCE 0x2000 - s->palette = NewPalette(22, NULL, PM_NORMAL, PM_TOLERANCE); + s->palette = NewPalette(262, NULL, PM_NORMAL, PM_TOLERANCE); if (s->palette == NULL) fatalbox("Unable to create palette"); /* In 2bpp, these are the colours we want most. */ @@ -344,7 +371,8 @@ static void mac_initpalette(Session *s) { * Set the background colour of the window correctly. Should be * called whenever the default background changes. */ -static void mac_adjustwinbg(Session *s) { +static void mac_adjustwinbg(Session *s) +{ if (!HAVE_COLOR_QD()) return; @@ -373,7 +401,9 @@ static void mac_adjustwinbg(Session *s) { /* * Set the cursor shape correctly */ -void mac_adjusttermcursor(WindowPtr window, Point mouse, RgnHandle cursrgn) { +static void mac_adjusttermcursor(WindowPtr window, Point mouse, + RgnHandle cursrgn) +{ Session *s; ControlHandle control; short part; @@ -384,8 +414,8 @@ void mac_adjusttermcursor(WindowPtr window, Point mouse, RgnHandle cursrgn) { RgnHandle visrgn; #endif - SetPort(GetWindowPort(window)); - s = (Session *)GetWRefCon(window); + SetPort((GrafPtr)GetWindowPort(window)); + s = mac_windowsession(window); GlobalToLocal(&mouse); part = FindControl(mouse, window, &control); if (control == s->scrollbar) { @@ -428,17 +458,19 @@ void mac_adjusttermcursor(WindowPtr window, Point mouse, RgnHandle cursrgn) { #define DisableItem DisableMenuItem #define EnableItem EnableMenuItem #endif -void mac_adjusttermmenus(WindowPtr window) { +static void mac_adjusttermmenus(WindowPtr window) +{ Session *s; MenuHandle menu; #if !TARGET_API_MAC_CARBON long offset; #endif - s = (Session *)GetWRefCon(window); + s = mac_windowsession(window); menu = GetMenuHandle(mFile); DisableItem(menu, iSave); /* XXX enable if modified */ EnableItem(menu, iSaveAs); + EnableItem(menu, iChange); EnableItem(menu, iDuplicate); menu = GetMenuHandle(mEdit); EnableItem(menu, 0); @@ -451,19 +483,23 @@ void mac_adjusttermmenus(WindowPtr window) { #if TARGET_API_MAC_CARBON if (1) #else - if (GetScrap(NULL, 'TEXT', &offset) == noTypeErr) + if (GetScrap(NULL, kScrapFlavorTypeText, &offset) == noTypeErr) #endif DisableItem(menu, iPaste); else EnableItem(menu, iPaste); DisableItem(menu, iClear); EnableItem(menu, iSelectAll); + menu = GetMenuHandle(mWindow); + EnableItem(menu, 0); + EnableItem(menu, iShowEventLog); } -void mac_menuterm(WindowPtr window, short menu, short item) { +static void mac_menuterm(WindowPtr window, short menu, short item) +{ Session *s; - s = (Session *)GetWRefCon(window); + s = mac_windowsession(window); switch (menu) { case mEdit: switch (item) { @@ -474,18 +510,27 @@ void mac_menuterm(WindowPtr window, short menu, short item) { term_do_paste(s->term); break; } + break; + case mWindow: + switch(item) { + case iShowEventLog: + mac_showeventlog(s); + break; + } + break; } } -void mac_clickterm(WindowPtr window, EventRecord *event) { +static void mac_clickterm(WindowPtr window, EventRecord *event) +{ Session *s; Point mouse; ControlHandle control; int part; static ControlActionUPP mac_scrolltracker_upp = NULL; - s = (Session *)GetWRefCon(window); - SetPort(GetWindowPort(window)); + s = mac_windowsession(window); + SetPort((GrafPtr)GetWindowPort(window)); mouse = event->where; GlobalToLocal(&mouse); part = FindControl(mouse, window, &control); @@ -510,7 +555,8 @@ void mac_clickterm(WindowPtr window, EventRecord *event) { } } -static void text_click(Session *s, EventRecord *event) { +static void text_click(Session *s, EventRecord *event) +{ Point localwhere; int row, col; static UInt32 lastwhen = 0; @@ -518,7 +564,7 @@ static void text_click(Session *s, EventRecord *event) { static int lastrow = -1, lastcol = -1; static Mouse_Action lastact = MA_NOTHING; - SetPort(GetWindowPort(s->window)); + SetPort((GrafPtr)GetWindowPort(s->window)); localwhere = event->where; GlobalToLocal(&localwhere); @@ -579,14 +625,14 @@ void write_clip(void *cookie, wchar_t *data, int len, int must_deselect) */ if (ZeroScrap() != noErr) return; - PutScrap(len * sizeof(*data), 'utxt', data); + PutScrap(len * sizeof(*data), kScrapFlavorTypeUnicode, 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 */ + mactextbuf = snewn(len, char); /* XXX DBCS */ if (s->uni_to_font != NULL) { err = ConvertFromUnicodeToText(s->uni_to_font, len * sizeof(UniChar), (UniChar *)data, @@ -601,7 +647,7 @@ void write_clip(void *cookie, wchar_t *data, int len, int must_deselect) s->font_charset, NULL, ".", 1); } else return; - PutScrap(olen, 'TEXT', mactextbuf); + PutScrap(olen, kScrapFlavorTypeText, mactextbuf); sfree(mactextbuf); stsz = offsetof(StScrpRec, scrpStyleTab) + sizeof(ScrpSTElement); @@ -616,12 +662,13 @@ void write_clip(void *cookie, wchar_t *data, int len, int must_deselect) stsc->scrpStyleTab[0].scrpColor.red = 0; stsc->scrpStyleTab[0].scrpColor.green = 0; stsc->scrpStyleTab[0].scrpColor.blue = 0; - PutScrap(stsz, 'styl', stsc); + PutScrap(stsz, kScrapFlavorTypeTextStyle, stsc); sfree(stsc); #endif } -void get_clip(void *frontend, wchar_t **p, int *lenp) { +void get_clip(void *frontend, wchar_t **p, int *lenp) +{ #if TARGET_API_MAC_CARBON *lenp = 0; #else @@ -647,17 +694,18 @@ void get_clip(void *frontend, wchar_t **p, int *lenp) { sfree(data); data = NULL; } else { - if (GetScrap(NULL, 'utxt', &offset) > 0) { + if (GetScrap(NULL, kScrapFlavorTypeUnicode, &offset) > 0) { if (h == NULL) h = NewHandle(0); - *lenp = GetScrap(h, 'utxt', &offset) / sizeof(**p); + *lenp = + GetScrap(h, kScrapFlavorTypeUnicode, &offset) / sizeof(**p); HLock(h); *p = (wchar_t *)*h; - } else if (GetScrap(NULL, 'TEXT', &offset) > 0) { + } else if (GetScrap(NULL, kScrapFlavorTypeText, &offset) > 0) { texth = NewHandle(0); - textlen = GetScrap(texth, 'TEXT', &offset); + textlen = GetScrap(texth, kScrapFlavorTypeText, &offset); HLock(texth); - data = smalloc(textlen * 2); + data = snewn(textlen, wchar_t); /* XXX should use 'styl' scrap if it's there. */ if (mac_gestalts.encvvers != 0 && UpgradeScriptInfoToTextEncoding(smSystemScript, @@ -700,13 +748,14 @@ void get_clip(void *frontend, wchar_t **p, int *lenp) { #endif } -static pascal void mac_scrolltracker(ControlHandle control, short part) { +static pascal void mac_scrolltracker(ControlHandle control, short part) +{ Session *s; #if TARGET_API_MAC_CARBON - s = (Session *)GetWRefCon(GetControlOwner(control)); + s = mac_windowsession(GetControlOwner(control)); #else - s = (Session *)GetWRefCon((*control)->contrlOwner); + s = mac_windowsession((*control)->contrlOwner); #endif switch (part) { case kControlUpButtonPart: @@ -724,8 +773,9 @@ static pascal void mac_scrolltracker(ControlHandle control, short part) { } } -void mac_keyterm(WindowPtr window, EventRecord *event) { - Session *s = (Session *)GetWRefCon(window); +static void mac_keyterm(WindowPtr window, EventRecord *event) +{ + Session *s = mac_windowsession(window); Key_Sym keysym = PK_NULL; unsigned int mods = 0, flags = PKF_NUMLOCK; UniChar utxt[1]; @@ -884,7 +934,8 @@ static struct { char oldmsg[20]; } growterm_state; -void mac_growterm(WindowPtr window, EventRecord *event) { +static void mac_growterm(WindowPtr window, EventRecord *event) +{ Rect limits; long grow_result; int newrows, newcols; @@ -895,7 +946,7 @@ void mac_growterm(WindowPtr window, EventRecord *event) { FontInfo fi; #endif - s = (Session *)GetWRefCon(window); + s = mac_windowsession(window); #if !TARGET_API_MAC_CARBON draghooksave = LMGetDragHook(); @@ -969,7 +1020,7 @@ static pascal void mac_growtermdraghook(void) void mac_closeterm(WindowPtr window) { - Session *s = (Session *)GetWRefCon(window); + Session *s = mac_windowsession(window); /* XXX warn on close */ HideWindow(s->window); @@ -981,18 +1032,22 @@ void mac_closeterm(WindowPtr window) if (s->uni_to_font != NULL) DisposeUnicodeToTextInfo(&s->uni_to_font); term_free(s->term); + mac_freeeventlog(s); + sfree((WinInfo *)GetWRefCon(s->window)); DisposeWindow(s->window); DisposePalette(s->palette); sfree(s); } -void mac_activateterm(WindowPtr window, Boolean active) { +static void mac_activateterm(WindowPtr window, EventRecord *event) +{ Session *s; + Boolean active = (event->modifiers & activeFlag) != 0; - s = (Session *)GetWRefCon(window); - s->term->has_focus = active; + s = mac_windowsession(window); + term_set_focus(s->term, active); term_update(s->term); - if (active) + if (active && s->cfg.scrollbar) ShowControl(s->scrollbar); else { if (HAVE_COLOR_QD()) @@ -1004,15 +1059,16 @@ void mac_activateterm(WindowPtr window, Boolean active) { mac_drawgrowicon(s); } -void mac_updateterm(WindowPtr window) { +static void mac_updateterm(WindowPtr window) +{ Session *s; Rect bbox; #if TARGET_API_MAC_CARBON RgnHandle visrgn; #endif - s = (Session *)GetWRefCon(window); - SetPort(GetWindowPort(window)); + s = mac_windowsession(window); + SetPort((GrafPtr)GetWindowPort(window)); BeginUpdate(window); pre_paint(s); #if TARGET_API_MAC_CARBON @@ -1046,11 +1102,12 @@ void mac_updateterm(WindowPtr window) { EndUpdate(window); } -static void mac_drawgrowicon(Session *s) { +static void mac_drawgrowicon(Session *s) +{ Rect clip; RgnHandle savergn; - SetPort(GetWindowPort(s->window)); + SetPort((GrafPtr)GetWindowPort(s->window)); /* * Stop DrawGrowIcon giving us space for a horizontal scrollbar * See Tech Note TB575 for details. @@ -1084,8 +1141,9 @@ struct do_text_args { * * x and y are text row and column (zero-based) */ -void do_text(Context ctx, int x, int y, char *text, int len, - unsigned long attr, int lattr) { +void do_text(Context ctx, int x, int y, wchar_t *text, int len, + unsigned long attr, int lattr) +{ Session *s = ctx; int style; struct do_text_args a; @@ -1094,16 +1152,20 @@ void do_text(Context ctx, int x, int y, char *text, int len, RgnHandle visrgn; #endif char mactextbuf[1024]; - UniChar unitextbuf[1024]; wchar_t *unitextptr; - int i, fontwidth; + int fontwidth; ByteCount iread, olen; OSStatus err; static DeviceLoopDrawingUPP do_text_for_device_upp = NULL; assert(len <= 1024); - SetPort(GetWindowPort(s->window)); + /* SGT, 2004-10-14: I don't know how to support combining characters + * on the Mac. Hopefully the first person to fail this assertion will + * know how to do it better than me... */ + assert(!(attr & TATTR_COMBINING)); + + SetPort((GrafPtr)GetWindowPort(s->window)); fontwidth = s->font_width; if ((lattr & LATTR_MODE) != LATTR_NORM) @@ -1129,20 +1191,16 @@ void do_text(Context ctx, int x, int y, char *text, int len, return; #endif - /* 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, + text, kUnicodeUseFallbacksMask, 0, NULL, NULL, NULL, 1024, &iread, &olen, mactextbuf); if (err != noErr && err != kTECUsedFallbacksStatus) olen = 0; } else if (s->font_charset != CS_NONE) { /* XXX this is bogus if wchar_t and UniChar are different sizes. */ - unitextptr = (wchar_t *)unitextbuf; + unitextptr = (wchar_t *)text; olen = charset_from_unicode(&unitextptr, &len, mactextbuf, 1024, s->font_charset, NULL, ".", 1); } else @@ -1171,7 +1229,7 @@ void do_text(Context ctx, int x, int y, char *text, int len, a.denom = s->font_bigdenom; break; } - SetPort(GetWindowPort(s->window)); + SetPort((GrafPtr)GetWindowPort(s->window)); TextFont(s->fontnum); style = s->cfg.font.face; if ((attr & ATTR_BOLD) && !s->cfg.bold_colour) @@ -1212,8 +1270,9 @@ void do_text(Context ctx, int x, int y, char *text, int len, } static pascal void do_text_for_device(short depth, short devflags, - GDHandle device, long cookie) { - struct do_text_args *a; + GDHandle device, long cookie) +{ + struct do_text_args *a = (struct do_text_args *)cookie; int bgcolour, fgcolour, bright, reverse, tmp; #if TARGET_API_MAC_CARBON CQDProcsPtr gp = GetPortGrafProcs(GetWindowPort(a->s->window)); @@ -1221,8 +1280,6 @@ static pascal void do_text_for_device(short depth, short devflags, QDProcsPtr gp = a->s->window->grafProcs; #endif - a = (struct do_text_args *)cookie; - bright = (a->attr & ATTR_BOLD) && a->s->cfg.bold_colour; reverse = a->attr & ATTR_REVERSE; @@ -1232,9 +1289,7 @@ 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); - 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 @@ -1249,7 +1304,8 @@ static pascal void do_text_for_device(short depth, short devflags, bgcolour = tmp; } if (bright && depth > 2) - fgcolour |= 1; + if (fgcolour < 16) fgcolour |=8; + else if (fgcolour >= 256) fgcolour |=1; if ((a->attr & TATTR_ACTCURS) && depth > 1) { fgcolour = CURSOR_FG; bgcolour = CURSOR_BG; @@ -1301,7 +1357,7 @@ static pascal void do_text_for_device(short depth, short devflags, } } -void do_cursor(Context ctx, int x, int y, char *text, int len, +void do_cursor(Context ctx, int x, int y, wchar_t *text, int len, unsigned long attr, int lattr) { @@ -1312,7 +1368,8 @@ void do_cursor(Context ctx, int x, int y, char *text, int len, * Call from the terminal emulator to get its graphics context. * Should probably be called start_redraw or something. */ -void pre_paint(Session *s) { +void pre_paint(Session *s) +{ GDHandle gdh; Rect myrect, tmprect; #if TARGET_API_MAC_CARBON @@ -1321,7 +1378,7 @@ void pre_paint(Session *s) { if (HAVE_COLOR_QD()) { s->term->attr_mask = 0; - SetPort(GetWindowPort(s->window)); + SetPort((GrafPtr)GetWindowPort(s->window)); #if TARGET_API_MAC_CARBON visrgn = NewRgn(); GetPortVisibleRegion(GetWindowPort(s->window), visrgn); @@ -1358,21 +1415,24 @@ void pre_paint(Session *s) { (s->cfg.bold_colour ? ATTR_BOLD : 0)); } -Context get_ctx(void *frontend) { +Context get_ctx(void *frontend) +{ Session *s = frontend; pre_paint(s); return s; } -void free_ctx(Context ctx) { +void free_ctx(Context ctx) +{ } /* * Presumably this does something in Windows */ -void post_paint(Session *s) { +void post_paint(Session *s) +{ } @@ -1383,7 +1443,8 @@ void post_paint(Session *s) { * start is the line number of the top of the display * page is the length of the displayed page */ -void set_sbar(void *frontend, int total, int start, int page) { +void set_sbar(void *frontend, int total, int start, int page) +{ Session *s = frontend; /* We don't redraw until we've set everything up, to avoid glitches */ @@ -1439,7 +1500,8 @@ void set_icon(void *frontend, char *icon) { /* * Set the window title */ -void set_title(void *frontend, char *title) { +void set_title(void *frontend, char *title) +{ Session *s = frontend; Str255 mactitle; @@ -1461,9 +1523,24 @@ void set_raw_mouse_mode(void *frontend, int activate) /* * Resize the window at the emulator's request */ -void request_resize(void *frontend, int w, int h) { +void request_resize(void *frontend, int w, int h) +{ Session *s = frontend; + RgnHandle grayrgn; + Rect graybox; + int wlim, hlim; + /* Arbitrarily clip to the size of the desktop. */ + grayrgn = GetGrayRgn(); +#if TARGET_API_MAC_CARBON + GetRegionBounds(grayrgn, &graybox); +#else + graybox = (*grayrgn)->rgnBBox; +#endif + wlim = (graybox.right - graybox.left) / s->font_width; + hlim = (graybox.bottom - graybox.top) / s->font_height; + if (w > wlim) w = wlim; + if (h > hlim) h = hlim; term_size(s->term, h, w, s->cfg.savelines); mac_initfont(s); } @@ -1615,48 +1692,59 @@ static void real_palette_set(Session *s, int n, int r, int g, int b) /* * Set the logical palette. Called by the terminal emulator. */ -void palette_set(void *frontend, int n, int r, int g, int b) { +void palette_set(void *frontend, int n, int r, int g, int b) +{ Session *s = frontend; - static const int first[21] = { - 0, 2, 4, 6, 8, 10, 12, 14, - 1, 3, 5, 7, 9, 11, 13, 15, - 16, 17, 18, 20, 21 - }; if (!HAVE_COLOR_QD()) return; - real_palette_set(s, first[n], r, g, b); - if (first[n] == 18) - real_palette_set(s, first[n]+1, r, g, b); - if (first[n] == DEFAULT_BG) - mac_adjustwinbg(s); + real_palette_set(s, n, r, g, b); + if (n == DEFAULT_BG) + mac_adjustwinbg(s); + ActivatePalette(s->window); } /* * Reset to the default palette */ -void palette_reset(void *frontend) { +void palette_reset(void *frontend) +{ Session *s = frontend; /* This maps colour indices in cfg to those used in our palette. */ static const int ww[] = { - 6, 7, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, - 0, 1, 2, 3, 4, 5 + 256, 257, 258, 259, 260, 261, + 0, 8, 1, 9, 2, 10, 3, 11, + 4, 12, 5, 13, 6, 14, 7, 15 }; + int i; if (!HAVE_COLOR_QD()) return; - assert(lenof(ww) == NCOLOURS); - - for (i = 0; i < NCOLOURS; i++) { - real_palette_set(s, i, - s->cfg.colours[ww[i]][0], - s->cfg.colours[ww[i]][1], - s->cfg.colours[ww[i]][2]); + for (i = 0; i < 22; i++) { + int w = ww[i]; + real_palette_set(s,w, + s->cfg.colours[i][0], + s->cfg.colours[i][1], + s->cfg.colours[i][2]); } + for (i = 0; i < 240; i++) { + if (i < 216) { + int r = i / 36, g = (i / 6) % 6, b = i % 6; + real_palette_set(s,i+16, + r * 0x33, + g * 0x33, + b * 0x33); + } else { + int shade = i - 216; + shade = (shade + 1) * 0xFF / (240 - 216 + 1); + real_palette_set(s,i+16,shade,shade,shade); + } + } + + mac_adjustwinbg(s); ActivatePalette(s->window); /* Palette Manager will generate update events as required. */ @@ -1666,7 +1754,8 @@ void palette_reset(void *frontend) { * Scroll the screen. (`lines' is +ve for scrolling forward, -ve * for backward.) */ -void do_scroll(Context ctx, int topline, int botline, int lines) { +void do_scroll(Context ctx, int topline, int botline, int lines) +{ Session *s = ctx; Rect r; RgnHandle scrollrgn = NewRgn(); @@ -1674,7 +1763,7 @@ void do_scroll(Context ctx, int topline, int botline, int lines) { RgnHandle update = NewRgn(); Point g2l = { 0, 0 }; - SetPort(GetWindowPort(s->window)); + SetPort((GrafPtr)GetWindowPort(s->window)); /* * Work out the part of the update region that will scrolled by @@ -1725,11 +1814,6 @@ void do_scroll(Context ctx, int topline, int botline, int lines) { DisposeRgn(update); } -void logevent(void *frontend, char *str) { - - fprintf(stderr, "%s\n", str); -} - /* Dummy routine, only required in plink. */ void ldisc_update(void *frontend, int echo, int edit) { @@ -1774,6 +1858,13 @@ int askappend(void *frontend, Filename filename) return 2; } +int from_backend(void *frontend, int is_stderr, const char *data, int len) +{ + Session *s = frontend; + + return term_data(s->term, is_stderr, data, len); +} + /* * Emacs magic: * Local Variables: