OSDN Git Service

Initial Import
[nethackexpress/trunk.git] / sys / mac / maccurs.c
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
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
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
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
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
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
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
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
195 RetrieveWinPos(WindowPtr win, short *top, short *left)
196 {
197         return RetrievePosition(GetWinKind (win), top, left);
198 }
199
200
201 void
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
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 }