[comp.sources.games] v09i005: NetHack3 - display oriented dungeons & dragons

billr@saab.CNA.TEK.COM (Bill Randle) (02/24/90)

Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu>
Posting-number: Volume 9, Issue 5
Archive-name: NetHack3/Patch7e
Patch-To: NetHack3: Volume 7, Issue 56-93



#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 5 (of 30)."
# Contents:  patch7.15
# Wrapped by billr@saab on Wed Feb 21 10:04:26 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'patch7.15' -a "${1}" != "-c" ; then 
  echo shar: Renaming existing file \"'patch7.15'\" to \"'patch7.15.orig'\"
  mv -f 'patch7.15' 'patch7.15.orig'
fi
echo shar: Extracting \"'patch7.15'\" \(56738 characters\)
sed "s/^X//" >'patch7.15' <<'END_OF_FILE'
X*** /dev/null	Mon Feb 19 21:20:23 1990
X--- mac/MD.rsrc.hqx	Thu Feb  8 17:43:51 1990
X***************
X*** 0 ****
X--- 1,39 ----
X+ (This file must be converted with BinHex 4.0)
X+ 
X+ :"de%,R*cFQ-!!!!!!!!!!!!"!!!!!!!!!!0JYHX!!!!!!3!!!!,d!!!"p!!!!'a
X+ 
X+ c1J!!!"3!%5T51NPZBfaeC'9c1L!!!!!!%J!4+P-k53G04#jbFh*M!J!!!!!!!!!
X+ 
X+ !!!!!!3!!M!"J!!!!!!Zc!!!!!!!!!!!!!!%!!)`!B!!!!)3!!!!!!!!!!!!!!!!
X+ 
X+ !!+(b#bi!!!!!!!!$B-`N!GJ!!!!F!f)!$%024%8!!J"U8%eMG!!'!)j%594-!!m
X+ 
X+ !iN&-8P3!$`'L58026J!!!Q*048j9!!)#EP088L!!"J+53dj86!!!!ZC*3diM!!%
X+ 
X+ #mP*05e)!!!-+4P*&4J!"!aC#6N4-!!!$,P""9%J!!!-k!!$rrb!!!!!!!-YF!!%
X+ 
X+ !!!!9!#J!+!$)!8!!!Irr!!!!!!!!!-J!!!!!cJ!)!!!!!!"d!$-!L!"["!*25`!
X+ 
X+ !!!!!G!#H!)J!fJ3'3f&ZBf9X!!!!!!!2!!m!(`"("J4NBA4K!!!!!!!3!%J!)!"
X+ 
X+ i"J4NBA4P!!!!!!!S!%J!1!#J"JK`CA*YEfjcG!!!!!!!%!#J!#!!k!B'FR9YEh*
X+ 
X+ c!!!!!!!S!!m!1!"("J9dFQ&`Fd%!!!!!!#J!S3!i!4%'$'pLDQ9MG#"ZB@ePF`!
X+ 
X+ !!!!!3!!3!&!!m!BGE@pZFh3JFQ9cEh9bBf8JB@jN)'CTE'8JD@0[ER02!!!!&3!
X+ 
X+ !!!!""!&h!!%!!!!!!!!!!2"J!!!!!1`!#J!!!!!![`%H!0%"EJ3%6h"PEJ!!!!!
X+ 
X+ !!!)l!&!#633'5'PNC'9Z!!!!!!$D!4m!l!&["!C$B@jMC@`!!!!!!#F"'J!k!A1
X+ 
X+ !!!!!!!!!4!%J!&B"F!3&4@TPBh4I!!!!!!"G!5!!E`&`"!9%FQPfCH!!!!!!!%-
X+ 
X+ !$!$e!4F!!!!!!!!!!`"Y!"8!R3!!!!!!!!#@!4X!P`&cJ!!!!!!!!!!#&!"P!R5
X+ 
X+ )!!!!!!!!!J!`!#B"4JJc8'aPBA0P)'a[Bf&dC9i`)'CTE'9H-5"H-Je[FL"`FQ9
X+ 
X+ cFb"$B@jMC@`JG'mJB@*[FR3Ze`!!!3!!!!,d!!!"p!!!!'`!35pd"B3!!!!F!&i
X+ 
X+ !!84-6dF!!3!54%P86!!"!#S!b!!!!!!!!!""e+6`B2rr!!!!k`""e03!b2rr!!!
X+ 
X+ !'3!!!!$`B2rr!!!""!""e,J09fKTBfJJEh"dD@pZ2d2M:
X*** /dev/null	Mon Feb 19 21:20:32 1990
X--- mac/MacAlert.c	Mon Feb 19 12:46:17 1990
X***************
X*** 0 ****
X--- 1,762 ----
X+ /*	SCCS Id: @(#)MacAlert.c		3.0	90/01/06
X+ /*      Copyright (c) Jon Watte  1989		*/ 
X+ /* NetHack may be freely redistributed.  See license for details. */
X+ 
X+ #include "hack.h"	/* */
X+ 
X+ /* UseMacAlert is like UseMacAlertText, but without the text parameter.
X+    This is so you can simply say "UseMacAlert(CAUTION)" or similar, if
X+    you use predefined alert numbers.
X+ */
X+ 
X+ 
X+ extern WindowPtr HackWindow;
X+ 
X+ 
X+ int
X+ UseMacAlert(MAno)
X+ int MAno;
X+ {
X+ 	return UseMacAlertText(MAno, 0L);
X+ }
X+ 
X+ 
X+ /* UseMacAlertText fetches a record in a resource of type MAlt, and uses
X+    this as a template calling MacAlert. This is so you can have ready-
X+    made resources, like ALRT templates, for your MacAlerts, which makes
X+    it easier to customize the program, and to translate it. It also
X+    makes for clearer code...
X+    
X+    If the txt argument is NULL, the text from the template is used,
X+    otherwise the sypplied text is used.
X+ */
X+ int
X+ UseMacAlertText(MAno, txt)
X+ int MAno;
X+ char * txt;
X+ {
X+ 	MAlrtHandle foo;
X+ 	MAlrtPtr bar;
X+ 	int item;
X+ 
X+ 	SetResLoad(1);
X+ 	foo = (MAlrtHandle) GetResource(MAtype, MAno);
X+ 	if(foo) {
X+ 		MoveHHi(foo);
X+ 		HLock(foo);
X+ 		bar = *foo;
X+ 		item = MacAlert(bar->width, bar->height, bar->PICTno,
X+ 			txt != 0L ? txt : bar->text, bar->but1, bar->but2, bar->but3,
X+ 			bar->but4, bar->def, bar->esc);
X+ 	} else {
X+ 		if(!flags.silent) SysBeep(20);
X+ 		item = -1;
X+ 	}
X+ 
X+ 	ReleaseResource(foo);
X+ 	DisposHandle(foo);
X+ 	return item;
X+ }
X+ 
X+ 
X+ /* This is the MacAlert function. It creates a new window, frames it
X+    (like a modal dialog) and tries to position the various buttons,
X+    text and picture in a reasonable way. The arguments are:
X+    
X+    width : width of the window. If less than a constant, it defaults
X+            to that constant.
X+    height: see width.
X+    PICTno: Resource ID of a PICT to display. If 0, no PICT is displayed.
X+    text  : the C string containing the relevant text to be displayed.
X+    but1 -: These are the button texts. Empty strings (they point at 0)
X+    - but4: makes that button go away. If all are empty, the default OK
X+            button text is used.
X+    def   : This is which button is default, starting button # 1.
X+    esc   : This is the button that corresponds to the ESC key.
X+ 
X+    The function returns the button hit, or maybe -1 on error.
X+ */
X+ int
X+ MacAlert(width, height, PICTno, text, but1, but2, but3, but4, def, esc)
X+ int width, height, PICTno;
X+ char * text,* but1, * but2, * but3, * but4;
X+ int def, esc;
X+ {
X+ 	PicHandle thePICT;
X+ 	char border[8];
X+ 	EventRecord theEvent;
X+ 	GrafPtr savedPort;
X+ 	WindowPtr theWindow, tmpWind;
X+ 	Rect bounds, textBox, brect[4];
X+ 	char hilite[4], * but[4], s1[2], s2[2];
X+ 	int nobutts, x, pool, spacing, heig, bwid[4],
X+ 		item, c, ret;
X+ 	long finalTicks;
X+ 
X+ 	memset(hilite, sizeof(hilite), 0);
X+ 	memset(bwid, sizeof(bwid), 0);
X+ 	SetCursor(&arrow);
X+ 	def--;
X+ 	esc--;
X+ 	GetPort(&savedPort);
X+ 
X+ 	if(PICTno)
X+ 		thePICT = (PicHandle) GetResource('PICT', PICTno);
X+ 	else
X+ 		thePICT = 0;
X+ 	if(thePICT) DetachResource(thePICT);
X+ 	bounds = (MAINGRAFPORT)->portRect;
X+ 
X+ 	but[0] = but1;
X+ 	but[1] = but2;
X+ 	but[2] = but3;
X+ 	but[3] = but4;
X+ 
X+ 	if(width > bounds.right) width = bounds.right;
X+ 	if(width < MIN_WIDTH) width = MIN_WIDTH;
X+ 	if(height > bounds.bottom) height = bounds.bottom;
X+ 	if(height < MIN_HEIGHT) height = MIN_HEIGHT;
X+ 
X+ 	InsetRect(&bounds, (int) ((bounds.right - width) >> 1), (int)
X+ 		((bounds.bottom - height) >> 1));
X+ 	theWindow = NewWindow(0L, &bounds, "", 1, plainDBox, 0L, 0, 0L);
X+ 	ShowWindow(theWindow);
X+ 	SelectWindow(theWindow);
X+ 	SetPort(theWindow);
X+ 	OffsetRect(&bounds, - bounds.left, - bounds.top);
X+ 
X+ 	nobutts = 0;
X+ 	if(but1[0]) nobutts=1;
X+ 	if(but2[0]) nobutts=2;
X+ 	if(but3[0]) nobutts=3;
X+ 	if(but4[0]) nobutts=4;
X+ 
X+ 	if(!nobutts) {
X+ 		but[0] = "OK";
X+ 		nobutts++;
X+ 	}
X+ 
X+ 	spacing = 0;
X+ 	for(x=0 ; x < nobutts; x++) {
X+ 		bwid[x] = TextWidth(but[x], 0, strlen(but[x])) + 2 * BUT_MARGIN;
X+ 		spacing += bwid[x] + BUT_SPACING;
X+ 	}
X+ 
X+ 	pool = bounds.right - 2 * BUT_MARGIN;
X+ 
X+ 	heig = 1;
X+ 	while(spacing / heig > pool - (nobutts - 1) * BUT_SPACING) {
X+ 		heig++;
X+ 	}
X+ 
X+ 	for(x=0; x<nobutts; x++) {
X+ 		bwid[x] = (int) ((float) bwid[x] / spacing * pool);
X+ 	}
X+ 
X+ 	pool = BUT_MARGIN + BUT_SPACING;
X+ 	heig = bounds.bottom - BUT_MARGIN - BUT_SPACING - BUT_HEIGHT * heig;
X+ 	for(x=0; x<nobutts; x++) {
X+ 		SetRect(&(brect[x]), pool, heig, pool + bwid[x], bounds.bottom -
X+ 			BUT_SPACING - BUT_MARGIN);
X+ 		pool += bwid[x] + BUT_SPACING;
X+ 		hilite[x] = 0;
X+ 	}
X+ 
X+ 	InsetRect(&bounds, 2, 2);
X+ 	textBox = bounds;
X+ 	if(thePICT) {
X+ 		textBox.left += (*thePICT)->picFrame.right;
X+ 	}
X+ 	textBox.left += 8;
X+ 	textBox.right -= 8;
X+ 	textBox.top += 8;
X+ 	textBox.bottom = heig - BUT_MARGIN;
X+ 	if(textBox.bottom < textBox.top + 15) {
X+ 		textBox.bottom = bounds.bottom - 8;
X+ 	}
X+ 
X+ 	goto mainLoop;
X+ 
X+ drawWindow:
X+ 	SetPort(theWindow);
X+ 	EraseRect(&(theWindow->portRect));
X+ 	PenNormal();
X+ 	PenSize(BORDER_WIDTH, BORDER_WIDTH);
X+ 	GetIndPattern((void *) border, 0, BORDER_PAT);
X+ 	PenPat(border);
X+ 	FrameRect(&bounds);
X+ 
X+ 	PenNormal();
X+ 
X+ 	if(thePICT) {
X+ 		HLock(thePICT);
X+ 		DrawPicture(thePICT, &((*thePICT)->picFrame));
X+ 		HUnlock(thePICT);
X+ 	}
X+ 
X+ 	PenNormal();
X+ 	TextFont(0);
X+ 	TextSize(12);
X+ 	TextBox(text, strlen(text), &textBox, teJustLeft);
X+ 
X+ 	for(x=0; x<nobutts; x++) {
X+ 		EraseRoundRect(&(brect[x]), BUT_CORNER, BUT_CORNER);
X+ 		FrameRoundRect(&(brect[x]), BUT_CORNER, BUT_CORNER);
X+ 		InsetRect(&(brect[x]), BUT_MARGIN, 3);
X+ 		TextBox(but[x], strlen(but[x]), &(brect[x]), teJustCenter);
X+ 		InsetRect(&(brect[x]), - BUT_MARGIN, - 3);
X+ 		if(hilite[x]) {
X+ 			InvertRoundRect(&(brect[x]), BUT_CORNER, BUT_CORNER);
X+ 		}
X+ 		if(x == def) {
X+ 			PenSize(FRAME_WIDTH, FRAME_WIDTH);
X+ 			InsetRect(&(brect[x]), - FRAME_WIDTH - FRAME_OFFSET,
X+ 				- FRAME_WIDTH - FRAME_OFFSET);
X+ 			FrameRoundRect(&(brect[x]), FRAME_CORNER, FRAME_CORNER);
X+ 			InsetRect(&(brect[x]), FRAME_WIDTH + FRAME_OFFSET,
X+ 				FRAME_WIDTH + FRAME_OFFSET);
X+ 			PenNormal();
X+ 		}
X+ 	}
X+ 
X+ mainLoop:
X+ 	while(1) {
X+ 		if(WaitNextEvent(-1, &theEvent, 0L, 0L)) {
X+ 			switch(theEvent.what) {
X+ 
X+ 			case updateEvt :
X+ 				BeginUpdate((WindowPtr) theEvent.message);
X+ 				EndUpdate((WindowPtr) theEvent.message);
X+ 				goto drawWindow;
X+ 
X+ 			case mouseDown :
X+ 				if (FindWindow(theEvent.where, &tmpWind) < inContent ||
X+ 					tmpWind != theWindow) {
X+ 					if(!flags.silent) SysBeep(20);
X+ 					item = -1;
X+ 				} else {
X+ 					item = TrackThem(brect, hilite, nobutts);
X+ 				}
X+ 				if(item >= 0) {
X+ 					Delay(FLASH_TIME, &finalTicks);
X+ 					InvertRoundRect(&(brect[item]), BUT_CORNER, BUT_CORNER);
X+ 					ret = item + 1;
X+ 					goto getout;
X+ 				}
X+ 				break;
X+ 
X+ 			case keyDown :
X+ 				c = theEvent.message & 0xFF;
X+ 				if((c == 13) || (c == 3)) {
X+ 					if(def >= 0) {
X+ 						InvertRoundRect(&(brect[def]), BUT_CORNER, BUT_CORNER);
X+ 						Delay(FLASH_TIME, &finalTicks);
X+ 						InvertRoundRect(&(brect[def]), BUT_CORNER, BUT_CORNER);
X+ 						ret = def + 1;
X+ 						goto getout;
X+ 					}
X+ 				}
X+ 				if(c == 27) {
X+ 					if(esc >= 0) {
X+ 						InvertRoundRect(&(brect[esc]), BUT_CORNER, BUT_CORNER);
X+ 						Delay(FLASH_TIME, &finalTicks);
X+ 						InvertRoundRect(&(brect[esc]), BUT_CORNER, BUT_CORNER);
X+ 						ret = esc + 1;
X+ 						goto getout;
X+ 					}
X+ 				}
X+ 				for(x=0; x<nobutts; x++) {
X+ 					s1[0] = 1;
X+ 					s1[1] = c;
X+ 					s2[0] = 1;
X+ 					s2[1] = but[x][0];
X+ 					UprString(s1, 1);
X+ 					UprString(s2, 1);
X+ 					if(s1[1] == s2[1]) {
X+ 						InvertRoundRect(&(brect[x]), BUT_CORNER, BUT_CORNER);
X+ 						Delay(FLASH_TIME, &finalTicks);
X+ 						InvertRoundRect(&(brect[x]), BUT_CORNER, BUT_CORNER);
X+ 						ret = x + 1;
X+ 						goto getout;
X+ 					}
X+ 				}
X+ 
X+ 				PenSize(FRAME_WIDTH, FRAME_WIDTH);
X+ 				InsetRect(&(brect[def]), - FRAME_WIDTH - FRAME_OFFSET,
X+ 					- FRAME_WIDTH - FRAME_OFFSET);
X+ 				PenMode(patXor);
X+ 				FrameRoundRect(&(brect[def]), FRAME_CORNER, FRAME_CORNER);
X+ 				InsetRect(&(brect[def]), FRAME_WIDTH + FRAME_OFFSET,
X+ 					FRAME_WIDTH + FRAME_OFFSET);
X+ 				PenNormal();
X+ 
X+ 				def++;
X+ 				def %= nobutts;
X+ 
X+ 				PenSize(FRAME_WIDTH, FRAME_WIDTH);
X+ 				InsetRect(&(brect[def]), - FRAME_WIDTH - FRAME_OFFSET,
X+ 					- FRAME_WIDTH - FRAME_OFFSET);
X+ 				FrameRoundRect(&(brect[def]), FRAME_CORNER, FRAME_CORNER);
X+ 				InsetRect(&(brect[def]), FRAME_WIDTH + FRAME_OFFSET,
X+ 					FRAME_WIDTH + FRAME_OFFSET);
X+ 				PenNormal();
X+ 
X+ 				break;
X+ 
X+ 			default:
X+ 				;
X+ 			}
X+ 		}
X+ 	}
X+ 
X+ getout:
X+ 	DisposeWindow(theWindow);
X+ 	if(thePICT) DisposHandle(thePICT);
X+ 	SetPort(savedPort);
X+ 	bounds = savedPort->portRect;
X+ 	InvalRect(&bounds);
X+ 
X+ 	return ret;
X+ }
X+ 
X+ 
X+ /* TrackThem is a help function to MacAlert, it tracks buttons,
X+    returns the button number (0 - (no_butts-1)) or -1 if no button
X+    was hit. */
X+ int
X+ TrackThem(b_rect, hi_lite, no_butts)
X+ Rect * b_rect;
X+ char * hi_lite;
X+ int no_butts;
X+ {
X+ Point p;
X+ int x, i;
X+ 
X+ 	while(Button()) {
X+ 		SystemTask();
X+ 		GetMouse(&p);
X+ 		for(x=0; x<no_butts; x++) {
X+ 			if(PtInRect(p, &(b_rect[x]))) {
X+ 				if(!hi_lite[x]) {
X+ 					hi_lite[x] = 1;
X+ 					InvertRoundRect(&(b_rect[x]), BUT_CORNER, BUT_CORNER);
X+ 				}
X+ 			} else {
X+ 				if(hi_lite[x]) {
X+ 					hi_lite[x] = 0;
X+ 					InvertRoundRect(&(b_rect[x]), BUT_CORNER, BUT_CORNER);
X+ 				}
X+ 			}
X+ 		}
X+ 	}
X+ 
X+ 	i = -1;
X+ 	for(x=0; x<no_butts; x++) {
X+ 		if(hi_lite[x]) i=x;
X+ 	}
X+ 
X+ 	return i;
X+ }
X+ 
X+ 
X+ /* #defines for the mini-pager */
X+ 
X+ #define QUIT_BUT 0
X+ #define TOP_BUT 1
X+ #define MORE_BUT 2
X+ #define MORE_TEXT	20
X+ #define LITTLE_MORE_TEXT 20
X+ #define TOP_TEXT	-2
X+ #define QUIT_PAGER	-1
X+ #define NULL_EVT	-3
X+ 
X+ 
X+ static Rect rectSave;
X+ static int window_inited = 0;
X+ 
X+ int more_disabled;
X+ 
X+ 
X+ void
X+ draw_box(char * whence, size_t length, Rect * where, int strip)
X+ {
X+ Point mark;
X+ size_t bar = 0;
X+ GrafPtr aPort;
X+ 
X+ 	TextFont(4);
X+ 	TextSize(9);
X+ 	GetPort(&aPort);
X+ 	ClipRect(where);
X+ 
X+ 	mark.h = where->left + 3;
X+ 	mark.v = where->top + 11;
X+ 
X+ 	while(length-- && mark.v < where->bottom) {
X+ 		MoveTo(mark.h, mark.v);
X+ 
X+ 		switch(whence[bar]) {
X+ 
X+ 		case 0x9:
X+ 			mark.h += 45;
X+ 			mark.h -= mark.h % 48;
X+ 			mark.h += 3;
X+ 			break;
X+ 
X+ 		case 0x7:
X+ 			if(!flags.silent) {
X+ 				if(!flags.silent) SysBeep(20);
X+ 			}
X+ 			break;
X+ 
X+ 		case 0xC:
X+ 			EraseRect(where);
X+ 			mark.h = where->left + 3;
X+ 			mark.v = where->top + 11;
X+ 			break;
X+ 
X+ 		case 0xA:
X+ 		case 0xD:
X+ 			if(strip) bar++;
X+ 			mark.h = where->left + 3;
X+ 			mark.v += 11;
X+ 			MoveTo(mark.h, mark.v);
X+ 			break;
X+ 
X+ 		default:
X+ 			if(PtInRect(mark, where))
X+ 				DrawChar(whence[bar]);
X+ 			mark.h += 6;
X+ 			break;
X+ 		}
X+ 		bar++;
X+ 	}
X+ 	ClipRect(&(aPort->portRect));
X+ }
X+ 
X+ 
X+ void
X+ draw_btns(Rect * buttons)
X+ {
X+ int i;
X+ 
X+ 	PenNormal();
X+ 
X+ 	TextFont(0);	/* System Font: usually Chicago */
X+ 	TextSize(12);	/* 12 pt */
X+ 	for(i=0; i<3; i++) {
X+ 		EraseRect(&(buttons[i]));
X+ 		FrameRoundRect(&(buttons[i]), BUT_CORNER, BUT_CORNER);
X+ 		MoveTo(buttons[i].left + 5, buttons[i].top + 13);
X+ 		DrawText("Quit TopMore", i * 4, 4);
X+ 	}
X+ 	if(more_disabled) {
X+ 		PenPat(patBic);
X+ 		PenPat(gray);
X+ 		PaintRoundRect(&(buttons[MORE_BUT]), BUT_CORNER, BUT_CORNER);
X+ 		PenNormal();
X+ 	}
X+ }
X+ 
X+ 
X+ static char lite[3] = { 0, 0, 0, };
X+ 
X+ 
X+ int
X+ how_scroll(Rect * btns, GrafPtr port)
X+ {
X+ EventRecord theEvent;
X+ int hit;
X+ long finalTicks;
X+ 
X+ 	while(!WaitNextEvent(everyEvent, &theEvent, 0L, 0L));
X+ 	SetPort(port);
X+ 	ClipRect(&(port->portRect));
X+ 
X+ 	switch(theEvent.what) {
X+ 
X+ 	case keyDown:
X+ 		switch(theEvent.message & 0xFF) {
X+ 
X+ 		case 0x20:
X+ 		case 'M':
X+ 		case 'm':
X+ 			if(!more_disabled) {
X+ 				InvertRoundRect(&(btns[MORE_BUT]), BUT_CORNER, BUT_CORNER);
X+ 				lite[MORE_BUT] = 1;
X+ 				return MORE_TEXT;
X+ 			} else if(!flags.silent) SysBeep(20);
X+ 			break;
X+ 
X+ 		case 0xD:
X+ 		case 0xA:
X+ 			if(!more_disabled) {
X+ 				InvertRoundRect(&(btns[MORE_BUT]), BUT_CORNER, BUT_CORNER);
X+ 				lite[MORE_BUT] = 1;
X+ 				return LITTLE_MORE_TEXT;
X+ 			} else if(!flags.silent) SysBeep(20);
X+ 			break;
X+ 
X+ 		case 'Q':
X+ 		case 'q':
X+ 		case 0x3:
X+ 		case 0x1B:
X+ 			InvertRoundRect(&(btns[QUIT_BUT]), BUT_CORNER, BUT_CORNER);
X+ 			return QUIT_PAGER;
X+ 
X+ 		case '.':		
X+ 			if(theEvent.modifiers & cmdKey) {
X+ 				InvertRoundRect(&(btns[QUIT_BUT]), BUT_CORNER, BUT_CORNER);
X+ 				return QUIT_PAGER;
X+ 			}
X+ 			break;
X+ 
X+ 		case 't':
X+ 		case 'T':
X+ 			InvertRoundRect(&(btns[TOP_BUT]), BUT_CORNER, BUT_CORNER);
X+ 			return TOP_TEXT;
X+ 
X+ 		default:
X+ 			if(!flags.silent) SysBeep(20);
X+ 		}
X+ 		break;
X+ 	case mouseDown:
X+ 		{
X+ 		WindowPtr xW;
X+ 		short part = FindWindow(theEvent.where, &xW);
X+ 			if(StripAddress(xW) != StripAddress(port)) {
X+ 				if(part == inDrag && theEvent.modifiers & cmdKey) {
X+ 				RgnHandle grayReg = GetGrayRgn();
X+ 				char hState = HGetState(grayReg);
X+ 					HLock(grayReg);
X+ 					DragWindow(xW, theEvent.where, &((*grayReg)->rgnBBox));
X+ 					HSetState(grayReg, hState);
X+ 				} else if(!flags.silent) SysBeep(20);
X+ 			} else {
X+ 				switch(part) {
X+ 	
X+ 				case inDrag:
X+ 					{
X+ 					RgnHandle grayReg = GetGrayRgn();
X+ 					char hState = HGetState(grayReg);
X+ 						HLock(grayReg);
X+ 						DragWindow(xW, theEvent.where, &((*grayReg)->rgnBBox));
X+ 						HSetState(grayReg, hState);
X+ 						rectSave = xW->portRect;
X+ 						LocalToGlobal((Point *) &(rectSave.top));
X+ 						LocalToGlobal((Point *) &(rectSave.bottom));
X+ 					}
X+ 					break;
X+ 	
X+ 				case inContent:
X+ 					hit = TrackThem(btns, lite, more_disabled ? 2 : 3);
X+ 					switch(hit) {
X+ 	
X+ 					case QUIT_BUT:
X+ 						return QUIT_PAGER;
X+ 	
X+ 					case TOP_BUT:
X+ 						return TOP_TEXT;
X+ 	
X+ 					case MORE_BUT:
X+ 						return MORE_TEXT;
X+ 	
X+ 					default:
X+ 						if(!flags.silent) SysBeep(20);
X+ 					}
X+ 					break;
X+ 	
X+ 				case inGoAway:
X+ 					if(TrackGoAway (xW, theEvent.where)) return QUIT_PAGER;
X+ 					break;
X+ 
X+ 				default:
X+ 					if(!flags.silent) SysBeep(20);
X+ 					break;
X+ 	
X+ 				}
X+ 			}
X+ 		}
X+ 		break;
X+ 
X+ 	case updateEvt:
X+ 		BeginUpdate((WindowPtr) theEvent.message);
X+ 		if(StripAddress(theEvent.message) ==
X+ 			StripAddress(FrontWindow())) {
X+ 			EndUpdate((WindowPtr) theEvent.message);
X+ 			return 0;
X+ 		} else if(StripAddress(HackWindow) ==
X+ 			StripAddress(theEvent.message)) {
X+ 			SetPort(HackWindow);
X+ 			docrt();
X+ 			SetPort(port);
X+ 		}
X+ 		EndUpdate((WindowPtr) theEvent.message);
X+ 		break;
X+ 
X+ 	default:
X+ 		break;
X+ 	}
X+ 	return NULL_EVT;
X+ }
X+ 
X+ 
X+ void
X+ display_data(char * buffer, size_t length, int strip, WindowPtr window)
X+ {
X+ Rect buttons[3], text_area, bounds;
X+ size_t b_index = 0;
X+ short pgEvent, bar, i;
X+ 
X+ 	more_disabled = 0;
X+ 	text_area = window->portRect;
X+ 	OffsetRect(&text_area, text_area.left, text_area.top);
X+ 	InsetRect(&text_area, 3, 3);
X+ 	bounds = text_area;
X+ 	text_area.bottom -= 30;
X+ 
X+ 	PenNormal();
X+ 
X+ 	buttons[QUIT_BUT].left = bounds.left;
X+ 	buttons[QUIT_BUT].top = bounds.bottom - 18;
X+ 	buttons[QUIT_BUT].right = bounds.left + 39;
X+ 	buttons[QUIT_BUT].bottom = bounds.bottom;
X+ 
X+ 	i = bounds.right;
X+ 
X+ 	buttons[MORE_BUT].left = i - 45;
X+ 	buttons[MORE_BUT].top = bounds.bottom - 18;
X+ 	buttons[MORE_BUT].right = i;
X+ 	buttons[MORE_BUT].bottom = bounds.bottom;
X+ 
X+ 	buttons[TOP_BUT].left = i - 90;
X+ 	buttons[TOP_BUT].top = bounds.bottom - 18;
X+ 	buttons[TOP_BUT].right = i - 50;
X+ 	buttons[TOP_BUT].bottom = bounds.bottom;
X+ 
X+ 	do {
X+ 		bar = 0;
X+ 		pgEvent = how_scroll(buttons, window);
X+ 		if(pgEvent > 0) bar = MORE_BUT;
X+ 		if(pgEvent == TOP_TEXT) {
X+ 			EraseRect(&text_area);
X+ 			more_disabled = 0;
X+ 			b_index = 0;
X+ 			bar = TOP_BUT;
X+ 			pgEvent = 0;
X+ 		}
X+ 		if(pgEvent == 0) {
X+ 			draw_btns(buttons);
X+ 			lite[TOP_BUT] = 0;
X+ 		}
X+ 		if(pgEvent == NULL_EVT) {
X+ 			pgEvent = 0;
X+ 		} else {
X+ 		int f = 0;
X+ 			if(pgEvent > 0) f = 1;
X+ 			while(pgEvent > 0 && b_index < length) {
X+ 				while(buffer[b_index] != '\r' && b_index < length) b_index++;
X+ 				if(buffer[b_index++] == '\r') pgEvent--;
X+ 				else break;
X+ 			}
X+ 			if(!pgEvent) {
X+ 				if(f) EraseRect(&text_area);
X+ 				draw_box(&(buffer[b_index]), length - b_index, &text_area, strip);
X+ 			} else if(pgEvent > 0) {
X+ 				PenMode(patOr);
X+ 				PenPat(gray);
X+ 				PaintRoundRect(&(buttons[MORE_BUT]), BUT_CORNER,
X+ 					BUT_CORNER);
X+ 				more_disabled = 1;
X+ 				PenNormal();
X+ 			}
X+ 			if(lite[bar])
X+ 				InvertRoundRect(&(buttons[bar]), BUT_CORNER, BUT_CORNER);
X+ 		}
X+ 		for(i=0; i<3; i++) lite[i] = 0;
X+ 
X+ 	} while (pgEvent >= 0);
X+ }
X+ 
X+ 
X+ int
X+ mac_more(FILE * fp, int strip)
X+ {
X+ size_t where, length, b_index;
X+ char ** buffer, c;
X+ WindowRecord pageWindow;
X+ WindowPtr oldWindow;
X+ GrafPtr oldPort;
X+ extern WindowPtr HackWindow;
X+ 
X+ 	GetPort(&oldPort);
X+ 	oldWindow = FrontWindow();
X+ 	InitCursor();
X+ 
X+ 	SelectWindow(HackWindow);
X+ 	SetPort(HackWindow);
X+ 	EraseRect(&(HackWindow->portRect));
X+ 	docrt();
X+ 	ValidRect(&(HackWindow->portRect));
X+ 		
X+ 	where = ftell(fp);
X+ 	fseek(fp, 0, SEEK_END);
X+ 	length = ftell(fp);
X+ 	fseek(fp, where, SEEK_SET);
X+ 
X+ 	if(length - where < 1)
X+ 		return -1;
X+ 	if((buffer = (char **) NewHandle(length)) == NULL)
X+ 		return -1;
X+ 	if(MemError()) {
X+ 		DisposHandle(buffer);
X+ 		return -1;
X+ 	}
X+ 
X+ 	MoveHHi(buffer);
X+ 	HLock(buffer);
X+ 
X+ 	fread(*buffer, sizeof(char), length - where, fp);
X+ 	c = (*buffer)[length - where - 1];
X+ 	if(!(c == 0xD || c == 0xA || c == 0)) {
X+ 		(*buffer)[length - where - 1] = 0;
X+ 	}
X+ 
X+ 	while(where < length) {
X+ 		c = (*buffer)[where];
X+ 		if(c == '\n' || c == 0xC || c == 0)
X+ 			c =(*buffer)[where] = '\r';
X+ 		where++;
X+ 	}
X+ 
X+ 	if(!window_inited) {
X+ 		rectSave = thePort->portRect;
X+ 		rectSave.left = rectSave.right - 490;
X+ 		rectSave.top = rectSave.bottom - 270;
X+ 		OffsetRect(&rectSave, 10 - (rectSave.left >> 1), 40 - (rectSave.top >> 1));
X+ 		window_inited = 1;
X+ 	}
X+ 
X+ 	(void) NewWindow(&pageWindow, &rectSave, "\011Hack-Info", TRUE, documentProc,
X+ 		0L, TRUE, 0L);
X+ 	SelectWindow(&pageWindow);
X+ 	SetPort(&pageWindow);
X+ 	ClipRect(&(pageWindow.port.portRect));
X+ 
X+ 	display_data(*buffer, length, strip, (WindowPtr) &pageWindow);
X+ 	HUnlock(buffer);
X+ 	DisposHandle(buffer);
X+ 
X+ 	Delay(FLASH_TIME, &where);
X+ 	CloseWindow(&pageWindow);
X+ 	SelectWindow(oldWindow);
X+ 	SetPort(oldWindow);
X+ 	if(StripAddress(oldWindow) == StripAddress(HackWindow)) {
X+ 		EraseRect(&(oldWindow->portRect));
X+ 		ValidRect(&(oldWindow->portRect));
X+ 		docrt();
X+ 	}
X+ 	SetPort(oldPort);
X+ 	return 0;
X+ }
X+ 
X*** mac/Old/mac.c	Mon Feb 19 21:22:25 1990
X--- mac/mac.c	Mon Feb 19 13:40:22 1990
X***************
X*** 11,16 ****
X--- 11,24 ----
X  WindowPtr	HackWindow;	/* points to Hack's window */
X  extern char	*keys[8];
X  extern short macflags;
X+ short cursorPos=0;
X+ short repDelay;
X+ long lastMD;
X+ struct line {
X+ 	struct line *next_line;
X+ 	char *line_text;
X+ } *mactexthead;
X+ short maclinect, macmaxlen;
X  
X  int
X  tgetch()
X***************
X*** 18,27 ****
X  {
X  	char	ch;
X  	EventRecord	theEvent;
X! 	Rect cursorRect;
X  	long	message,cursorTime,start;
X  	MenuHandle	theMenu;
X! 	short	keyCode;
X  	term_info	*t;
X  	boolean	noControlKey;
X  	GrafPtr	oldPort,oldPort1;
X--- 26,36 ----
X  {
X  	char	ch;
X  	EventRecord	theEvent;
X! 	Rect cursorRect,box,windowRect;
X  	long	message,cursorTime,start;
X  	MenuHandle	theMenu;
X! 	register short	keyCode;
X! 	short	temp;
X  	term_info	*t;
X  	boolean	noControlKey;
X  	GrafPtr	oldPort,oldPort1;
X***************
X*** 28,46 ****
X  	static char nextCommand;
X  	short aboutBox();
X  	char mButtonDown();
X  #define noEscapeKey	noControlKey
X  #define	clearKey	0x47
X  #define ESCAPEkey	0x1B
X  	
X  	t = (term_info *)GetWRefCon(HackWindow);
X  	cursorRect.left = t->tcur_x * t->charWidth + Screen_Border;
X  	cursorRect.right = cursorRect.left + t->charWidth - 1;
X  	cursorRect.top = t->height * t->tcur_y + Screen_Border;
X  	cursorRect.bottom = cursorRect.top + t->height;
X! 	cursorTime = GetCaretTime()/2;
X! 	keyCode = 0;
X  	noControlKey = (t->system.keyBoardType <= envMacPlusKbd) ? TRUE : FALSE;
X! 	
X  	/* permit use of cursor keys and numeric keypad */
X  	/* does the same translation as in msdos.c but includes cursor keys */
X  	ch = '\0';
X--- 37,62 ----
X  	static char nextCommand;
X  	short aboutBox();
X  	char mButtonDown();
X+ 	Point	mouseLoc;
X+ 	WindowPtr	theWindow;
X+ 	void	doUpdate();
X  #define noEscapeKey	noControlKey
X  #define	clearKey	0x47
X  #define ESCAPEkey	0x1B
X  	
X  	t = (term_info *)GetWRefCon(HackWindow);
X+ 	mouseLoc.h = (macflags & fMoveWRTMouse) ? t->tcur_x : (u.ux-1);
X+ 	mouseLoc.v = (macflags & fMoveWRTMouse) ? t->tcur_y : (u.uy+1);
X  	cursorRect.left = t->tcur_x * t->charWidth + Screen_Border;
X  	cursorRect.right = cursorRect.left + t->charWidth - 1;
X  	cursorRect.top = t->height * t->tcur_y + Screen_Border;
X  	cursorRect.bottom = cursorRect.top + t->height;
X! 	cursorTime = GetCaretTime();
X  	noControlKey = (t->system.keyBoardType <= envMacPlusKbd) ? TRUE : FALSE;
X! 	box.left = mouseLoc.h * t->charWidth + Screen_Border;
X! 	box.right = box.left + t->charWidth;
X! 	box.top = mouseLoc.v * t->height + Screen_Border + t->height/2 - (t->charWidth/2);
X! 	box.bottom = box.top + t->charWidth;
X  	/* permit use of cursor keys and numeric keypad */
X  	/* does the same translation as in msdos.c but includes cursor keys */
X  	ch = '\0';
X***************
X*** 61,225 ****
X  	}
X  	GetPort(&oldPort);
X  	SetPort(HackWindow);
X! 	while (!ch) {
X! 		keyCode = 0;
X! 	    GetPort(&oldPort1);
X! 	    SetPort((GrafPtr)HackWindow);
X! 	    /* do cursor blinking */
X! 	    message = TickCount() + cursorTime;
X! 	    while (!WaitNextEvent(everyEvent, &theEvent, 10L, 0L)) {
X! 		/* wait until something occurs */
X! 		if (!Invisible) {
X! 		    if (TickCount() > message) {
X! 			InvertRect(&cursorRect);
X! 			message = TickCount() + cursorTime;
X! 			keyCode = !keyCode;
X! 		    }
X! 		}
X! 	    }
X! 	    if (keyCode)
X  		InvertRect(&cursorRect);
X! 	    SetPort(oldPort1);
X! 	    if (theEvent.what == keyDown || theEvent.what == autoKey) {
X! 		/* use raw key codes */
X! 		keyCode = (LoWord(theEvent.message) & keyCodeMask)>>8;
X! 		if (keyCode == 50 && noEscapeKey)
X! 		    ch = (char)ESCAPEkey;	/* ESC */
X! 		else if (keyCode == clearKey) {
X! 		    macflags = macflags ^ fToggleNumPad;
X! 		    SetWTitle(HackWindow,
X! 			    (macflags & fToggleNumPad)	? "\015NetHack [MOV]"
X! 							: "\015NetHack [NUM]");
X! 		} else if ((macflags & fToggleNumPad) &&
X! 				(keyCode>64 && keyCode<127))
X! 		    ch = t->keyMap[keyCode-65];
X! 		/* make the command key = control key on old Mac keyboards */
X! 		if ((theEvent.modifiers & cmdKey) && noControlKey) {
X! 		    ch = (char)(theEvent.message & 0x1F);
X! 		}
X! 		if ((theEvent.modifiers & shiftKey) && (ch)) {
X! 		    ch = (ch == '.') ? ':' : (char)toupper(ch);
X! 		}
X! 		if (theEvent.modifiers & optionKey) {
X! 		    for(start = 43; start < 56; start++) {
X! 			if (t->keyMap[start] == (char)(theEvent.message & 0xFFL)) {
X! 			    ch = t->keyMap[start - 13];
X! 			    break;
X! 			}
X! 		    }
X! 		}
X! 		/* not a cursor key or from the numeric keypad */
X! 		if (!ch && keyCode != clearKey) {
X! 		    ch = (char)(theEvent.message & 0xFF);
X! 		}
X! 	    } else {
X  		/* what other events to handle */
X! 		switch (theEvent.what) {		
X! 		    case nullEvent:
X! 			SetCursor(&ARROW_CURSOR);
X! 			break;
X! 		    case app4Evt:
X! #define	kSuspendResumeMessage 1  /* high byte of suspend/resume event message */
X! #define	SuspResIsResume(evtMessage)	((evtMessage) & 0x00000001)
X! 
X! 			switch (theEvent.message >> 24) {
X! 			    case kSuspendResumeMessage:
X! 				if (!SuspResIsResume(theEvent.message)) {
X! 				    /* ---------- SUSPEND EVENT ------------ */
X! 				    if (macflags & fZoomOnContextSwitch)	
X! 					SizeWindow(HackWindow,60,60,TRUE);
X! 				} else {
X! 				    /* ---------- RESUME EVENT ------------- */
X! 				    if (macflags & fZoomOnContextSwitch)	
X! 					SizeWindow(HackWindow,
X! 					 (t->maxCol * t->charWidth) + 2*Screen_Border,
X! 					 (t->maxRow * t->height) + 2*Screen_Border,
X! 					 TRUE);
X  				}
X  				break;
X! 			}
X! 			break;
X  		
X! 		    case updateEvt:
X! 			if (HackWindow == (WindowPtr)theEvent.message) {
X! #ifdef TEXTCOLOR
X! 			    if (t->system.hasColorQD) {
X! 				Rect	r;
X! 				GDHandle	gd;
X! 				
X! 				r = (**(*(WindowPeek)HackWindow).contRgn).rgnBBox;
X! 				LocalToGlobal(&r.top);
X! 				LocalToGlobal(&r.bottom);
X! 				gd = GetMaxDevice(&r);
X! 				HLock((Handle)gd);
X! 				t->inColor = (**(**gd).gdPMap).pixelSize > 1;
X! 				HUnlock((Handle)gd);
X! 			    }
X! #endif
X! 			    GetPort(&oldPort);
X! 			    SetPort((GrafPtr)HackWindow);
X! 			    BeginUpdate(HackWindow);
X! 			    t = (term_info *)GetWRefCon(HackWindow);
X! 			    if (t->inColor && macflags & fDoUpdate) {
X! 				keyCode = flags.toplin;
X! 				flags.toplin = 0;
X! 				docrt();
X! 				flags.toplin = keyCode;
X! 			    } else {
X! 				for (keyCode = 0;keyCode < t->maxRow; keyCode++) {
X! 				    MoveTo(Screen_Border,
X! 					    t->ascent + (keyCode * t->height)
X! 						    + Screen_Border);
X! 				    DrawText(&t->screen[keyCode][0], 0, t->maxCol);
X  				}
X! 			    }
X! 			    EndUpdate(HackWindow);
X! 			    SetPort(oldPort);
X! 			} 
X! 			break;
X  				
X! 		    case activateEvt:
X! 			if (HackWindow == (WindowPtr)theEvent.message) {
X! 			    if (theMenu = GetMHandle(editMenu)) {
X! 				if (theEvent.modifiers & activeFlag) {
X! 				    if (macflags & fDoUpdate) {
X! 					SetMenuBar(t->fullMBarHandle);
X! 					for (keyCode = fileMenu;
X! 					      keyCode <= extendMenu;keyCode++) {
X! 					    if (keyCode != editMenu)
X! 						EnableItem(GetMHandle(keyCode), 0);
X  					}
X- 					EnableItem(GetMHandle(appleMenu), 1);
X- 				    }
X- 				    DisableItem(theMenu, 0);
X- 				} else {
X- 				    EnableItem(theMenu, 0);
X- 				    if (macflags & fDoUpdate) {
X- 					SetMenuBar(t->shortMBarHandle);
X- 					for (keyCode = fileMenu;
X- 					      keyCode <= extendMenu;keyCode++) {
X- 					    if (keyCode != editMenu)
X- 						DisableItem(GetMHandle(keyCode), 0);
X- 					}
X- 					DisableItem(GetMHandle(appleMenu), 1);
X- 				    }
X  				}
X! 				DrawMenuBar();
X! 			    }
X! 			}
X! 			break;
X  				
X! 		    case mouseDown:
X! 			ch = mButtonDown(theEvent, t, &nextCommand);
X! 			break;
X! 		}
X! 	    }		
X  	}
X  	SetPort(oldPort);
X- 	ObscureCursor();
X  	return ((ch == '\r') ? '\n' : ch);
X  }
X  
X  char
X  mButtonDown(theEvent, t, nextCommand)
X  EventRecord	theEvent;
X--- 77,385 ----
X  	}
X  	GetPort(&oldPort);
X  	SetPort(HackWindow);
X! 	if (!(macflags & fDoNonKeyEvt)) {
X! 		cursorPos = -1;
X! 		SetCursor(&ARROW_CURSOR);
X! 	}
X! 	/* do cursor blinking */
X! 	message = TickCount() + cursorTime;
X! 	if (!EventAvail(keyDownMask|mDownMask|autoKeyMask,&theEvent)) {
X! 		keyCode = true;
X  		InvertRect(&cursorRect);
X! 	} else
X! 		keyCode = 0;
X! 	while (!ch) {
X! 		(void)WaitNextEvent(everyEvent, &theEvent, 0L, 0L);
X! 		if (theEvent.what == keyDown || theEvent.what == autoKey) {
X! 			ch = 0;
X! 			ObscureCursor();
X! 			/* use raw key codes */
X! 			temp = keyCode;
X! 			keyCode = (LoWord(theEvent.message) & keyCodeMask)>>8;
X!  			if (keyCode == clearKey) {
X! 				macflags = macflags ^ fToggleNumPad;
X! 				SetWTitle(HackWindow,
X! 					(macflags & fToggleNumPad)	? "\016NetHack [MOVE]"
X! 												: "\015NetHack [NUM]");
X! 				keyCode = temp;
X! 				ch = 0;
X! 				continue;
X! 			}
X! 			if (temp)
X! 				InvertRect(&cursorRect);
X! 			if ((macflags & fToggleNumPad) && (keyCode>0x40 &&keyCode < 0x5D) 
X! 				|| (keyCode > 0x7A && keyCode<0x7F)) {
X! 				ch = t->keyMap[keyCode-65];
X! 				if ((theEvent.modifiers & shiftKey) && (ch)) {
X! 					ch = (ch == '.') ? ':' : (char)toupper(ch);
X! 				}
X! 				if (ch)
X! 					break;
X! 			}
X! 			if (keyCode == 50 && noEscapeKey) {
X! 				ch = (char)ESCAPEkey;	/* ESC */
X! 				break;
X! 			}			/* make the command key = control key on old Mac keyboards */
X! 			if ((theEvent.modifiers & cmdKey) && noControlKey) {
X! 				ch = (char)(theEvent.message & 0x1F);
X! 				break;
X! 			}
X! 			if (theEvent.modifiers & optionKey) {
X! 				for(start = 43; start < 56; start++) {
X! 					if (t->keyMap[start] == (char)(theEvent.message & 0xFFL)) {
X! 						ch = t->keyMap[start - 13];
X! 						break;
X! 					}
X! 				}
X! 			}
X! 			/* not a cursor key or from the numeric keypad */
X! 			if (!ch) {
X! 				ch = (char)(theEvent.message & 0xFF);
X! 			}
X! 		} else {
X  		/* what other events to handle */
X! 			switch (theEvent.what) {		
X! 			case nullEvent:
X! 				GetPort(&oldPort1);
X! 				SetPort((GrafPtr)HackWindow);
X! 				/* wait until something occurs */
X! 				if (TickCount() > message) {
X! 					message = TickCount() + cursorTime;
X! 					if (!(macflags & fMoveWRTMouse)
X! 						|| (macflags & fMoveWRTMouse && !keyCode)) {
X! 						InvertRect(&cursorRect);
X! 						keyCode = !keyCode;
X! 					}
X! 				}
X! 				if (FrontWindow() == HackWindow && (macflags & fDoNonKeyEvt)) {
X! 					if ((FindWindow(theEvent.where,&theWindow) == inContent)
X! 						&& (macflags & fDoUpdate) && (HackWindow == theWindow)) {
X! 						
X! 						GetMouse(&mouseLoc);
X! 						if (PtInRect(mouseLoc,&box)) {
X! 							CursHandle theCurs;
X! 							
X! 							theCurs = GetCursor(3);
X! 							cursorPos = 8;
X! 							SetCursor(*theCurs);
X! 						} else {
X! 							PtToAngle(&box,mouseLoc,&temp);
X! 							if (temp >336 || temp < 23) {
X! 								temp = 0;
X! 							} else {
X! 								temp = (temp + 23)/45;
X! 							}
X! 							if (temp >=0 && temp <8 && cursorPos != temp) {
X! 								SetCursor(*t->cursor[temp]);
X! 								cursorPos = temp;
X! #ifdef THINK_C
X! 								repDelay = KeyThresh*2;
X! #else
X! 								repDelay = 42;
X! #endif
X! 								lastMD = theEvent.when;
X! 							}
X! 						}
X! 					} else if (cursorPos>=0) {
X! 						cursorPos = -1;
X! 						SetCursor(&ARROW_CURSOR);
X! 					}
X  				}
X+ 				if (StillDown() && cursorPos>=0 && cursorPos < 8
X+ 					&& TickCount() > lastMD+repDelay) {
X+ 					ch = mButtonDown(theEvent, t, &nextCommand);
X+ 					if (repDelay) {
X+ #ifdef THINK_C
X+ 						repDelay = KeyRepThresh*2;
X+ #else
X+ 						repDelay /= 3;
X+ #endif
X+ 					}
X+ 					lastMD = TickCount();
X+ 					/*return ch;*/
X+ 				}			
X+ 				SetPort(oldPort1);
X  				break;
X! 			case app4Evt:
X! #define	kSuspendResumeMessage	1		/* high byte of suspend/resume event message */
X! #define	kMouseMovedMessage		0xFA	/* high byte of mouse-moved event message */
X! #define	SuspResIsResume(evtMessage)		((evtMessage) & 0x00000001)
X! 
X! 				switch (theEvent.message >> 24) {
X! 					case kSuspendResumeMessage:
X! 						if (!SuspResIsResume(theEvent.message)) {
X! 						/* ---------- SUSPEND EVENT ------------ */
X! 							if (macflags & fZoomOnContextSwitch
X! 								&& !EmptyRect(&(**(HackWindow)->visRgn).rgnBBox))
X! 							{
X! 								InvalRect(&HackWindow->portRect);
X! 								SizeWindow(HackWindow,60,60,FALSE);
X! 							}
X! 						} else {
X! 						/* ---------- RESUME EVENT ------------- */
X! 							if (macflags & fZoomOnContextSwitch) {
X! 								SizeWindow(HackWindow,
X! 								 (t->maxCol * t->charWidth) + 2 * Screen_Border,
X! 								 (t->maxRow * t->height) + 2 * Screen_Border,
X! 								 TRUE);
X! 								SetPort(HackWindow);
X! 								InvalRect(&HackWindow->portRect);
X! 								if ((int) (theMenu = GetMHandle(editMenu))
X! 									&& FrontWindow() == HackWindow) {
X! 									SetMenuBar(t->fullMBarHandle);
X! 									for (temp = fileMenu;temp <= extendMenu;temp++) {
X! 									if (temp != editMenu)
X! 										EnableItem(GetMHandle(temp), 0);
X! 									}
X! 									EnableItem(GetMHandle(appleMenu), 1);
X! 									DisableItem(theMenu, 0);
X! 									DrawMenuBar();
X! 								}
X! 							}
X! 						}
X! 						break;
X! 				}
X! 				break;
X  		
X! 			case updateEvt:
X! 				if (HackWindow == (WindowPtr)theEvent.message) {
X! 					doUpdate(t);
X  				}
X! 				break;
X  				
X! 			case activateEvt:
X! 				if (HackWindow == (WindowPtr)theEvent.message) {
X! 					if (theMenu = GetMHandle(editMenu)) {
X! 						if (theEvent.modifiers & activeFlag) {
X! 							if (macflags & fDoUpdate) {
X! 								SetMenuBar(t->fullMBarHandle);
X! 								for (temp = fileMenu;temp <= extendMenu;temp++) {
X! 									if (temp != editMenu)
X! 										EnableItem(GetMHandle(temp), 0);
X! 								}
X! 								EnableItem(GetMHandle(appleMenu), 1);
X! 							}
X! 							DisableItem(theMenu, 0);
X! 						} else {
X! 							EnableItem(theMenu, 0);
X! 							if (macflags & fDoUpdate) {
X! 								SetMenuBar(t->shortMBarHandle);
X! 								for (temp = fileMenu;temp <= extendMenu;temp++) {
X! 									if (temp != editMenu)
X! 										DisableItem(GetMHandle(temp), 0);
X! 								}
X! 								DisableItem(GetMHandle(appleMenu), 1);
X! 							}
X! 						}
X! 						DrawMenuBar();
X  					}
X  				}
X! 				break;
X  				
X! 			case mouseDown:
X! 				ch = mButtonDown(theEvent, t, &nextCommand);
X! 				break;
X! 			}
X! 		}		
X  	}
X+ 	if (keyCode && ch && (theEvent.what != keyDown && theEvent.what != autoKey))
X+ 		InvertRect(&cursorRect);
X+ 
X  	SetPort(oldPort);
X  	return ((ch == '\r') ? '\n' : ch);
X  }
X  
X+ void
X+ doUpdate(t)
X+ term_info	*t;
X+ {
X+ 	short	temp;
X+ 	GrafPtr	oldPort;
X+ #ifdef TEXTCOLOR
X+ 	if (t->system.hasColorQD) {
X+ 		Rect	r;
X+ 		GDHandle	gd;
X+ 		
X+ 		r = (**(*(WindowPeek)HackWindow).contRgn).rgnBBox;
X+ 		LocalToGlobal(&r.top);
X+ 		LocalToGlobal(&r.bottom);
X+ 		gd = GetMaxDevice(&r);
X+ 		HLock((Handle)gd);
X+ 		t->inColor = (**(**gd).gdPMap).pixelSize > 1;
X+ 		HUnlock((Handle)gd);
X+ 	}
X+ #endif
X+ 	GetPort(&oldPort);
X+ 	SetPort((GrafPtr)HackWindow);
X+ 	BeginUpdate(HackWindow);
X+ 	if (t->inColor && (macflags & fDoUpdate) && !(macflags & 0x2000)) {
X+ 		char	*tmp;
X+ 		short	x,y;
X+ 		
X+ 		tmp = calloc(2*t->maxCol, sizeof(char));
X+ 		BlockMove(t->screen[0], tmp, t->maxCol);
X+ 		BlockMove(t->screen[1], &tmp[t->maxCol], t->maxCol);
X+ 		x = t->tcur_x;
X+ 		y = t->tcur_y;
X+ 		temp = flags.toplin;
X+ 		flags.toplin = 0;
X+ 		docrt();
X+ 		flags.toplin = temp;
X+ 		BlockMove(tmp, t->screen[0], t->maxCol);
X+ 		BlockMove(&tmp[t->maxCol], t->screen[1], t->maxCol);
X+ 		free(tmp);
X+ 		t->tcur_y = y;
X+ 		t->tcur_x = x;
X+ 	}
X+ 	if (macflags & fDoUpdate) {
X+ 		for (temp = 0;
X+ 			temp < ((t->inColor && !(macflags & fFullScrKluge))
X+ 				? 2 : t->maxRow);
X+ 			temp++) {
X+ 			if ((macflags & fScreenKluges) == fScreenKluges
X+ 				&& temp == t->maxRow-1){
X+ 				if(flags.standout)
X+ 					standoutbeg();
X+ 			}
X+ 			MoveTo(Screen_Border,
X+ 				t->ascent + (temp * t->height) + Screen_Border);
X+ 			DrawText(&t->screen[temp][0], 0, t->maxCol);
X+ 			if ((macflags & fScreenKluges) == fScreenKluges
X+ 				&& temp == t->maxRow-1){
X+ 				if(flags.standout)
X+ 					standoutend();
X+ 			}
X+ 		}
X+ 
X+ 		if (macflags & fDisplayKluge) {
X+ 			register struct line *tl;
X+ 			int curline, lth;
X+ 			
X+ 		    if(flags.toplin == 1) more();	/* ab@unido */
X+ 		    remember_topl();
X+ 		
X+ 		    lth = CO - macmaxlen - 2;		   /* Use full screen width */
X+ 		    if (maclinect < LI && lth >= 10) {		     /* in a corner */
X+ 				home ();
X+ 				cl_end ();
X+ 				flags.toplin = 0;
X+ 				curline = 1;
X+ 				for (tl = mactexthead; tl; tl = tl->next_line) {
X+ 				    curs (lth, curline);
X+ 				    if(curline > 1)
X+ 						cl_end ();
X+ 				    xputs(tl->line_text);
X+ 				    curx = curx + strlen(tl->line_text);
X+ 				    curline++;
X+ 				}
X+ 				curs (lth, curline);
X+ 			}
X+ 		}
X+ 	}
X+ 	EndUpdate(HackWindow);
X+ 	SetPort(oldPort);
X+ }
X+ 
X  char
X  mButtonDown(theEvent, t, nextCommand)
X  EventRecord	theEvent;
X***************
X*** 236,243 ****
X  	GrafPtr	oldPort;
X  
X  	ch = '\0';
X! 	if (macflags & fDoNonKeyEvt) 
X! 	switch (FindWindow(theEvent.where,&theWindow)) {
X  	    case inMenuBar:
X  
X  		SetCursor(&ARROW_CURSOR);
X--- 396,403 ----
X  	GrafPtr	oldPort;
X  
X  	ch = '\0';
X! 	if (macflags & fDoNonKeyEvt) {
X! 		switch (FindWindow(theEvent.where,&theWindow)) {
X  	    case inMenuBar:
X  
X  		SetCursor(&ARROW_CURSOR);
X***************
X*** 251,257 ****
X  			(void)SystemEdit((short)message - 1);
X  			break;
X  		    case appleMenu:
X! 			if (LoWord(message) > 2) {
X  			    GetItem(GetMHandle(HiWord(message)),LoWord(message),
X  					deskacc);
X  			    SetMenuBar(t->shortMBarHandle);
X--- 411,417 ----
X  			(void)SystemEdit((short)message - 1);
X  			break;
X  		    case appleMenu:
X! 			if (LoWord(message) > 1) {
X  			    GetItem(GetMHandle(HiWord(message)),LoWord(message),
X  					deskacc);
X  			    SetMenuBar(t->shortMBarHandle);
X***************
X*** 324,339 ****
X  		}
X  		menuBar = (ROM85 == -1) ? 20 : GetMBarHeight();
X  
X! 		SetRect(&boundsRect, Screen_Border, menuBar + Screen_Border,
X! 			SCREEN_BITS.bounds.right - Screen_Border,
X! 			SCREEN_BITS.bounds.bottom - Screen_Border);
X  		SetCursor(&ARROW_CURSOR);
X  		DragWindow(theWindow, theEvent.where, &boundsRect);
X  		break;
X  	
X! 	    case inContent:
X! 		SelectWindow(theWindow);
X  		break;
X  	}
X  	return ch;
X  }
X--- 484,557 ----
X  		}
X  		menuBar = (ROM85 == -1) ? 20 : GetMBarHeight();
X  
X! 		{
X! 		RgnHandle fooRgn = GetGrayRgn();
X! 			boundsRect = (*fooRgn)->rgnBBox;
X! 		}
X  		SetCursor(&ARROW_CURSOR);
X  		DragWindow(theWindow, theEvent.where, &boundsRect);
X  		break;
X  	
X! 	case inContent:
X! 		if (theWindow != FrontWindow()) {
X! 			SelectWindow(theWindow);
X! 		} else if (theWindow == HackWindow) {
X! 			Point	mouseLoc;
X! 			Rect	box;
X! 			short	temp;
X! 
X! 			if(flags.wantspace) {
X! 				ch = 0x20;
X! 			} else {
X! 				box.left = (u.ux-1) * t->charWidth + Screen_Border + (t->charWidth/2);
X! 				box.right = box.left + 1;
X! 				box.top = (u.uy+1) * t->height + Screen_Border + t->height/2;
X! 				box.bottom = box.top + 1;
X! 				GetMouse(&mouseLoc);
X! 				PtToAngle(&box,mouseLoc,&temp);
X! 				if (temp >337 || temp < 23) {
X! 					temp = 0;
X! 				} else {
X! 					temp = (temp + 23)/45;
X! 				}
X! 				switch(cursorPos) {
X! 					case 0:
X! 						ch = 'k';
X! 						break;
X! 					case 1:
X! 						ch = 'u';
X! 						break;
X! 					case 2:
X! 						ch = 'l';
X! 						break;
X! 					case 3:
X! 						ch = 'n';
X! 						break;
X! 					case 4:
X! 						ch = 'j';
X! 						break;
X! 					case 5:
X! 						ch = 'b';
X! 						break;
X! 					case 6:
X! 						ch = 'h';
X! 						break;
X! 					case 7:
X! 						ch ='y';
X! 						break;
X! 					case 8:
X! 						ch = '.';
X! 						break;
X! 				}
X! 				if ((theEvent.modifiers & shiftKey) && (ch)) {
X! 					ch = (ch == '.') ? ':' : (char)toupper(ch);
X! 				}
X! 			}
X! 		}			
X  		break;
X+ 		}
X+ 	} else {
X+ 		if(flags.wantspace) ch = 0x20;
X  	}
X  	return ch;
X  }
X***************
X*** 381,387 ****
X  {	
X  	EventRecord	theEvent;
X  	
X! 	return (EventAvail(keyDownMask, &theEvent));
X  }
X  #endif
X  
X--- 599,606 ----
X  {	
X  	EventRecord	theEvent;
X  	
X! 	SystemTask();
X! 	return (EventAvail(keyDownMask | mDownMask, &theEvent));
X  }
X  #endif
X  
X***************
X*** 410,415 ****
X--- 629,672 ----
X  	return 1;
X  }
X  
X+ static void
X+ checkScroll(t)
X+ term_info *t;
X+ {
X+ 	if (t->tcur_y >= t->maxRow-1) {
X+ 		short	temp;
X+ 		char	*s;
X+ 
X+ 		BlockMove((Ptr)t->screen[1], (Ptr)t->screen[0],
X+ 			(Size)((t->maxRow - 1) * t->maxCol));
X+ 		for (temp = 0, s = t->screen[t->maxRow - 1];
X+ 				temp < t->maxCol; temp++, s++) {
X+ 			*s = ' ';
X+ 		}
X+ 		{
X+ 			Pattern p, o;
X+ 			Rect	window;
X+ 			
X+ 			if (macflags & fInvertedScreen) {
X+ 				BlockMove((Ptr)&((GrafPtr)HackWindow)->bkPat, (Ptr)&o,
X+ 						sizeof(Pattern));
X+ 				GetIndPattern(&p, sysPatListID,1);
X+ 				BackPat(p);
X+ 			}
X+ 			window = HackWindow->portRect;
X+ 			InsetRect(&window, 4,4);
X+ 			window.top += t->height;
X+ 			ScrollRect(&window, 0, -t->height,
X+ 					((WindowPeek)HackWindow)->updateRgn);
X+ 			ValidRect(&window);
X+ 			if (macflags & fInvertedScreen) {
X+ 				BackPat(o);
X+ 			}
X+ 		}
X+ 		t->tcur_y = t->maxRow - 1;
X+ 	}
X+ }
X+ 
X  void
X  mput(s)
X  char	*s;
X***************
X*** 532,538 ****
X  	    
X  	    if (sLen) {
X  		while (stmp < (s + sLen)) {
X! 		    temp = (x + charleft - 1 < t->maxCol) ? charleft : t->maxCol - x;
X  		    savech = '\0';
X  		    c1 = stmp + temp;	/* point to the char after the end */
X  		    c = index(stmp, '\n');
X--- 789,795 ----
X  	    
X  	    if (sLen) {
X  		while (stmp < (s + sLen)) {
X! 		    temp = (x + charleft - 1 < t->maxCol - 1) ? charleft : t->maxCol - x;
X  		    savech = '\0';
X  		    c1 = stmp + temp;	/* point to the char after the end */
X  		    c = index(stmp, '\n');
X***************
X*** 556,577 ****
X  		    if (!savech) {
X  			    t->tcur_x += temp;
X  		    }
X! 		    if (t->tcur_x == t->maxCol || savech) {
X! 			t->tcur_x = 0;
X! 			if (savech != '\r')
X! 				y = (++t->tcur_y);
X! 				/* should probably check for overflow */
X! 		    }
X! 		    x = t->tcur_x;
X! 		    cur.h = Screen_Border;
X! 		    cur.v = y * t->height + t->ascent + Screen_Border;
X! 		    MoveTo(cur.h,cur.v);
X! 		}
X  	    }
X  	}
X! 	if (t->tcur_x >= t->maxCol) {
X  	    t->tcur_x = t->tcur_x % t->maxCol;
X  	    t->tcur_y++;
X  	}
X  	SetPort(prevPort);
X  }
X--- 813,840 ----
X  		    if (!savech) {
X  			    t->tcur_x += temp;
X  		    }
X! 
X! 		    if (t->tcur_x >= t->maxCol-1 || savech) {
X! 			    if (savech != '\r') {
X! 				    if (t->tcur_y >= t->maxRow-1) {
X! 					    checkScroll(t);
X! 				    } else {
X! 					    y = (++t->tcur_y);
X! 				    }
X! 			    }
X! 	
X! 			    x = t->tcur_x = 0;
X! 			    cur.h = Screen_Border;
X! 			    cur.v = y * t->height + t->ascent + Screen_Border;
X! 			    MoveTo(cur.h,cur.v);
X! 			}
X  	    }
X  	}
X! 	}
X! 	if (t->tcur_x >= t->maxCol-1) {
X  	    t->tcur_x = t->tcur_x % t->maxCol;
X  	    t->tcur_y++;
X+ 	    checkScroll(t);
X  	}
X  	SetPort(prevPort);
X  }
X***************
X*** 621,641 ****
X  	}
X  	if (c == '\007') {
X  		SysBeep(1);
X! 	} else if ((c != '\n') && (c != '\r')) {
X  		t->screen[y][x] = c;
X  		DrawText(&c, 0, 1);
X! 		if (!savech)
X  			t->tcur_x++;
X! 	} else {
X! 		t->tcur_x = 0;
X! 		if (t->tcur_y < t->maxRow) {
X! 			if (c == '\n')
X  				t->tcur_y++;
X  		}
X- 		cur.h = (t->tcur_x * t->charWidth) + Screen_Border;
X- 		cur.v = t->ascent + (t->tcur_y * t->height) + Screen_Border;
X- 		MoveTo(cur.h,cur.v);
X  	}
X  	SetPort(prevPort);	
X  	return 1;
X  }
X--- 884,917 ----
X  	}
X  	if (c == '\007') {
X  		SysBeep(1);
X! 	} else if ((c == '\n') || (c == '\r')) {
X! 		t->tcur_x = 0;
X! 		if (t->tcur_y >= t->maxRow && c == '\r') {
X! 			t->tcur_y = t->maxRow - 1;
X! 		} else if (c == '\n') {
X! 			if (t->tcur_y >= t->maxRow-1) {
X! 				checkScroll(t);
X! 			} else {
X! 				t->tcur_y++;
X! 			}
X! 		}
X! 	} else {
X  		t->screen[y][x] = c;
X  		DrawText(&c, 0, 1);
X! 		if (!savech) {
X  			t->tcur_x++;
X! 			if (t->tcur_x >= t->maxCol)
X! 			{
X! 				t->tcur_x = 0;
X  				t->tcur_y++;
X+ 				checkScroll(t);
X+ 			}
X  		}
X  	}
X+ 	cur.h = (t->tcur_x * t->charWidth) + Screen_Border;
X+ 	cur.v = t->ascent + (t->tcur_y * t->height) + Screen_Border;
X+ 	MoveTo(cur.h,cur.v);
X+ 
X  	SetPort(prevPort);	
X  	return 1;
X  }
X***************
X*** 742,747 ****
X--- 1018,1053 ----
X  	return 1;
X  }
X  
X+ DialogTHndl
X+ centreDlgBox(resNum, clip)
X+ short	resNum;
X+ Boolean	clip;
X+ {
X+ 	DialogTHndl	th = (DialogTHndl) GetResource('DLOG', resNum);
X+ 	Rect	rect;
X+ 	short	dv, dh;
X+ 
X+ 	/* centre dialog box on screen */
X+ 	if (th) {
X+ 		rect = SCREEN_BITS.bounds;
X+ 		HLock((Handle)th);
X+ 		dv = ((**th).boundsRect.bottom - (**th).boundsRect.top)/2;
X+ 		dv -= (clip) ? 20 : 0;
X+ 		dh = ((**th).boundsRect.right - (**th).boundsRect.left)/2;
X+ 	
X+ 		(**th).boundsRect.bottom =
X+ 				(rect.bottom + rect.top + MBarHeight)/2 + dv;
X+ 		(**th).boundsRect.top	 =
X+ 				(rect.bottom + rect.top + MBarHeight)/2 - dv;
X+ 		(**th).boundsRect.right	 = (rect.right + rect.left)/2 + dh;
X+ 		(**th).boundsRect.left	 = (rect.right + rect.left)/2 - dh;
X+ 		HUnlock((Handle)th);
X+ 	} else
X+ 		panic("Couldn't load dialog resource");	
X+ 
X+ 	return th;
X+ }
X+ 
X  short
X  aboutBox(prompt)
X  short	prompt;
X***************
X*** 757,777 ****
X  	GrafPtr	oldPort;
X  	EventRecord	theEvent;
X  	term_info	*t;
X! 	DialogTHndl	th = (DialogTHndl) GetResource('DLOG', 129);
X! 	short	dv, dh;
X  
X  	/* if about box on startup, centre about box on screen */
X  	if (!prompt) {
X! 		rect = SCREEN_BITS.bounds;
X! 		dv = ((**th).boundsRect.bottom - 40 - (**th).boundsRect.top)/2;
X! 		dh = ((**th).boundsRect.right - (**th).boundsRect.left)/2;
X! 
X! 		(**th).boundsRect.bottom =
X! 				(rect.bottom + rect.top + MBarHeight)/2 + dv;
X! 		(**th).boundsRect.top	 =
X! 				(rect.bottom + rect.top + MBarHeight)/2 - dv;
X! 		(**th).boundsRect.right	 = (rect.right + rect.left)/2 + dh;
X! 		(**th).boundsRect.left	 = (rect.right + rect.left)/2 - dh;
X  	}
X  
X  	GetPort(&oldPort);
X--- 1063,1073 ----
X  	GrafPtr	oldPort;
X  	EventRecord	theEvent;
X  	term_info	*t;
X! 	DialogTHndl	th;
X  
X  	/* if about box on startup, centre about box on screen */
X  	if (!prompt) {
X! 		th = centreDlgBox(129, TRUE);
X  	}
X  
X  	GetPort(&oldPort);
X***************
X*** 800,805 ****
X--- 1096,1102 ----
X  		}
X  	} else {
X  		while (!itemHit) {
X+ 			SystemTask();
X  			if (GetNextEvent(everyEvent,&theEvent))
X  				if (theEvent.what == mouseDown ||
X    			            theEvent.what == keyDown ||
X***************
X*** 807,813 ****
X  					itemHit = OK_BUTTON;
X  		}
X  	}
X! 	CloseDialog(theDialog);
X  	ReleaseResource((Handle)th);
X  	SetPort(oldPort);
X  	return (itemHit == MORE_INFO_BUTTON);
X--- 1104,1110 ----
X  					itemHit = OK_BUTTON;
X  		}
X  	}
X! 	DisposDialog(theDialog);
X  	ReleaseResource((Handle)th);
X  	SetPort(oldPort);
X  	return (itemHit == MORE_INFO_BUTTON);
X*** mac/Old/macfile.c	Mon Feb 19 21:23:03 1990
X--- mac/macfile.c	Thu Feb  8 17:45:37 1990
X***************
X*** 4,13 ****
X  
X  /*	Common routines to locate files using mac dialog boxes */
X  
X- /*#define MAKEDEFS_C	1	/* define when using makedefs */
X  #include "config.h"
X  #ifdef MACOS
X  
X  short
X  findNamedFile(filename,type,reply)
X  char	*filename;
X--- 4,13 ----
X  
X  /*	Common routines to locate files using mac dialog boxes */
X  
X  #include "config.h"
X  #ifdef MACOS
X  
X+ #define	LARGE_SFGETDLG	-4000
X  short
X  findNamedFile(filename,type,reply)
X  char	*filename;
X***************
X*** 24,30 ****
X  	
X  	name[0] = (char)strlen(filename);
X  	Strcpy((char *)&name[1], filename);
X! 	dialog = GetNewDialog(128,&storage,(WindowPtr)-1);
X  	
X  	if (type == 1)
X  		ParamText("\005 save","\004 for",name,"");
X--- 24,30 ----
X  	
X  	name[0] = (char)strlen(filename);
X  	Strcpy((char *)&name[1], filename);
X! 	SetResLoad(TRUE);
X  	
X  	if (type == 1)
X  		ParamText("\005 save","\004 for",name,"");
X***************
X*** 50,60 ****
X  	}
X  	reply->good = TRUE;
X  	do {
X! 		BringToFront((WindowPtr)dialog);
X! 		ShowWindow((WindowPtr)dialog);
X! 		DrawDialog(dialog);
X! 		SFGetFile(where,prompt,0L,numTypes,types,0L,reply);
X! 		HideWindow((WindowPtr)dialog);
X  		if (reply->good) {
X  			if ((type == 2 && 
X  				!strncmp((char *)&name[1],
X--- 50,56 ----
X  	}
X  	reply->good = TRUE;
X  	do {
X! 		SFPGetFile(where,prompt,0L,numTypes,types,0L,reply,LARGE_SFGETDLG,0L);
X  		if (reply->good) {
X  			if ((type == 2 && 
X  				!strncmp((char *)&name[1],
X***************
X*** 65,77 ****
X  			}
X  		}
X  	} while (!ok && reply->good);
X! 	CloseDialog(dialog);
X  	return ok;
X  }
X  
X! #ifndef MAKEDEFS_C
X  extern WindowPtr HackWindow;
X! 
X  /*	this function also gets called by topten() in topten.c to
X   *	locate the record file, but it doesn't matter at this point
X   *	since the game is over by now. If nethack ever restarts,
X--- 61,73 ----
X  			}
X  		}
X  	} while (!ok && reply->good);
X! 
X  	return ok;
X  }
X  
X! #ifdef CUSTOM_IO
X  extern WindowPtr HackWindow;
X! extern short macflags;
X  /*	this function also gets called by topten() in topten.c to
X   *	locate the record file, but it doesn't matter at this point
X   *	since the game is over by now. If nethack ever restarts,
X***************
X*** 83,109 ****
X  char	*fileName, *rdmode;
X  {
X  	term_info *t;
X- 	SFReply	reply;
X  	FILE	*fp;
X  		
X  	t = (term_info *)GetWRefCon(HackWindow);
X- 	if (t->auxFileVRefNum) {
X- 		SetVol(0L,t->auxFileVRefNum);
X- 	} else
X- 		SetVol(0L, t->recordVRefNum);
X  
X! 	reply.good = false;
X  	fp = fopen(fileName, rdmode);
X! 	if (!fp && findNamedFile(fileName,2,&reply)) {
X! 		if (reply.good) {
X! 			t->auxFileVRefNum = reply.vRefNum;
X  		}
X! 	}
X! 	if (!fp)
X  		fp = fopen(fileName, rdmode);
X! 	else if (!t->auxFileVRefNum && reply.good) {
X! 		(void)GetVol((StringPtr)&reply.fName,&t->auxFileVRefNum);
X  	}
X  	return fp;
X  }
X  #endif
X--- 79,117 ----
X  char	*fileName, *rdmode;
X  {
X  	term_info *t;
X  	FILE	*fp;
X  		
X  	t = (term_info *)GetWRefCon(HackWindow);
X  
X! 	SetVol(0L, t->recordVRefNum);
X  	fp = fopen(fileName, rdmode);
X! 	if (!fp) {		
X! 		SFReply	reply;
X! 
X! 		if (t->auxFileVRefNum) {
X! 			SetVol(0L,t->auxFileVRefNum);
X  		}
X! 		
X! 		reply.good = false;
X  		fp = fopen(fileName, rdmode);
X! 		if (!fp && findNamedFile(fileName,2,&reply)) {
X! 			if (reply.good) {
X! 				t->auxFileVRefNum = reply.vRefNum;
X! 			}
X! 		}
X! 		
X! 		if (!fp)
X! 			fp = fopen(fileName, rdmode);
X! 		else if (!t->auxFileVRefNum && reply.good) {
X! 			(void)GetVol((StringPtr)&reply.fName,&t->auxFileVRefNum);
X! 		}
X! 
X! 		SetPort(HackWindow);
X! 		if ((macflags & fDoUpdate) && !reply.good)
X! 			docrt();
X! 
X  	}
X+ 
X  	return fp;
X  }
X  #endif
X*** mac/Old/macinit.c	Mon Feb 19 21:23:16 1990
X--- mac/macinit.c	Fri Feb 16 19:04:35 1990
X***************
X*** 7,20 ****
X  #include	"hack.h"
X  
X  #ifdef MACOS
X  
X  /* Global variables */
X  extern WindowPtr	HackWindow;	/* points to NetHack's window */
X  char	*keys[8];
X  short macflags;
X  typedef struct defaultData {
X  	long	defaultFlags;
X! 	long	fontSize;
X  	Str255	fontName;
X  } defaultData;
X  #define	fDFZoomWindow	0x02L
X--- 7,28 ----
X  #include	"hack.h"
X  
X  #ifdef MACOS
X+ # ifdef THINK_C
X+ #include	<MemoryMgr.h>
X+ # else
X+ #include	<Memory.h>
X+ #define ApplLimit 0x130         /* application limit [pointer]*/
X+ # endif
X  
X  /* Global variables */
X  extern WindowPtr	HackWindow;	/* points to NetHack's window */
X  char	*keys[8];
X  short macflags;
X+ Boolean	lowMem;
X+ long	lowMemLimit;
X  typedef struct defaultData {
X  	long	defaultFlags;
X! 	long	lowMemLimit;
X  	Str255	fontName;
X  } defaultData;
X  #define	fDFZoomWindow	0x02L
X***************
X*** 39,49 ****
X--- 47,71 ----
X  	term_info	*t;
X  	
X  	/* standard Mac initialization */
X+ #ifdef THINK_C
X+ 	SetApplLimit((Ptr)ApplLimit - 8192);	/* an extra 8K for stack */
X+ #else
X+ 	SetApplLimit(*(long *)ApplLimit - 8192);
X+ #endif	
X  	MaxApplZone();
X+ 	UnloadSeg(mprintf);
X+ 	for (i = 2; i<9; i++) {
X+ 		temp = GetResource('CODE', i);
X+ 		HUnlock(temp);
X+ 		MoveHHi(temp);
X+ 		HLock(temp);
X+ 	}
X+ 	
X  	MoreMasters();
X  	MoreMasters();
X  	MoreMasters();
X  	MoreMasters();
X+ 	lowMem = (FreeMem() < 700 *1024) ? TRUE : FALSE;
X  	InitGraf(&MAINGRAFPORT);
X  	
X  	InitFonts();
X***************
X*** 56,62 ****
X  	
X  	/* Application-specific startup code */
X  	theMenu = NewMenu(appleMenu, "\001\024");	/*  apple menu  */
X! 	AppendMenu(theMenu,"\030About NetHack 3.0g\311;(-");
X  	AddResMenu(theMenu, 'DRVR');
X  	InsertMenu(theMenu, 0);
X  	DisableItem(theMenu,0);
X--- 78,89 ----
X  	
X  	/* Application-specific startup code */
X  	theMenu = NewMenu(appleMenu, "\001\024");	/*  apple menu  */
X! 	{
X! 		char	tmp[256];
X! 		sprintf(&tmp[1],"About NetHack %s\311;(-", VERSION);
X! 		tmp[0] = (char)strlen(&tmp[1]);
X! 		AppendMenu(theMenu,tmp);
X! 	}
X  	AddResMenu(theMenu, 'DRVR');
X  	InsertMenu(theMenu, 0);
X  	DisableItem(theMenu,0);
X***************
X*** 93,99 ****
X  	macflags = (fToggleNumPad | fDoNonKeyEvt);
X  	
X  	/* Set font to monaco, user-defined font or to Hackfont if available */
X! 	size = 9;
X  	strcpy((char *)&font[0], "\006Monaco");
X  	
X  	temp = GetResource(HACK_DATA, DEFAULT_DATA);
X--- 120,130 ----
X  	macflags = (fToggleNumPad | fDoNonKeyEvt);
X  	
X  	/* Set font to monaco, user-defined font or to Hackfont if available */
X! 	if ((SCREEN_BITS.bounds.bottom - SCREEN_BITS.bounds.top) >400
X! 		&& (SCREEN_BITS.bounds.right - SCREEN_BITS.bounds.left) > 580)
X! 		size = 12;
X! 	else
X! 		size = 9;
X  	strcpy((char *)&font[0], "\006Monaco");
X  	
X  	temp = GetResource(HACK_DATA, DEFAULT_DATA);
X***************
X*** 100,106 ****
X  	if (temp) {
X  		HLock(temp);
X  		dD = (defaultData *)(*temp);
X! 		size = (short)dD->fontSize;
X  		strncpy((char *)&font[0], (char *)&dD->fontName[0],
X  					(short)dD->fontName[0] + 1);
X  		if (dD->defaultFlags & fDFZoomWindow)
X--- 131,137 ----
X  	if (temp) {
X  		HLock(temp);
X  		dD = (defaultData *)(*temp);
X! 		lowMemLimit = dD->lowMemLimit;
X  		strncpy((char *)&font[0], (char *)&dD->fontName[0],
X  					(short)dD->fontName[0] + 1);
X  		if (dD->defaultFlags & fDFZoomWindow)
X***************
X*** 171,176 ****
X--- 202,212 ----
X  		SysBeep(1);
X  	}
X  
X+ 	/* Some tweaking to allow for intl. ADB keyboard (unknown) */
X+ 	if (t->system.machineType > envMacPlus && !t->system.keyBoardType) {
X+ 		t->system.keyBoardType = envStandADBKbd;
X+ 	}
X+ 
X  #define	KEY_MAP	103
X  	temp = GetResource(HACK_DATA, KEY_MAP);
X  	if (temp) {
X***************
X*** 198,207 ****
X  
X  	/* give time for Multifinder to bring NetHack window to front */
X  	for(tempFont = 0; tempFont<10; tempFont++) {
X! 		(void)GetNextEvent(everyEvent,&theEvent);
X  	}
X  
X! 	HackWindow = NewWindow(0L, &boundsRect, "\015NetHack [MOV]",
X  			TRUE, noGrowDocProc, (WindowPtr)-1, FALSE, (long)t);
X  
X  	t->inColor = 0;
X--- 234,244 ----
X  
X  	/* give time for Multifinder to bring NetHack window to front */
X  	for(tempFont = 0; tempFont<10; tempFont++) {
X! 		SystemTask();
X! 		(void)GetNextEvent(nullEvent,&theEvent);
X  	}
X  
X! 	HackWindow = NewWindow(0L, &boundsRect, "\016NetHack [MOVE]",
X  			TRUE, noGrowDocProc, (WindowPtr)-1, FALSE, (long)t);
X  
X  	t->inColor = 0;
X***************
X*** 253,258 ****
X--- 290,299 ----
X  		panic("Can't get OBJECT resource data.");
X  	}
X  	
X+ 	for (i = 0; i<8; i++) {
X+ 		t->cursor[i] = GetCursor(100+i);
X+ 	}
X+ 	
X  	(void)aboutBox(0);	
X  	return 0;
X  }
X***************
X*** 325,328 ****
X--- 366,460 ----
X  	free((char *)level.monsters);
X  }
X  #endif /* SMALLDATA */
X+ 
X+ #define	OPTIONS			"Nethack prefs"
X+ 
X+ # ifdef AZTEC
X+ #undef OMASK
X+ #define OMASK	O_RDONLY
X+ # else
X+ #undef OMASK
X+ #define OMASK	(O_RDONLY | O_BINARY )
X+ # endif
X+ 
X+ int
X+ read_config_file()
X+ {
X+ 
X+ 	int optfd;
X+ 	optfd = 0;
X+ 	if ( (optfd = open(OPTIONS, OMASK)) > (int)NULL){
X+ 		read_opts(optfd);
X+ 		(void) close(optfd);
X+ 	}
X+ }
X+ 
X+ int
X+ write_opts()
X+ {
X+ 	int fd;
X+ 	short temp_flags;
X+ 
X+ 	if((fd = open(OPTIONS, O_WRONLY | O_BINARY)) <= 0) {
X+ 		OSErr	result;
X+ 		char	*tmp;
X+ 		
X+ 		tmp = CtoPstr(OPTIONS);
X+ 		result = Create((StringPtr)tmp, (short)0, CREATOR, AUXIL_TYPE);
X+ 	 	if (result == noErr)
X+ 	 		fd = open(OPTIONS, O_WRONLY | O_BINARY);
X+ 	 }
X+ 
X+ 	if (fd < 0)
X+ 		pline("can't create options file!");
X+ 	else {
X+ 		write(fd, &flags, sizeof(flags));
X+ 	
X+ 		write(fd, plname, PL_NSIZ);
X+ 	
X+ 		write(fd, dogname, 63);
X+ 	
X+ 		write(fd, catname, 63);
X+ 		
X+ 		temp_flags = (macflags & fZoomOnContextSwitch) ? 1 : 0;
X+ 		write(fd, &temp_flags, sizeof(short));
X+ 	
X+ #ifdef TUTTI_FRUTTI
X+ 		write(fd, pl_fruit, PL_FSIZ);
X+ #endif
X+ 		write(fd, inv_order, strlen(inv_order)+1);
X+ 		close(fd);
X+ 	}
X+ 	return 0;
X+ }
X+ 
X+ int
X+ read_opts(fd)
X+ int fd;
X+ {	char tmp_order[20];
X+ 	short	temp_flags;
X+ 	
X+ 	read(fd, (char *)&flags, sizeof(flags));
X+ 
X+ 	read(fd, plname, PL_NSIZ);
X+ 
X+ 	read(fd, dogname, 63);
X+ 	
X+ 	read(fd, catname, 63);
X+ 	
X+ 	read(fd, &temp_flags, sizeof(short));
X+ 	if (temp_flags & 0x01)
X+ 		macflags |= fZoomOnContextSwitch;
X+ 	else
X+ 		macflags &= ~fZoomOnContextSwitch;
X+ 
X+ #ifdef TUTTI_FRUTTI
X+ 	read(fd, pl_fruit, PL_FSIZ);
X+ #endif
X+ 	read(fd,tmp_order,strlen(inv_order)+1);
X+ 	if(strlen(tmp_order) == strlen(inv_order))
X+ 		strcpy(inv_order,tmp_order);
X+ 	return 0;
X+ }
X+ 
X  #endif /* MACOS */
X
END_OF_FILE
if test 56738 -ne `wc -c <'patch7.15'`; then
    echo shar: \"'patch7.15'\" unpacked with wrong size!
fi
# end of 'patch7.15'
echo shar: End of archive 5 \(of 30\).
cp /dev/null ark5isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 30 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0