1 /*
2  *  XScrabble - X version of the popular board game, for 1 to 4 players.
3  *
4  * This software comes with NO warranty whatsoever. I therefore take no
5  * responsibility for any damages, losses or problems caused through use
6  * or misuse of this program.
7  *
8  * I hereby grant permission for this program to be freely copied and
9  * distributed by any means, provided no charge is made for it.
10  *
11  * Matthew Chapman, csuoq@csv.warwick.ac.uk
12  *    Oct 1994.
13  */
14 
15 /* popup.c - functions for creating and managing the popups */
16 
17 #include "scrab.h"
18 #include "globals.h"
19 
20 extern char app_def_file[256];
21 
22 /*********************************
23  * Letter Scores and Frequencies *
24  *********************************/
25 
LettValuesPopdown(Widget w,XtPointer client_data,XtPointer call_data)26 void LettValuesPopdown(Widget w, XtPointer client_data, XtPointer call_data)
27 {
28 	int dnum;
29 
30 	for (dnum=0;lvdismiss[dnum]!=w; dnum++)
31 		;
32 	XtUnmapWidget(lvtop[dnum]);
33 
34 	XtVaSetValues(menu_item[dnum][LETTVAL],XtNleftBitmap,None,NULL);
35 	menu_status[dnum][LETTVAL]= !menu_status[dnum][LETTVAL];
36 }
37 
CreateLettValuesPopup(int dnum)38 void CreateLettValuesPopup(int dnum)
39 {
40 	Widget lvform,lvmain,lvtitle;
41         char lvlabel[1024], lvstr[1024], formatstr[80];
42         int i,d;
43 
44 	lvtop[dnum] = XtVaAppCreateShell("lvtop",app_def_file,
45 		applicationShellWidgetClass,dpy[dnum],XtNmappedWhenManaged,False,NULL);
46 	lvform = XtVaCreateManagedWidget("lvform",formWidgetClass,lvtop[dnum],
47 		NULL);
48 	lvtitle = XtVaCreateManagedWidget("lvtitle",labelWidgetClass,lvform,
49 		NULL);
50 	lvmain = XtVaCreateManagedWidget("lvmain",labelWidgetClass,lvform,NULL);
51 	strcpy(lvlabel,"\n");
52         strcat(lvlabel,PROMPT[LABLVMAIN]);
53         strcat(lvlabel,"\n\n");
54 
55         d=(NUMLETTERS+1)/2;
56         for (i=1 ; i<=d; i++)
57 	{
58            sprintf(lvstr,"   %c     %2d   %2d          %c     %2d   %2d   \n",
59               letterchar[i], letterscore[letterchar[i]], freq[letterchar[i]],
60               letterchar[i+d], letterscore[letterchar[i+d]], freq[letterchar[i+d]]);
61            strcat(lvlabel, lvstr);
62 	}
63 
64         sprintf(formatstr, "%s%d%s", "\n%s%", 26-strlen(PROMPT[LABJOKER]),
65                 "s%c     %2d   %2d\n\n");
66         sprintf(lvstr, formatstr, PROMPT[LABJOKER], "",
67             letterchar[0], letterscore[letterchar[0]],
68             freq[letterchar[0]]);
69         strcat(lvlabel,lvstr);
70 
71         XtVaSetValues(lvmain,XtNlabel,&lvlabel,NULL);
72 
73 	lvdismiss[dnum] = XtVaCreateManagedWidget("lvdismiss",commandWidgetClass,
74 		lvform,NULL);
75 	bg_pixmap(lvform);
76 	XtRealizeWidget(lvtop[dnum]);
77 	XtAddCallback(lvdismiss[dnum],XtNcallback,LettValuesPopdown,lvtop[dnum]);
78 }
79 
LettValuesPopup(int dnum)80 void LettValuesPopup(int dnum)
81 {
82 	if (menu_status[dnum][LETTVAL]==False)
83 		/* popup is already up */
84 		XtUnmapWidget(lvtop[dnum]);
85 	else
86 		XtMapWidget(lvtop[dnum]);
87 }
88 
89 
90 /*******************
91  * Rules Popup *
92  *******************/
93 
RulesPopdown(Widget w,XtPointer client_data,XtPointer call_data)94 void RulesPopdown(Widget w, XtPointer client_data, XtPointer call_data)
95 {
96 	int dnum;
97 
98 	for (dnum=0;rulesdismiss[dnum]!=w; dnum++) ;
99 	XtUnmapWidget(rulestop[dnum]);
100 
101 	XtVaSetValues(menu_item[dnum][RULES],XtNleftBitmap,None,NULL);
102 	menu_status[dnum][RULES]= !menu_status[dnum][RULES];
103 }
104 
CreateRulesPopup(int dnum)105 void CreateRulesPopup(int dnum)
106 {
107     Widget rulesform,rulestitle;
108 
109     rulestop[dnum] = XtVaAppCreateShell("rulesshell",app_def_file,
110 	applicationShellWidgetClass,dpy[dnum],XtNmappedWhenManaged,False,NULL);
111     rulesform = XtVaCreateManagedWidget("rulesform",formWidgetClass,
112 	rulestop[dnum],NULL);
113     rulestitle = XtVaCreateManagedWidget("rulestitle",labelWidgetClass,
114 						rulesform,NULL);
115     rulesmain[dnum] = XtVaCreateManagedWidget("rulesmain",asciiTextWidgetClass,
116                 rulesform,NULL);
117     rulesdismiss[dnum] = XtVaCreateManagedWidget("rulesdismiss",
118            commandWidgetClass, rulesform,NULL);
119     XtVaSetValues(rulesmain[dnum],
120            XtNscrollVertical, XawtextScrollWhenNeeded, NULL);
121 
122     bg_pixmap(rulesform);
123     bg_pixmap(rulestitle);
124     XtRealizeWidget(rulestop[dnum]);
125     XtAddCallback(rulesdismiss[dnum],XtNcallback,RulesPopdown,rulestop[dnum]);
126 }
127 
RulesPopup(int dnum)128 void RulesPopup(int dnum)
129 {
130     if (menu_status[dnum][RULES]==False)
131 	    XtUnmapWidget(rulestop[dnum]);
132     else
133       {
134       FILE *fr;
135       char linestr[255];
136       char *rules_str;
137       int  nlength = 10;
138 
139     	fr = fopen(app_data.rulesfile,"r");
140 	if (fr==NULL)
141 	{
142 		fprintf(stderr,"Couldn't open the game rules file %s\n",
143 			app_data.rulesfile);
144                 return;
145         }
146 
147         rules_str = malloc(8);
148         *rules_str = '\0';
149 
150 	while (!feof(fr))
151 	{
152 		fgets(linestr, 255, fr);
153                 nlength += strlen(linestr)*sizeof(char);
154                 rules_str = realloc(rules_str, nlength);
155                 strcat(rules_str, linestr);
156     	}
157 
158         fclose(fr);
159 
160         XtVaSetValues(rulesmain[dnum], XtNstring, rules_str, NULL);
161         free(rules_str);
162 	XtMapWidget(rulestop[dnum]);
163       }
164 }
165 
166 /*****************
167  * Showbag Popup *
168  *****************/
169 
ShowBagUpdate(Widget w,XtPointer client_data,XtPointer call_data)170 void ShowBagUpdate(Widget w, XtPointer client_data, XtPointer call_data)
171 {
172    char numletters[30];
173 
174    char listbag[256] = "\n", descr[12];
175    int i,j, dnum;
176 
177         for (dnum=0;showbagupdate[dnum]!=w; dnum++) ;
178 
179         for (i=0; i<27; i++) numletters[i] = 0;
180         for (i=0; i <= bagptr; i++)
181           {
182           j = bag[i] - 'A';
183           if (j<0) j = 26;
184           numletters[j]++;
185 	  }
186 
187         for (j=0; j <= 26; j++)
188  	   {
189 	   sprintf(descr, "  %c %2d  ", (j==26)? '*':('A'+j), numletters[j]);
190            if ((j+1)%7 == 0) strcat(descr, "\n\n");
191            strcat(listbag, descr);
192 	   }
193         sprintf(descr, "  = %d\n\n", bagptr+1);
194         strcat(listbag, descr);
195 
196         XtVaSetValues(showbagmain[dnum], XtNstring, listbag,
197                XtNscrollVertical, XawtextScrollWhenNeeded, NULL);
198 }
199 
ShowBagPopdown(Widget w,XtPointer client_data,XtPointer call_data)200 void ShowBagPopdown(Widget w, XtPointer client_data, XtPointer call_data)
201 {
202 	int dnum;
203 
204 	for (dnum=0;showbagdismiss[dnum]!=w; dnum++) ;
205 	XtUnmapWidget(showbagtop[dnum]);
206 
207 	XtVaSetValues(helpgame_item[dnum][BAG],XtNleftBitmap,None,NULL);
208 	helpgame_status[dnum][BAG]= !helpgame_status[dnum][BAG];
209 }
210 
CreateShowBagPopup(int dnum)211 void CreateShowBagPopup(int dnum)
212 {
213     Widget showbagform, showbagtitle;
214 
215     showbagtop[dnum] = XtVaAppCreateShell("showbagshell",app_def_file,
216 	applicationShellWidgetClass,dpy[dnum],XtNmappedWhenManaged,False,NULL);
217     showbagform = XtVaCreateManagedWidget("showbagform",formWidgetClass,
218 	showbagtop[dnum],NULL);
219     showbagtitle = XtVaCreateManagedWidget("showbagtitle",labelWidgetClass,
220 						showbagform,NULL);
221     showbagmain[dnum] = XtVaCreateManagedWidget("showbagmain",asciiTextWidgetClass,
222                 showbagform,NULL);
223     showbagupdate[dnum] = XtVaCreateManagedWidget("showbagupdate",
224            commandWidgetClass, showbagform,NULL);
225     showbagdismiss[dnum] = XtVaCreateManagedWidget("showbagdismiss",
226            commandWidgetClass, showbagform,NULL);
227 
228     bg_pixmap(showbagform);
229     bg_pixmap(showbagtitle);
230     XtRealizeWidget(showbagtop[dnum]);
231     XtAddCallback(showbagupdate[dnum],XtNcallback,
232            ShowBagUpdate,showbagtop[dnum]);
233     XtAddCallback(showbagdismiss[dnum],XtNcallback,
234            ShowBagPopdown,showbagtop[dnum]);
235 }
236 
ShowBagPopup(int dnum)237 void ShowBagPopup(int dnum)
238 {
239     if (helpgame_status[dnum][BAG]==False)
240 	    XtUnmapWidget(showbagtop[dnum]);
241     else
242       {
243       ShowBagUpdate(showbagupdate[dnum], NULL, NULL);
244       XtMapWidget(showbagtop[dnum]);
245       }
246 }
247 
248 /*******************
249  * Selectbag Popup *
250  *******************/
251 
SelectBagUpdate(Widget w,XtPointer client_data,XtPointer call_data)252 void SelectBagUpdate(Widget w, XtPointer client_data, XtPointer call_data)
253 {
254    char numletters[30];
255 
256    char listbag[256] = "\n", descr[12];
257    int i,j, dnum;
258 
259         for (dnum=0;selectbagupdate[dnum]!=w; dnum++) ;
260 
261         for (i=0; i<27; i++) numletters[i] = 0;
262         for (i=0; i <= bagptr; i++)
263           {
264           j = bag[i] - 'A';
265           if (j<0) j = 26;
266           numletters[j]++;
267 	  }
268 
269         for (j=0; j <= 26; j++)
270  	   {
271 	   sprintf(descr, "  %c %2d  ", (j==26)? '*':('A'+j), numletters[j]);
272            if ((j+1)%7 == 0) strcat(descr, "\n\n");
273            strcat(listbag, descr);
274 	   }
275         sprintf(descr, "  = %d\n\n", bagptr+1);
276         strcat(listbag, descr);
277 
278         XtVaSetValues(selectbagmain[dnum], XtNstring, listbag,
279                XtNscrollVertical, XawtextScrollWhenNeeded, NULL);
280 }
281 
SelectBagPopdown(Widget w,XtPointer client_data,XtPointer call_data)282 void SelectBagPopdown(Widget w, XtPointer client_data, XtPointer call_data)
283 {
284 	int dnum;
285 
286 	for (dnum=0;selectbagdismiss[dnum]!=w; dnum++) ;
287 	XtUnmapWidget(selectbagtop[dnum]);
288 
289 	XtVaSetValues(helpgame_item[dnum][MANUAL],XtNleftBitmap,None,NULL);
290 	helpgame_status[dnum][MANUAL]= !helpgame_status[dnum][MANUAL];
291 }
292 
CreateSelectBagPopup(int dnum)293 void CreateSelectBagPopup(int dnum)
294 {
295     Widget selectbagform, selectbagtitle;
296 
297     selectbagtop[dnum] = XtVaAppCreateShell("selectbagshell",app_def_file,
298 	applicationShellWidgetClass,dpy[dnum],XtNmappedWhenManaged,False,NULL);
299     selectbagform = XtVaCreateManagedWidget("selectbagform",formWidgetClass,
300 	selectbagtop[dnum],NULL);
301     selectbagtitle = XtVaCreateManagedWidget("selectbagtitle",labelWidgetClass,
302 						selectbagform,NULL);
303     selectbagmain[dnum] = XtVaCreateManagedWidget("selectbagmain",asciiTextWidgetClass,
304                 selectbagform,NULL);
305     selectbagupdate[dnum] = XtVaCreateManagedWidget("selectbagupdate",
306            commandWidgetClass, selectbagform,NULL);
307     selectbagdismiss[dnum] = XtVaCreateManagedWidget("selectbagdismiss",
308            commandWidgetClass, selectbagform,NULL);
309 
310     bg_pixmap(selectbagform);
311     bg_pixmap(selectbagtitle);
312     XtRealizeWidget(selectbagtop[dnum]);
313     XtAddCallback(selectbagupdate[dnum],XtNcallback,
314            SelectBagUpdate,selectbagtop[dnum]);
315     XtAddCallback(selectbagdismiss[dnum],XtNcallback,
316            SelectBagPopdown,selectbagtop[dnum]);
317 }
318 
SelectBagPopup(int dnum)319 void SelectBagPopup(int dnum)
320 {
321     if (helpgame_status[dnum][MANUAL]==False)
322 	    XtUnmapWidget(selectbagtop[dnum]);
323     else
324       {
325       SelectBagUpdate(selectbagupdate[dnum], NULL, NULL);
326       XtMapWidget(selectbagtop[dnum]);
327       }
328 }
329 
330 /*******************
331  * Checkword Popup *
332  *******************/
333 
CheckwordUpdate(Widget w,XtPointer client_data,XtPointer call_data)334 void CheckwordUpdate(Widget w, XtPointer client_data, XtPointer call_data)
335 {
336         int dnum, i;
337 	char *word;
338         char upword[256];
339 
340 	for (dnum=0;checkwordupdate[dnum]!=w; dnum++) ;
341 
342         XtVaGetValues(checkwordmain[dnum], XtNstring, &word, NULL);
343 
344         for(i=0; i<=strlen(word) && i<255; i++) upword[i] = toupper(word[i]);
345         upword[255] = '0';
346 
347         XtVaSetValues(checkwordresult[dnum], XtNlabel,
348            wordsearch(upword)? PROMPT[VALIDWORD] : PROMPT[INVALIDWORD], NULL);
349 }
350 
CheckwordReset(Widget w,XtPointer client_data,XtPointer call_data)351 void CheckwordReset(Widget w, XtPointer client_data, XtPointer call_data)
352 {
353         int dnum;
354 	char *word;
355         char newword[256];
356         int i, j = 0, ret = 0;
357         Widget source;
358 
359 	for (dnum=0; w != XawTextGetSource(checkwordmain[dnum]); dnum++) ;
360 
361         XtVaGetValues(checkwordmain[dnum], XtNstring, &word, NULL);
362 
363         for(i=0; i < strlen(word) ; i++)
364 	  {
365           if (word[i]!=' ' && word[i]!='\n' && word[i]!='\t' && word[i]!='\r')
366 	    {
367             newword[j] = word[i];
368             if (j<254) j++;
369 	    }
370           else
371             ret = 1;
372 	  }
373 
374         newword[j] = '\0';
375 
376         if (ret)
377            {
378 	   XtVaSetValues(checkwordmain[dnum], XtNstring, newword, NULL);
379            CheckwordUpdate(checkwordupdate[dnum], NULL, NULL);
380 	   }
381 }
382 
CheckwordPopdown(Widget w,XtPointer client_data,XtPointer call_data)383 void CheckwordPopdown(Widget w, XtPointer client_data, XtPointer call_data)
384 {
385 	int dnum;
386 
387 	for (dnum=0;checkworddismiss[dnum]!=w; dnum++) ;
388 	XtUnmapWidget(checkwordtop[dnum]);
389 
390 	XtVaSetValues(helpgame_item[dnum][CHECK],XtNleftBitmap,None,NULL);
391 	helpgame_status[dnum][CHECK]= !helpgame_status[dnum][CHECK];
392 }
393 
CreateCheckwordPopup(int dnum)394 void CreateCheckwordPopup(int dnum)
395 {
396     Widget checkwordform,checkwordtitle,
397            checkwordprompt,checkwordnote, checkwordsource;
398 
399     checkwordtop[dnum] = XtVaAppCreateShell("checkwordshell",app_def_file,
400 	applicationShellWidgetClass,dpy[dnum],XtNmappedWhenManaged,False,NULL);
401     checkwordform = XtVaCreateManagedWidget("checkwordform",formWidgetClass,
402 	checkwordtop[dnum],NULL);
403     checkwordtitle = XtVaCreateManagedWidget("checkwordtitle",labelWidgetClass,
404 						checkwordform,NULL);
405     checkwordprompt = XtVaCreateManagedWidget("checkwordprompt",labelWidgetClass,
406                 checkwordform,NULL);
407     checkwordmain[dnum] = XtVaCreateManagedWidget("checkwordmain",asciiTextWidgetClass,
408                 checkwordform,NULL);
409     checkwordnote = XtVaCreateManagedWidget("checkwordnote",labelWidgetClass,
410                 checkwordform,NULL);
411     checkwordresult[dnum] = XtVaCreateManagedWidget("checkwordresult",labelWidgetClass,
412                 checkwordform,NULL);
413     checkwordupdate[dnum] = XtVaCreateManagedWidget("checkwordupdate",
414            commandWidgetClass, checkwordform,NULL);
415     checkworddismiss[dnum] = XtVaCreateManagedWidget("checkworddismiss",
416            commandWidgetClass, checkwordform,NULL);
417 
418     XtVaSetValues(checkwordmain[dnum],
419         XtNeditType, XawtextEdit, NULL);
420 
421     bg_pixmap(checkwordform);
422     bg_pixmap(checkwordtitle);
423     bg_pixmap(checkwordprompt);
424     bg_pixmap(checkwordnote);
425     bg_pixmap(checkwordresult[dnum]);
426     XtRealizeWidget(checkwordtop[dnum]);
427     XtAddCallback(checkwordupdate[dnum],XtNcallback,
428            CheckwordUpdate,checkwordtop[dnum]);
429     XtAddCallback(checkworddismiss[dnum],XtNcallback,
430            CheckwordPopdown,checkwordtop[dnum]);
431     checkwordsource = XawTextGetSource (checkwordmain[dnum]);
432     XtAddCallback (checkwordsource, XtNcallback, CheckwordReset, (caddr_t) NULL);
433 }
434 
CheckwordPopup(int dnum)435 void CheckwordPopup(int dnum)
436 {
437     if (helpgame_status[dnum][CHECK]==False)
438 	    XtUnmapWidget(checkwordtop[dnum]);
439     else
440             {
441             XtVaSetValues(checkwordresult[dnum],XtNlabel,"", NULL);
442 	    XtMapWidget(checkwordtop[dnum]);
443             XtSetKeyboardFocus(checkwordtop[dnum],checkwordmain[dnum]);
444 	    }
445 }
446 
447 
448 /*******************
449  * Placeword Popup *
450  *******************/
451 
PlacewordUpdate(Widget w,XtPointer client_data,XtPointer call_data)452 void PlacewordUpdate(Widget w, XtPointer client_data, XtPointer call_data)
453 {
454 }
455 
PlacewordPopdown(Widget w,XtPointer client_data,XtPointer call_data)456 void PlacewordPopdown(Widget w, XtPointer client_data, XtPointer call_data)
457 {
458 	int dnum;
459 
460 	for (dnum=0;placeworddismiss[dnum]!=w; dnum++) ;
461 	XtUnmapWidget(placewordtop[dnum]);
462 
463 	XtVaSetValues(helpgame_item[dnum][PLACE],XtNleftBitmap,None,NULL);
464 	helpgame_status[dnum][PLACE]= !helpgame_status[dnum][PLACE];
465 }
466 
CreatePlacewordPopup(int dnum)467 void CreatePlacewordPopup(int dnum)
468 {
469     Widget placewordform,placewordmain,placewordtitle;
470 
471     placewordtop[dnum] = XtVaAppCreateShell("placewordshell",app_def_file,
472 	applicationShellWidgetClass,dpy[dnum],XtNmappedWhenManaged,False,NULL);
473     placewordform = XtVaCreateManagedWidget("placewordform",formWidgetClass,
474 	placewordtop[dnum],NULL);
475     placewordtitle = XtVaCreateManagedWidget("placewordtitle",labelWidgetClass,
476 						placewordform,NULL);
477     placewordmain = XtVaCreateManagedWidget("placewordmain",asciiTextWidgetClass,
478                 placewordform,NULL);
479     placewordupdate[dnum] = XtVaCreateManagedWidget("placewordupdate",
480            commandWidgetClass, placewordform,NULL);
481     placeworddismiss[dnum] = XtVaCreateManagedWidget("placeworddismiss",
482            commandWidgetClass, placewordform,NULL);
483 
484     XtVaSetValues(placewordmain, XtNscrollVertical, XawtextScrollWhenNeeded, NULL);
485 
486     bg_pixmap(placewordform);
487     bg_pixmap(placewordtitle);
488     XtRealizeWidget(placewordtop[dnum]);
489     XtAddCallback(placewordupdate[dnum],XtNcallback,
490            PlacewordUpdate,placewordtop[dnum]);
491     XtAddCallback(placeworddismiss[dnum],XtNcallback,
492            PlacewordPopdown,placewordtop[dnum]);
493 }
494 
PlacewordPopup(int dnum)495 void PlacewordPopup(int dnum)
496 {
497     if (helpgame_status[dnum][PLACE]==False)
498 	    XtUnmapWidget(placewordtop[dnum]);
499     else
500             {
501             PlacewordUpdate(placewordupdate[dnum], NULL, NULL);
502 	    XtMapWidget(placewordtop[dnum]);
503 	    }
504 }
505 
506 /******************
507  * Listword Popup *
508  ******************/
509 
ListwordUpdate(Widget w,XtPointer client_data,XtPointer call_data)510 void ListwordUpdate(Widget w, XtPointer client_data, XtPointer call_data)
511 {
512 }
513 
ListwordPopdown(Widget w,XtPointer client_data,XtPointer call_data)514 void ListwordPopdown(Widget w, XtPointer client_data, XtPointer call_data)
515 {
516 	int dnum;
517 
518 	for (dnum=0;listworddismiss[dnum]!=w; dnum++) ;
519 	XtUnmapWidget(listwordtop[dnum]);
520 
521 	XtVaSetValues(helpgame_item[dnum][LIST],XtNleftBitmap,None,NULL);
522 	helpgame_status[dnum][LIST]= !helpgame_status[dnum][LIST];
523 }
524 
CreateListwordPopup(int dnum)525 void CreateListwordPopup(int dnum)
526 {
527     Widget listwordform,listwordmain,listwordtitle;
528 
529     listwordtop[dnum] = XtVaAppCreateShell("listwordshell",app_def_file,
530 	applicationShellWidgetClass,dpy[dnum],XtNmappedWhenManaged,False,NULL);
531     listwordform = XtVaCreateManagedWidget("listwordform",formWidgetClass,
532 	listwordtop[dnum],NULL);
533     listwordtitle = XtVaCreateManagedWidget("listwordtitle",labelWidgetClass,
534 						listwordform,NULL);
535     listwordmain = XtVaCreateManagedWidget("listwordmain",asciiTextWidgetClass,
536                 listwordform,NULL);
537     listwordupdate[dnum] = XtVaCreateManagedWidget("listwordupdate",
538            commandWidgetClass, listwordform,NULL);
539     listworddismiss[dnum] = XtVaCreateManagedWidget("listworddismiss",
540            commandWidgetClass, listwordform,NULL);
541 
542     XtVaSetValues(listwordmain, XtNscrollVertical, XawtextScrollWhenNeeded, NULL);
543 
544     bg_pixmap(listwordform);
545     bg_pixmap(listwordtitle);
546     XtRealizeWidget(listwordtop[dnum]);
547     XtAddCallback(listwordupdate[dnum],XtNcallback,
548            ListwordUpdate,listwordtop[dnum]);
549     XtAddCallback(listworddismiss[dnum],XtNcallback,
550            ListwordPopdown,listwordtop[dnum]);
551 }
552 
ListwordPopup(int dnum)553 void ListwordPopup(int dnum)
554 {
555     if (helpgame_status[dnum][LIST]==False)
556 	    XtUnmapWidget(listwordtop[dnum]);
557     else
558             {
559             ListwordUpdate(listwordupdate[dnum], NULL, NULL);
560 	    XtMapWidget(listwordtop[dnum]);
561 	    }
562 }
563 
564 
565 /********************
566  * Suggestion Popup *
567  ********************/
568 
SuggestionUpdate(Widget w,XtPointer client_data,XtPointer call_data)569 void SuggestionUpdate(Widget w, XtPointer client_data, XtPointer call_data)
570 {
571 }
572 
SuggestionPopdown(Widget w,XtPointer client_data,XtPointer call_data)573 void SuggestionPopdown(Widget w, XtPointer client_data, XtPointer call_data)
574 {
575 	int dnum;
576 
577 	for (dnum=0;suggestiondismiss[dnum]!=w; dnum++) ;
578 	XtUnmapWidget(suggestiontop[dnum]);
579 
580 	XtVaSetValues(helpgame_item[dnum][SUGGESTION],XtNleftBitmap,None,NULL);
581 	helpgame_status[dnum][SUGGESTION]= !helpgame_status[dnum][SUGGESTION];
582 }
583 
CreateSuggestionPopup(int dnum)584 void CreateSuggestionPopup(int dnum)
585 {
586     Widget suggestionform,suggestionmain,suggestiontitle;
587 
588     suggestiontop[dnum] = XtVaAppCreateShell("suggestionshell",app_def_file,
589 	applicationShellWidgetClass,dpy[dnum],XtNmappedWhenManaged,False,NULL);
590     suggestionform = XtVaCreateManagedWidget("suggestionform",formWidgetClass,
591 	suggestiontop[dnum],NULL);
592     suggestiontitle = XtVaCreateManagedWidget("suggestiontitle",labelWidgetClass,
593 						suggestionform,NULL);
594     suggestionmain = XtVaCreateManagedWidget("suggestionmain",asciiTextWidgetClass,
595                 suggestionform,NULL);
596     suggestionupdate[dnum] = XtVaCreateManagedWidget("suggestionupdate",
597            commandWidgetClass, suggestionform,NULL);
598     suggestiondismiss[dnum] = XtVaCreateManagedWidget("suggestiondismiss",
599            commandWidgetClass, suggestionform,NULL);
600 
601     XtVaSetValues(suggestionmain, XtNscrollVertical, XawtextScrollWhenNeeded, NULL);
602 
603     bg_pixmap(suggestionform);
604     bg_pixmap(suggestiontitle);
605     XtRealizeWidget(suggestiontop[dnum]);
606     XtAddCallback(suggestionupdate[dnum],XtNcallback,
607            SuggestionUpdate,suggestiontop[dnum]);
608     XtAddCallback(suggestiondismiss[dnum],XtNcallback,
609            SuggestionPopdown,suggestiontop[dnum]);
610 }
611 
SuggestionPopup(int dnum)612 void SuggestionPopup(int dnum)
613 {
614     if (helpgame_status[dnum][SUGGESTION]==False)
615 	    XtUnmapWidget(suggestiontop[dnum]);
616     else
617             {
618             SuggestionUpdate(suggestionupdate[dnum], NULL, NULL);
619 	    XtMapWidget(suggestiontop[dnum]);
620 	    }
621 }
622 
623 /*******************
624  * Highscore Table *
625  *******************/
626 
HiScoresPopdown(Widget w,XtPointer client_data,XtPointer call_data)627 void HiScoresPopdown(Widget w, XtPointer client_data, XtPointer call_data)
628 {
629 	int dnum;
630 
631 	for (dnum=0;hi_dismiss[dnum]!=w; dnum++)
632 		;
633 	XtUnmapWidget(hi_scoretop[dnum]);
634 
635 	XtVaSetValues(menu_item[dnum][HISCORES],XtNleftBitmap,None,NULL);
636 	menu_status[dnum][HISCORES]= !menu_status[dnum][HISCORES];
637 }
638 
CreateHiScoresPopup(int dnum)639 void CreateHiScoresPopup(int dnum)
640 {
641     int j;
642     Widget hi_scoref,hi_scoretitle;
643     Widget subtitle[MAXPLAYERS];
644     char txt[512],wname[6];
645 
646     /* only create popup if not computer player */
647     /* if (type[dnum]==0) */
648     {
649 
650 	hi_scoretop[dnum] = XtVaAppCreateShell("hiscoreshell",app_def_file,
651 					       applicationShellWidgetClass,dpy[dnum],XtNmappedWhenManaged,False,NULL);
652 	hi_scoref = XtVaCreateManagedWidget("hiscoreform",formWidgetClass,
653 					    hi_scoretop[dnum],NULL);
654 	hi_scoretitle = XtVaCreateManagedWidget("hiscoretitle",labelWidgetClass,
655 						hi_scoref,NULL);
656 	loadscores();
657 	for (j=0; j<MAXPLAYERS; j++)
658 	{
659 	    showscores(j+1,txt);
660 	    sprintf(wname,"sub%d",j);
661 	    subtitle[j]=XtVaCreateManagedWidget(wname,labelWidgetClass,
662 						hi_scoref,NULL);
663 	    hi_score_ent[dnum][j]=XtVaCreateManagedWidget("hiscoreent",
664 							  labelWidgetClass,hi_scoref,XtNfromVert,subtitle[j],NULL);
665 	    XtVaSetValues(hi_score_ent[dnum][j], XtNlabel, txt, NULL);
666 	    if (j%2==1)
667 	    {
668 		XtVaSetValues(subtitle[j],XtNfromHoriz,hi_score_ent[dnum][j-1],NULL);
669 		XtVaSetValues(hi_score_ent[dnum][j],XtNfromHoriz,hi_score_ent[dnum][j-1],NULL);
670 	    }
671 	    if (j>1)
672 		XtVaSetValues(subtitle[j],XtNfromVert,hi_score_ent[dnum][j-2],
673 			      XtNvertDistance,10,NULL);
674 	    else
675 		XtVaSetValues(subtitle[j],XtNfromVert,hi_scoretitle,NULL);
676 	}
677 	hi_dismiss[dnum] = XtVaCreateManagedWidget("hidismiss",commandWidgetClass,
678 						   hi_scoref,NULL);
679 	bg_pixmap(hi_scoref);
680 	bg_pixmap(hi_scoretitle);
681 	XtRealizeWidget(hi_scoretop[dnum]);
682 	XtAddCallback(hi_dismiss[dnum],XtNcallback,HiScoresPopdown,hi_scoretop[dnum]);
683     }
684 }
685 
HiScoresPopup(int dnum)686 void HiScoresPopup(int dnum)
687 {
688     int j;
689     char txt[512];
690 
691     /* only if not computer */
692     /* if (type[dnum]==0) */
693     {
694 	if (menu_status[dnum][HISCORES]==False)
695 	    /* popup is already up */
696 	    XtUnmapWidget(hi_scoretop[dnum]);
697 	else
698 	{
699 	    loadscores();
700 	    for (j=0; j<MAXPLAYERS; j++)
701 	    {
702 		showscores(j+1,txt);
703 		XtVaSetValues(hi_score_ent[dnum][j], XtNlabel, txt, NULL);
704 	    }
705 	    XtMapWidget(hi_scoretop[dnum]);
706 	}
707     }
708 }
709 
710 /*******************
711  * Best plays list *
712  *******************/
713 
BestgoPopdown(Widget w,XtPointer client_data,XtPointer call_data)714 void BestgoPopdown(Widget w, XtPointer client_data, XtPointer call_data)
715 {
716 	int dnum;
717 
718 	for (dnum=0;bestgodismiss[dnum]!=w; dnum++)
719 		;
720 	XtUnmapWidget(bestgotop[dnum]);
721 
722 	XtVaSetValues(menu_item[dnum][BESTGOES],XtNleftBitmap,None,NULL);
723 	menu_status[dnum][BESTGOES]= !menu_status[dnum][BESTGOES];
724 }
725 
726 
CreateBestgoPopup(int dnum)727 void CreateBestgoPopup(int dnum)
728 {
729 	char txt[1000];
730 	Widget bestgoform,bestgotitle;
731 
732 	bestgotop[dnum] = XtVaAppCreateShell("bestgoshell",app_def_file,
733 		applicationShellWidgetClass,dpy[dnum],XtNmappedWhenManaged,False,NULL);
734 	bestgoform = XtVaCreateManagedWidget("bestgoform",formWidgetClass,
735 		bestgotop[dnum],NULL);
736 	bestgotitle = XtVaCreateManagedWidget("bestgotitle",labelWidgetClass,
737 		bestgoform,XtNborderWidth,0,NULL);
738 	bestgomain[dnum] = XtVaCreateManagedWidget("bestgomain",labelWidgetClass,
739 		bestgoform,XtNfromVert,bestgotitle,NULL);
740 
741 	showgoscores(txt);
742 	XtVaSetValues(bestgomain[dnum],XtNlabel,txt,NULL);
743 	bestgodismiss[dnum] = XtVaCreateManagedWidget("bestgodismiss",commandWidgetClass,
744 		bestgoform,XtNfromVert,bestgomain[dnum],NULL);
745 	bg_pixmap(bestgoform);
746 	bg_pixmap(bestgotitle);
747 	XtRealizeWidget(bestgotop[dnum]);
748 	XtAddCallback(bestgodismiss[dnum],XtNcallback,BestgoPopdown,bestgotop[dnum]);
749 }
750 
BestgoPopup(int dnum)751 void BestgoPopup(int dnum)
752 {
753 	if (menu_status[dnum][BESTGOES]==False)
754 		/* popup is already up */
755 		XtUnmapWidget(bestgotop[dnum]);
756 	else
757 	{
758 		char txt[1000];
759 		showgoscores(txt);
760 		XtVaSetValues(bestgomain[dnum],XtNlabel,txt,NULL);
761 		XtMapWidget(bestgotop[dnum]);
762 	}
763 }
764 
UpdateBestgo()765 void UpdateBestgo()
766 {
767 	int j;
768 
769 	for (j=0; j<num_players; j++)
770 		if (menu_status[j][BESTGOES]==True)
771 		{
772 			/* popup is up - update entry */
773 			char txt[1000];
774 			showgoscores(txt);
775 /*printf("updating for player %d\n",j);*/
776 			XtVaSetValues(bestgomain[j],XtNlabel,txt,NULL);
777 		}
778 }
779 
780 /*********
781  * About *
782  *********/
783 
AboutPopdown(Widget w,XtPointer client_data,XtPointer call_data)784 void AboutPopdown(Widget w, XtPointer client_data, XtPointer call_data)
785 {
786     	int dnum;
787 
788 	for (dnum=0;aboutdismiss[dnum]!=w; dnum++)
789 		;
790 	XtUnmapWidget(abouttop[dnum]);
791 
792 	XtVaSetValues(menu_item[dnum][ABOUT],XtNleftBitmap,None,NULL);
793 	menu_status[dnum][ABOUT]= !menu_status[dnum][ABOUT];
794 }
795 
CreateAboutPopup(int dnum)796 void CreateAboutPopup(int dnum)
797 {
798 	Widget aboutbox,abouttitle,abouttext;
799 
800 	abouttop[dnum] = XtVaAppCreateShell("abouttop",app_def_file,
801 		applicationShellWidgetClass,dpy[dnum],XtNmappedWhenManaged,
802 					    False,NULL);
803 
804 	aboutbox = XtVaCreateManagedWidget("aboutbox",formWidgetClass,
805 					   abouttop[dnum],NULL);
806 	abouttitle = XtVaCreateManagedWidget("abouttitle",
807 					     labelWidgetClass,aboutbox,
808 					     XtNborderWidth,0,
809 					     NULL);
810 
811 	abouttext = XtVaCreateManagedWidget("abouttext",labelWidgetClass,
812 					    aboutbox,XtNfromVert,abouttitle,
813 					    NULL);
814 
815 	aboutdismiss[dnum] = XtVaCreateManagedWidget("aboutdismiss",
816 				          commandWidgetClass,aboutbox,
817 					  XtNfromVert,abouttext,NULL);
818 	bg_pixmap(aboutbox);
819 	bg_pixmap(abouttitle);
820 
821 	XtRealizeWidget(abouttop[dnum]);
822 	XtAddCallback(aboutdismiss[dnum],XtNcallback,AboutPopdown,
823 		      abouttop[dnum]);
824 }
825 
AboutPopup(int dnum)826 void AboutPopup(int dnum)
827 {
828 	if (menu_status[dnum][ABOUT]==False)
829 		/* popup is already up */
830 		XtUnmapWidget(abouttop[dnum]);
831 	else
832 		XtMapWidget(abouttop[dnum]);
833 }
834 
835 
836 /***********
837  * The Key *
838  ***********/
839 
KeyPopdown(Widget w,XtPointer client_data,XtPointer call_data)840 void KeyPopdown(Widget w, XtPointer client_data, XtPointer call_data)
841 {
842 	int dnum;
843 
844 	for (dnum=0;keydismiss[dnum]!=w; dnum++)
845 		;
846 	XtUnmapWidget(keytop[dnum]);
847 
848 	XtVaSetValues(menu_item[dnum][KEY],XtNleftBitmap,None,NULL);
849 	menu_status[dnum][KEY]= !menu_status[dnum][KEY];
850 }
851 
CreateKeyPopup(int dnum)852 void CreateKeyPopup(int dnum)
853 {
854 	Widget keybox,keytitle,keysq[4],keylb[4];
855 	int i;
856 	char wname[6];
857 
858 	keytop[dnum] = XtVaAppCreateShell("keytop",app_def_file,
859 		applicationShellWidgetClass,dpy[dnum],XtNmappedWhenManaged,False,NULL);
860 
861 	keybox = XtVaCreateManagedWidget("keybox",formWidgetClass,keytop[dnum],NULL);
862 	keytitle = XtVaCreateManagedWidget("keytitle",labelWidgetClass,keybox,
863 		NULL);
864 
865 	for (i=0; i<4; i++)
866 	{
867 		sprintf(wname,"ksq%d",i);
868 		keysq[i] = XtVaCreateManagedWidget(wname, labelWidgetClass, keybox,
869 			XtNlabel," ",SETBG(colours[i+1]),NULL);
870 		sprintf(wname,"klb%d",i);
871 		keylb[i] = XtVaCreateManagedWidget(wname, labelWidgetClass, keybox,
872 			XtNfromHoriz,keysq[i],NULL);
873 		if (i>0)
874 		{
875 			XtVaSetValues(keysq[i],XtNfromVert,keysq[i-1],NULL);
876 			XtVaSetValues(keylb[i],XtNfromVert,keylb[i-1],NULL);
877 		}
878 	}
879 	keydismiss[dnum] = XtVaCreateManagedWidget("keydismiss",commandWidgetClass,
880 		keybox,NULL);
881 	bg_pixmap(keybox);
882 
883 	XtRealizeWidget(keytop[dnum]);
884 	XtAddCallback(keydismiss[dnum],XtNcallback,KeyPopdown,keytop[dnum]);
885 }
886 
KeyPopup(int dnum)887 void KeyPopup(int dnum)
888 {
889 	if (menu_status[dnum][KEY]==False)
890 		/* popup is already up */
891 		XtUnmapWidget(keytop[dnum]);
892 	else
893 		XtMapWidget(keytop[dnum]);
894 }
895