1 /*	SCCS Id: @(#)maccurs.c	3.1	93/01/24		  */
2 /* Copyright (c) Jon W{tte, 1992.				  */
3 /* NetHack may be freely redistributed.  See license for details. */
4 
5 #include "hack.h"
6 #include "mactty.h"
7 #include "macwin.h"
8 
9 #if !TARGET_API_MAC_CARBON
10 #include <Folders.h>
11 #include <TextUtils.h>
12 #include <Resources.h>
13 #endif
14 
15 
16 static Boolean winFileInit = 0;
17 static unsigned char winFileName [32] = "\pNetHack Preferences";
18 static long winFileDir;
19 static short winFileVol;
20 
21 typedef struct WinPosSave {
22 	char	validPos;
23 	char	validSize;
24 	short		top;
25 	short		left;
26 	short		height;
27 	short		width;
28 } WinPosSave;
29 
30 static WinPosSave savePos [kLastWindowKind + 1];
31 
32 
33 static void
InitWinFile(void)34 InitWinFile (void)
35 {
36 	StringHandle sh;
37 	long len;
38 	short ref = 0;
39 
40 	if (winFileInit) {
41 		return;
42 	}
43 /* We trust the glue. If there's an error, store in game dir. */
44 	if (FindFolder (kOnSystemDisk, kPreferencesFolderType, kCreateFolder ,
45 		&winFileVol, &winFileDir)) {
46 		winFileVol = 0;
47 		winFileDir = 0;
48 	}
49 	sh = GetString (128);
50 	if (sh && *sh) {
51 		BlockMove (*sh, winFileName, **sh + 1);
52 		ReleaseResource ((Handle) sh);
53 	}
54 	if (HOpen (winFileVol, winFileDir, winFileName, fsRdPerm, &ref)) {
55 		return;
56 	}
57 	len = sizeof (savePos);
58 	if (!FSRead (ref, &len, savePos)) {
59 		winFileInit = 1;
60 	}
61 	FSClose (ref);
62 }
63 
64 
65 static void
FlushWinFile(void)66 FlushWinFile (void)
67 {
68 	short ref;
69 	long len;
70 
71 	if (!winFileInit) {
72 		if (!winFileName [0]) {
73 			return;
74 		}
75 		HCreate (winFileVol, winFileDir, winFileName, MAC_CREATOR, PREF_TYPE);
76 		HCreateResFile (winFileVol, winFileDir, winFileName);
77 	}
78 	if (HOpen (winFileVol, winFileDir, winFileName, fsWrPerm, &ref)) {
79 		return;
80 	}
81 	winFileInit = 1;
82 	len = sizeof (savePos);
83 	(void) FSWrite (ref, &len, savePos); /* Don't care about error */
84 	FSClose (ref);
85 }
86 
87 Boolean
RetrievePosition(short kind,short * top,short * left)88 RetrievePosition (short kind, short *top, short *left) {
89 Point p;
90 
91 	if (kind < 0 || kind > kLastWindowKind) {
92 		dprintf ("Retrieve Bad kind %d", kind);
93 		return 0;
94 	}
95 	InitWinFile ();
96 	if (!savePos [kind].validPos) {
97 		dprintf ("Retrieve Not stored kind %d", kind);
98 		return 0;
99 	}
100 	p.v = savePos [kind].top;
101 	p.h = savePos [kind].left;
102 	*left = p.h;
103 	*top = p.v;
104 	dprintf ("Retrieve Kind %d Pt (%d,%d)", kind, p.h, p.v);
105 	return (PtInRgn (p, GetGrayRgn ()));
106 }
107 
108 
109 Boolean
RetrieveSize(short kind,short top,short left,short * height,short * width)110 RetrieveSize (short kind, short top, short left, short *height, short *width)
111 {
112 	Point p;
113 
114 	if (kind < 0 || kind > kLastWindowKind) {
115 		return 0;
116 	}
117 	InitWinFile ();
118 	if (!savePos [kind].validSize) {
119 		return 0;
120 	}
121 	*width = savePos [kind].width;
122 	*height = savePos [kind].height;
123 	p.h = left + *width;
124 	p.v = top + *height;
125 	return PtInRgn (p, GetGrayRgn ());
126 }
127 
128 
129 static void
SavePosition(short kind,short top,short left)130 SavePosition (short kind, short top, short left)
131 {
132 	if (kind < 0 || kind > kLastWindowKind) {
133 		dprintf ("Save bad kind %d", kind);
134 		return;
135 	}
136 	InitWinFile();
137 	savePos[kind].validPos = 1;
138 	savePos[kind].top = top;
139 	savePos[kind].left = left;
140 	dprintf("Save kind %d pt (%d,%d)", kind, left, top);
141 	FlushWinFile();
142 }
143 
144 
145 static void
SaveSize(short kind,short height,short width)146 SaveSize (short kind, short height, short width)
147 {
148 	if (kind < 0 || kind > kLastWindowKind) {
149 		dprintf ("Save bad kind %d", kind);
150 		return;
151 	}
152 	InitWinFile ();
153 	savePos [kind].validSize = 1;
154 	savePos [kind].width = width;
155 	savePos [kind].height = height;
156 	FlushWinFile ();
157 }
158 
159 
160 static short
GetWinKind(WindowPtr win)161 GetWinKind (WindowPtr win)
162 {
163 	short kind;
164 
165 	if (!CheckNhWin (win)) {
166 		return -1;
167 	}
168 	kind = GetWindowKind(win) - WIN_BASE_KIND;
169 	if (kind < 0 || kind > NHW_TEXT) {
170 		return -1;
171 	}
172 	dprintf ("In win kind %d (%lx)", kind, win);
173 	switch (kind) {
174 	case NHW_MAP :
175 	case NHW_STATUS :
176 	case NHW_BASE :
177 		kind = kMapWindow;
178 		break;
179 	case NHW_MESSAGE :
180 		kind = kMessageWindow;
181 		break;
182 	case NHW_MENU :
183 		kind = kMenuWindow;
184 		break;
185 	default :
186 		kind = kTextWindow;
187 		break;
188 	}
189 	dprintf ("Out kind %d", kind);
190 	return kind;
191 }
192 
193 
194 Boolean
RetrieveWinPos(WindowPtr win,short * top,short * left)195 RetrieveWinPos(WindowPtr win, short *top, short *left)
196 {
197 	return RetrievePosition(GetWinKind (win), top, left);
198 }
199 
200 
201 void
SaveWindowPos(WindowPtr win)202 SaveWindowPos(WindowPtr win)
203 {
204 	Rect r;
205 
206 
207 	GetWindowBounds(win, kWindowContentRgn, &r);
208 	SavePosition(GetWinKind(win), r.top, r.left);
209 }
210 
211 
212 void
SaveWindowSize(WindowPtr win)213 SaveWindowSize(WindowPtr win)
214 {
215 	short width, height;
216 	Rect r;
217 
218 
219 	GetWindowBounds(win, kWindowContentRgn, &r);
220 	width = r.right - r.left;
221 	height = r.bottom - r.top;
222 	SaveSize(GetWinKind (win), height, width);
223 }
224