1 |
/* macninit.c -- general mac nifty application library initialization |
2 |
*/ |
3 |
/* (C) Copyright 1995 by Carnegie Mellon University |
4 |
* All Rights Reserved. |
5 |
* |
6 |
* Permission to use, copy, modify, distribute, and sell this software |
7 |
* and its documentation for any purpose is hereby granted without |
8 |
* fee, provided that the above copyright notice appear in all copies |
9 |
* and that both that copyright notice and this permission notice |
10 |
* appear in supporting documentation, and that the name of Carnegie |
11 |
* Mellon University not be used in advertising or publicity |
12 |
* pertaining to distribution of the software without specific, |
13 |
* written prior permission. Carnegie Mellon University makes no |
14 |
* representations about the suitability of this software for any |
15 |
* purpose. It is provided "as is" without express or implied |
16 |
* warranty. |
17 |
* |
18 |
* CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO |
19 |
* THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY |
20 |
* AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE |
21 |
* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
22 |
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN |
23 |
* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING |
24 |
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS |
25 |
* SOFTWARE. |
26 |
*/ |
27 |
/* (C) Copyright 1990-1994 by Christopher J. Newman |
28 |
* All Rights Reserved. |
29 |
* |
30 |
* Permission to use, copy, modify, distribute, and sell this software and its |
31 |
* documentation for any purpose is hereby granted without fee, provided that |
32 |
* the above copyright notice appear in all copies and that both that |
33 |
* copyright notice and this permission notice appear in supporting |
34 |
* documentation, and that the name of Christopher J. Newman not be used in |
35 |
* advertising or publicity pertaining to distribution of the software without |
36 |
* specific, written prior permission. Christopher J. Newman makes no |
37 |
* representations about the suitability of this software for any purpose. It |
38 |
* is provided "as is" without express or implied warranty. |
39 |
* |
40 |
* CHRISTOPHER J. NEWMAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, |
41 |
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT |
42 |
* SHALL CHRISTOPHER J. NEWMAN BE LIABLE FOR ANY SPECIAL, INDIRECT OR |
43 |
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, |
44 |
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER |
45 |
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE |
46 |
* OF THIS SOFTWARE. |
47 |
* |
48 |
* Author: Christopher J. Newman |
49 |
* Message: This is a nifty program. |
50 |
*/ |
51 |
|
52 |
#ifndef THINK_C |
53 |
#include <Fonts.h> |
54 |
#include <SegLoad.h> |
55 |
#include <OSEvents.h> |
56 |
|
57 |
extern void _DataInit(); /* MPW initialize routine */ |
58 |
#endif |
59 |
#include <string.h> |
60 |
#include <Traps.h> |
61 |
#include <AppleEvents.h> |
62 |
#include <GestaltEqu.h> |
63 |
#include <Balloons.h> |
64 |
#include "macnapp.h" |
65 |
|
66 |
extern pascal OSErr NArequiredAE(AppleEvent *, AppleEvent *, long); |
67 |
|
68 |
#ifndef _Unimplemented |
69 |
#define _Unimplemented 0xA89F |
70 |
#endif |
71 |
#ifndef _WaitNextEvent |
72 |
#define _WaitNextEvent 0xA860 |
73 |
#endif |
74 |
#ifndef _Gestalt |
75 |
#define _Gestalt 0xA1AD |
76 |
#endif |
77 |
|
78 |
/* global to hold the application heap zone */ |
79 |
extern THz NAappzone; |
80 |
|
81 |
static Boolean TrapAvailable(short); |
82 |
|
83 |
/* this checks if a given trap is available on the system |
84 |
*/ |
85 |
static Boolean TrapAvailable(short tNumber) |
86 |
{ |
87 |
short numtraps = 0x400; |
88 |
TrapType tType; |
89 |
|
90 |
tType = tNumber & 0x800 ? ToolTrap : OSTrap; |
91 |
if (tType == ToolTrap) { |
92 |
if (NGetTrapAddress(_InitGraf, ToolTrap) |
93 |
== NGetTrapAddress(0xAA6E, ToolTrap)) { |
94 |
numtraps = 0x200; |
95 |
} |
96 |
tNumber = tNumber & 0x07FF; |
97 |
if (tNumber >= numtraps) |
98 |
tNumber = _Unimplemented; |
99 |
} |
100 |
|
101 |
return (NGetTrapAddress(tNumber, tType) |
102 |
!= NGetTrapAddress(_Unimplemented, ToolTrap)); |
103 |
} |
104 |
|
105 |
/* initialize the Macintosh managers and niftyapp internal variables. |
106 |
* call this first. |
107 |
*/ |
108 |
short NAinit(short minK, short masters, na_openp openp, na_menup menup, |
109 |
short nummenu, short numapple, short newitem, short closeitem) |
110 |
{ |
111 |
long total, contig, response, procid; |
112 |
EventRecord event; |
113 |
short count; |
114 |
Handle menuBar; |
115 |
short message, i, aeflag = 0; |
116 |
AppFile afile; |
117 |
FSSpec fspec; |
118 |
Str255 str; |
119 |
MenuHandle mh, helpmh; |
120 |
CInfoPBRec catinfo; |
121 |
|
122 |
#ifndef THINK_C |
123 |
UnloadSeg((Ptr) _DataInit); /* unload MPW init routine */ |
124 |
#endif |
125 |
MaxApplZone(); /* expand heap so code loads at top */ |
126 |
|
127 |
/* initialize all the managers */ |
128 |
InitGraf((Ptr) &QD(thePort)); |
129 |
InitFonts(); |
130 |
InitWindows(); |
131 |
InitMenus(); |
132 |
TEInit(); |
133 |
InitDialogs(NULL); |
134 |
InitCursor(); |
135 |
|
136 |
/* allocate enough master pointers */ |
137 |
for (count = 1; count <= masters; count++) { |
138 |
MoreMasters(); |
139 |
if (MemError() != noErr) return (-1); |
140 |
} |
141 |
|
142 |
/* hack to bring to front in MultiFinder */ |
143 |
for (count = 1; count <= 3; count++) EventAvail(everyEvent, &event); |
144 |
|
145 |
/* get the system environment */ |
146 |
(void) SysEnvirons(1, &NAsysenv); |
147 |
|
148 |
/* verify we have 128K ROMS, WaitNextEvent is available, and we have enough memory */ |
149 |
if (NAsysenv.machineType < 0 |
150 |
|| !TrapAvailable(_WaitNextEvent) |
151 |
|| (long) GetApplLimit() - (long) ApplicZone() < minK) { |
152 |
return (-1); |
153 |
} |
154 |
|
155 |
/* check for some Gestalt things and set up Apple Event Handler |
156 |
* We assume that the Gestalt compatibility glue is used |
157 |
*/ |
158 |
NAgestaltBits = 0; |
159 |
if (Gestalt(gestaltAppleEventsAttr, &response) == noErr) { |
160 |
NAgestaltBits |= NA_HASAEVENTS; |
161 |
if (AEInstallEventHandler(kCoreEventClass, typeWildCard, |
162 |
NArequiredAE, (long) openp, FALSE) == noErr) { |
163 |
aeflag = 1; |
164 |
} |
165 |
} |
166 |
if (Gestalt(gestaltFSAttr, &response) == noErr |
167 |
&& (response & gestaltHasFSSpecCalls)) { |
168 |
NAgestaltBits |= NA_HASFSSPEC; |
169 |
} |
170 |
if (Gestalt(gestaltStandardFileAttr, &response) == noErr) { |
171 |
NAgestaltBits |= NA_HASSTDFILE; |
172 |
} |
173 |
|
174 |
/* clean up and check available free memory */ |
175 |
PurgeSpace(&total, &contig); |
176 |
if (total < minK) return (-1); |
177 |
|
178 |
/* store our application heap zone */ |
179 |
NAappzone = ApplicZone(); |
180 |
|
181 |
/* if the user wants automatic menu handling, do it now */ |
182 |
NAmenus = NULL; |
183 |
if (menup != (na_menup) NULL) { |
184 |
NAmenus = (MenuHandle **) NewHandle(sizeof (MenuHandle) * (nummenu + 1)); |
185 |
if (NAmenus == (MenuHandle **) NULL) return (-1); |
186 |
HLock((Handle) NAmenus); |
187 |
for (i = 0; i < nummenu; ++i) { |
188 |
InsertMenu((*NAmenus)[i] = GetMenu(mApple + i), 0); |
189 |
} |
190 |
(*NAmenus)[i] = NULL; |
191 |
HUnlock((Handle) NAmenus); |
192 |
mh = **NAmenus; /* Apple menu */ |
193 |
*str = 0; |
194 |
GetIndString(str, NA_HELPSTR, 1); |
195 |
if (*str) { |
196 |
if (Gestalt(gestaltHelpMgrAttr, &response) != noErr |
197 |
|| HMGetHelpMenuHandle(&helpmh) != noErr) { |
198 |
helpmh = mh; |
199 |
} else { |
200 |
NAhelpcount = CountMItems(helpmh); |
201 |
} |
202 |
for (i = 2; *str; ++i) { |
203 |
++NAhelpitems; |
204 |
AppendMenu(helpmh, str); |
205 |
GetIndString(str, NA_HELPSTR, i); |
206 |
} |
207 |
} |
208 |
AppendMenu(mh, "\p-"); |
209 |
AddResMenu(mh, 'DRVR'); |
210 |
DrawMenuBar(); |
211 |
NAcloseitem = closeitem; |
212 |
NAnewitem = newitem; |
213 |
NAappleitems = numapple; |
214 |
if (nummenu > 2) NAhasedit = true; |
215 |
NAmenup = menup; |
216 |
} |
217 |
|
218 |
/* create full & empty regions */ |
219 |
NAfullRgn = NewRgn(); |
220 |
NAnullRgn = NewRgn(); |
221 |
if (!NAfullRgn || !NAnullRgn) return (-1); |
222 |
SetRectRgn(NAfullRgn, -32767, -32767, 32767, 32767); |
223 |
|
224 |
/* save ibeam cursor */ |
225 |
NAibeam = **GetCursor(iBeamCursor); |
226 |
|
227 |
/* handle startup files (prior to system 7) */ |
228 |
if (!aeflag) { |
229 |
count = 0; |
230 |
if (openp != (na_openp) NULL) { |
231 |
CountAppFiles(&message, &count); |
232 |
if (count) { |
233 |
for (i = 1; i <= count; i++) { |
234 |
GetAppFiles(i, &afile); |
235 |
procid = 0; |
236 |
catinfo.hFileInfo.ioNamePtr = (StringPtr) &afile.fName; |
237 |
catinfo.hFileInfo.ioVRefNum = afile.vRefNum; |
238 |
catinfo.hFileInfo.ioFDirIndex = 0; |
239 |
catinfo.hFileInfo.ioDirID = 0; |
240 |
GetWDInfo(afile.vRefNum, &catinfo.hFileInfo.ioVRefNum, |
241 |
&catinfo.hFileInfo.ioDirID, &procid); |
242 |
if (PBGetCatInfoSync(&catinfo) == noErr) { |
243 |
fspec.vRefNum = catinfo.hFileInfo.ioVRefNum; |
244 |
fspec.parID = catinfo.hFileInfo.ioFlParID; |
245 |
memcpy(fspec.name, afile.fName, *afile.fName + 1); |
246 |
if ((*openp)(message, &fspec, &catinfo.hFileInfo.ioFlFndrInfo) < 0) { |
247 |
break; |
248 |
} |
249 |
} |
250 |
} |
251 |
ClrAppFiles(count); |
252 |
if (message == appPrint |
253 |
&& NAcloseWindows(NAhead, NA_REQCLOSEALL) == NA_ALLCLOSED) { |
254 |
return (1); |
255 |
} |
256 |
} |
257 |
} |
258 |
if (newitem && !count && menup != (na_menup) NULL) { |
259 |
(*menup)(NULL, mFile, newitem); |
260 |
} |
261 |
} |
262 |
|
263 |
return (0); |
264 |
} |