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