1 /*
2 Copyright notice:
3 
4 This is mine.  I'm only letting you use it.  Period.  Feel free to rip off
5 any of the code you see fit, but have the courtesy to give me credit.
6 Otherwise great hairy beasties will rip your eyes out and eat your flesh
7 when you least expect it.
8 
9 Jonny Goldman <jonathan@think.com>
10 
11 Wed May  8 1991
12 */
13 
14 /* main.c -- create our windows and initialize things. */
15 
16 #ifdef HAVE_CONFIG_H
17 #include <config.h>
18 #endif
19 
20 #define MAIN
21 #include "vaders.h"
22 #include <X11/Xaw/Form.h>
23 #ifndef X11R3
24 #include <X11/Xaw/Label.h>
25 #else
26 #include <X11/IntrinsicP.h>
27 #include <X11/Label.h>
28 #endif
29 
30 #ifdef XFILESEARCHPATH
31 static void AddPathToSearchPath();
32 #endif
33 
34 #include <locale.h>
35 
36 static XrmOptionDescRec table[] = {
37     {"-debug",	"*debug",	XrmoptionNoArg,	NULL},
38 };
39 
40 static XtResource resources[] = {
41     {XtNwidth, XtCWidth, XtRInt, sizeof(int),
42 	 XtOffsetOf(AppData, width), XtRImmediate, (caddr_t) VWIDTH},
43     {XtNheight, XtCHeight, XtRInt, sizeof(int),
44 	 XtOffsetOf(AppData, height), XtRImmediate, (caddr_t) VHEIGHT},
45     {"debug", "Debug", XtRBoolean, sizeof(Boolean),
46 	 XtOffsetOf(AppData, debug), XtRString, "off"},
47     {"font", "Font", XtRString, sizeof(String),
48 	 XtOffsetOf(AppData, vaderfont), XtRString, (String)"9x15"},
49     {"scale", "Scale", XtRInt, sizeof(int),
50 	 XtOffsetOf(AppData, scale), XtRImmediate, (caddr_t) 2},
51     {"basewait", "BaseWait", XtRInt, sizeof(int),
52 	 XtOffsetOf(AppData, basewait), XtRImmediate, (caddr_t) 10},
53     {"vaderwait", "VaderWait", XtRInt, sizeof(int),
54 	 XtOffsetOf(AppData, vaderwait), XtRImmediate, (caddr_t) 300},
55     {"spacerwait", "SpacerWait", XtRInt, sizeof(int),
56 	 XtOffsetOf(AppData, spacerwait), XtRImmediate, (caddr_t) 50},
57     {"shotwait", "ShotWait", XtRInt, sizeof(int),
58 	 XtOffsetOf(AppData, shotwait), XtRImmediate, (caddr_t) 10},
59     {"vshotwait", "VshotWait", XtRInt, sizeof(int),
60 	 XtOffsetOf(AppData, vshotwait), XtRImmediate, (caddr_t) 30},
61     {"basecolor", "BaseColor", XtRPixel, sizeof(Pixel),
62 	 XtOffsetOf(AppData, basepixel), XtRString, "cyan"},
63     {"spacercolor", "SpacerColor", XtRPixel, sizeof(Pixel),
64 	 XtOffsetOf(AppData, spacerpixel), XtRString, "gray"},
65     {"buildingcolor", "BuildingColor", XtRPixel, sizeof(Pixel),
66 	 XtOffsetOf(AppData, buildingpixel), XtRString, "yellow"},
67     {"vader1color", "Vader1Color", XtRPixel, sizeof(Pixel),
68 	 XtOffsetOf(AppData, vader1pixel), XtRString, "blue"},
69     {"vader2color", "Vader2Color", XtRPixel, sizeof(Pixel),
70 	 XtOffsetOf(AppData, vader2pixel), XtRString, "green"},
71     {"vader3color", "Vader3Color", XtRPixel, sizeof(Pixel),
72 	 XtOffsetOf(AppData, vader3pixel), XtRString, "red"},
73     {"shotcolor", "ShotColor", XtRPixel, sizeof(Pixel),
74 	 XtOffsetOf(AppData, shotpixel), XtRString, "lavender"},
75     {"vshotcolor", "VshotColor", XtRPixel, sizeof(Pixel),
76 	 XtOffsetOf(AppData, vshotpixel), XtRString, "orange"},
77     {"scorecolor", "ScoreColor", XtRPixel, sizeof(Pixel),
78 	 XtOffsetOf(AppData, scorepixel), XtRString, "white"},
79     {"maxshots", "MaxShots", XtRInt, sizeof(int),
80 	 XtOffsetOf(AppData, maxshots), XtRImmediate, (caddr_t) 1},
81     {"maxvshots", "MaxVshots", XtRInt, sizeof(int),
82 	 XtOffsetOf(AppData, maxvshots), XtRImmediate, (caddr_t) 6},
83     {"defaultfore", "DefaultFore", XtRPixel, sizeof(Pixel),
84 	 XtOffsetOf(AppData, defaultfore), XtRString, "white"},
85     {"defaultback", "DefaultBack", XtRPixel, sizeof(Pixel),
86 	 XtOffsetOf(AppData, defaultback), XtRString, "black"},
87 };
88 
89 
90 /*ARGSUSED*/
CvtStringToFloat(args,num_args,fromVal,toVal)91 static void CvtStringToFloat(args, num_args, fromVal, toVal)
92 ArgList args;
93 Cardinal num_args;
94 XrmValue    *fromVal;
95 XrmValue    *toVal;
96 {
97     static float  i;
98 
99     if (sscanf((char *)fromVal->addr, "%f", &i) == 1) {
100 	toVal->size = sizeof(float);
101 	toVal->addr = (caddr_t) &i;
102     } else {
103 	toVal->size = 0;
104 	toVal->addr = NULL;
105     }
106 }
107 
AddResource(r,p)108 static void AddResource(r, p)
109 char *r;
110 Pixel *p;
111 {
112     XrmValue value;
113     XrmDatabase db = XtDatabase(dpy);
114     value.size = sizeof(Pixel);
115     value.addr = (caddr_t) p;
116     XrmPutResource(&db, r, XtRPixel, &value);
117 }
118 
119 Widget
MakeCommandButton(box,name,function,vlink,hlink,data)120 MakeCommandButton(box, name, function, vlink, hlink, data)
121 Widget box, vlink, hlink;
122 char *name;
123 XtCallbackProc function;
124 caddr_t data;
125 {
126   Widget w;
127   Arg args[10];
128   Cardinal numargs;
129 
130   numargs = 0;
131   if(vlink != NULL) {
132     XtSetArg(args[numargs], XtNfromVert, vlink); numargs++;
133   }
134   if(hlink != NULL) {
135     XtSetArg(args[numargs], XtNfromHoriz, hlink); numargs++;
136   }
137   w = XtCreateManagedWidget(name, commandWidgetClass, box, args, numargs);
138   if (function != NULL)
139     XtAddCallback(w, XtNcallback, function, data);
140   return w;
141 }
142 
main(int argc,char ** argv)143 int main(int argc, char **argv)
144 {
145   static Arg args[10];
146   int n;
147   Widget form, button;
148   /* extern WidgetClass labelwidgetclass; */
149 
150   setlocale(LC_ALL, "");
151   textdomain(PACKAGE);
152 
153   me_image = NULL;
154 
155   srandom(time(0));
156 #ifdef XFILESEARCHPATH
157   AddPathToSearchPath(XFILESEARCHPATH);
158 #endif
159   toplevel = XtInitialize(argv[0], "Vaders", table, XtNumber(table),
160 			  &argc, argv);
161   dpy = XtDisplay(toplevel);
162   XtAddConverter(XtRString, XtRFloat, CvtStringToFloat, NULL, 0);
163   XtGetApplicationResources(toplevel, (caddr_t) &app_data,
164 			    resources, XtNumber(resources),
165 			    NULL, (Cardinal) 0);
166   AddResource("*background", &app_data.defaultback);
167   if (DisplayCells(dpy, DefaultScreen(dpy)) <= 2)
168     {
169       app_data.basepixel = app_data.defaultfore;
170       app_data.buildingpixel = app_data.defaultfore;
171       app_data.vader1pixel = app_data.defaultfore;
172       app_data.vader2pixel = app_data.defaultfore;
173       app_data.vader3pixel = app_data.defaultfore;
174       app_data.shotpixel = app_data.defaultfore;
175       app_data.vshotpixel = app_data.defaultfore;
176       app_data.scorepixel = app_data.defaultfore;
177     }
178   if (app_data.scale<1) app_data.scale = 1;
179   if (app_data.scale>2) app_data.scale = 2;
180   app_data.width = app_data.scale*VWIDTH;
181   app_data.height = app_data.scale*VHEIGHT;
182 
183   form = XtCreateManagedWidget ("form", formWidgetClass,
184 				toplevel, NULL, 0);
185 
186   n = 0;
187   XtSetArg (args[n], XtNleft, XtChainLeft); n++;
188   XtSetArg (args[n], XtNright, XtChainLeft); n++;
189   XtSetArg (args[n], XtNtop, XtChainTop); n++;
190   XtSetArg (args[n], XtNbottom, XtChainTop); n++;
191   XtSetArg (args[n], XtNwidth, app_data.width); n++;
192   XtSetArg (args[n], XtNheight, app_data.height); n++;
193 
194   gamewidget = (VadersWidget)
195     XtCreateManagedWidget("field", vadersWidgetClass, form, args, n);
196 
197   XtSetKeyboardFocus (form, (Widget) gamewidget);
198 
199   n = 0;
200   XtSetArg (args[n], XtNleft, XtChainLeft); n++;
201   XtSetArg (args[n], XtNright, XtChainLeft); n++;
202   XtSetArg (args[n], XtNtop, XtChainTop); n++;
203   XtSetArg (args[n], XtNbottom, XtChainTop); n++;
204   XtSetArg (args[n], XtNfromHoriz, gamewidget); n++;
205   XtSetArg (args[n], XtNhorizDistance, 5); n++;
206   XtSetArg (args[n], XtNwidth, app_data.scale*IWIDTH); n++;
207   XtSetArg (args[n], XtNheight, app_data.height/2); n++;
208 
209   labelwidget = (VadersWidget)
210     XtCreateManagedWidget("label", vadersWidgetClass, form, args, n);
211 
212   pausebutton = MakeCommandButton(form, "pause", Pause, labelwidget, gamewidget, NULL);
213   XtSetArg(args[0], XtNlabel,_(" Start"));
214   XtSetArg(args[1], XtNforeground, app_data.defaultfore);
215   XtSetArg(args[2], XtNbackground, app_data.defaultback);
216   XtSetArg(args[3], XtNborderColor, app_data.defaultfore);
217   XtSetValues(pausebutton, args, 4);
218   button = MakeCommandButton(form, "quit", Quit, pausebutton, gamewidget, NULL);
219   XtSetArg(args[0], XtNlabel,_(" Quit "));
220   XtSetArg(args[1], XtNforeground, app_data.defaultfore);
221   XtSetArg(args[2], XtNbackground, app_data.defaultback);
222   XtSetArg(args[3], XtNborderColor, app_data.defaultfore);
223   XtSetValues(button, args, 4);
224   infobutton = MakeCommandButton(form, "info", ShowInfo, button, gamewidget, NULL);
225   XtSetArg(args[0], XtNlabel,_(" Info "));
226   XtSetArg(args[1], XtNforeground, app_data.defaultfore);
227   XtSetArg(args[2], XtNbackground, app_data.defaultback);
228   XtSetArg(args[3], XtNborderColor, app_data.defaultfore);
229   XtSetValues(infobutton, args, 4);
230 
231   XtRealizeWidget(toplevel);
232   ResetGame();
233   XtMainLoop();
234   return 0;
235 }
236 
237 #ifdef XFILESEARCHPATH
238 static void
AddPathToSearchPath(path)239 AddPathToSearchPath(path)
240 char *path;
241 {
242      char *old, *new;
243      extern char *getenv();
244 
245      old = getenv("XFILESEARCHPATH");
246      if (old) {
247 #if defined(mips) || defined(hpux) || defined(sun)
248 	  /* +1 for =, +2 for :, +3 for null */
249 	  new = XtMalloc((Cardinal) (strlen("XFILESEARCHPATH") +
250 				     strlen(old) +
251 				     strlen(path) + 3));
252 	  (void) strcpy(new, "XFILESEARCHPATH");
253 	  (void) strcat(new, "=");
254 	  (void) strcat(new, old);
255 	  (void) strcat(new, ":");
256 	  (void) strcat(new, path);
257 	  putenv(new);
258 #else
259 	  /* +1 for colon, +2 for null */
260 	  new = XtMalloc((Cardinal) (strlen(old) + strlen(path) + 2));
261 	  (void) strcpy(new, old);
262 	  (void) strcat(new, ":");
263 	  (void) strcat(new, path);
264 	  setenv("XFILESEARCHPATH", new, 1);
265 #endif
266      }
267      else {
268 #if defined(mips) || defined(hpux) || defined(sun)
269 	  new = XtMalloc((Cardinal) (strlen("XFILESEARCHPATH") +
270 				     strlen(path) + 2));
271 	  (void) strcpy(new, "XFILESEARCHPATH");
272 	  (void) strcat(new, "=");
273 	  (void) strcat(new, path);
274 	  putenv(new);
275 #else
276 	  setenv("XFILESEARCHPATH", path, 1);
277 #endif
278      }
279 }
280 #endif
281 
282 #ifdef sun
XShapeCombineMask()283 XShapeCombineMask()
284 {}
285 
XShapeQueryExtension()286 XShapeQueryExtension()
287 {}
288 #endif
289