1 |
edhill |
1.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 |
|
|
} |