1 /* $Id: options.c,v 1.3 2002/03/02 21:02:21 sverrehu Exp $ */
2 /**************************************************************************
3  *
4  *  FILE            options.c
5  *  MODULE OF       Card game.
6  *
7  *  WRITTEN BY      Sverre H. Huseby <shh@thathost.com>
8  *
9  **************************************************************************/
10 
11 #include <X11/Xlib.h>
12 #include <X11/Intrinsic.h>
13 #include <X11/StringDefs.h>
14 #include <X11/Shell.h>
15 #include <X11/Core.h>
16 #include <X11/Xaw/Command.h>
17 #include <X11/Xaw/Toggle.h>
18 #include <X11/Xaw/Form.h>
19 #include <X11/Xaw/Label.h>
20 
21 #include <shhmsg.h>
22 #include <shhcards.h>
23 
24 #include "win.h"
25 #include "board.h"
26 #include "game.h"
27 #include "options.h"
28 
29 /**************************************************************************
30  *                                                                        *
31  *                       P R I V A T E    D A T A                         *
32  *                                                                        *
33  **************************************************************************/
34 
35 static Widget optionsWidget, optionsParent, bgWidget, bgPrev, bgNext;
36 static Widget tglHighscore, tglTiming, tglDraw1, tglDraw3;
37 static int bgPicNum;
38 static int isPoppedUp = 0;
39 
40 
41 
42 /**************************************************************************
43  *                                                                        *
44  *                   P R I V A T E    F U N C T I O N S                   *
45  *                                                                        *
46  **************************************************************************/
47 
48 static void
tglSetState(Widget w,int state)49 tglSetState(Widget w, int state)
50 {
51     XtVaSetValues(w, XtNstate, state, NULL);
52 }
53 
54 static int
tglGetState(Widget w)55 tglGetState(Widget w)
56 {
57     Boolean state;
58 
59     XtVaGetValues(w, XtNstate, &state, NULL);
60     return state;
61 }
62 
63 
64 static void
popDown(void)65 popDown(void)
66 {
67     XtPopdown(optionsWidget);
68     isPoppedUp = 0;
69     winFlush();
70 }
71 
72 static void
callbackOk(Widget w,XtPointer clientData,XtPointer callData)73 callbackOk(Widget w, XtPointer clientData, XtPointer callData)
74 {
75     int q, tmp, newGame = 0;
76 
77     tmp = tglGetState(tglDraw1) ? 1 : 3;
78     if (tmp != gameNumCardsToDraw) {
79 	gameNumCardsToDraw = tmp;
80 	newGame = 1;
81     }
82     tmp = tglGetState(tglTiming);
83     if (tmp != gameDoTiming) {
84 	gameDoTiming = tmp;
85 	newGame = 1;  /* no cheating! */
86     }
87     gameIncludeInHighscoreList = tglGetState(tglHighscore);
88     if (bgPicNum != boardCardBackground) {
89 	boardCardBackground = bgPicNum;
90 	for (q = 0; q < NUM_PILES; q++)
91 	    boardUpdatePileCache(pile[q]);
92 	XClearArea(winDisplay, boardWin, 0, 0, 0, 0, 1);
93     }
94     popDown();
95     if (newGame) {
96 	gameFinishGame();
97 	gameInitGame();
98     }
99 }
100 
101 static void
callbackCancel(Widget w,XtPointer clientData,XtPointer callData)102 callbackCancel(Widget w, XtPointer clientData, XtPointer callData)
103 {
104     popDown();
105 }
106 
107 static void
callbackBack(Widget w,XtPointer clientData,XtPointer callData)108 callbackBack(Widget w, XtPointer clientData, XtPointer callData)
109 {
110     int update = 0;
111 
112     if (w == bgPrev) {
113 	if (bgPicNum > 0) {
114 	    --bgPicNum;
115 	    update = 1;
116 	    XtSetSensitive(bgNext, 1);
117 	    XtSetSensitive(bgPrev, (bgPicNum > 0));
118 	}
119     } else {
120 	if (bgPicNum < CARD_NUM_BACKS - 1) {
121 	    ++bgPicNum;
122 	    update = 1;
123 	    XtSetSensitive(bgPrev, 1);
124 	    XtSetSensitive(bgNext, (bgPicNum < CARD_NUM_BACKS - 1));
125 	}
126     }
127     if (update)
128 	cardDraw(XtWindowOfObject(bgWidget), 0, 0, CARD_BACKGROUND, bgPicNum);
129 }
130 
131 static void
showCard(Widget w,XtPointer clientData,XEvent * evt,Boolean * cont)132 showCard(Widget w, XtPointer clientData, XEvent *evt, Boolean *cont)
133 {
134     cardDraw(XtWindowOfObject(w), 0, 0, CARD_BACKGROUND, bgPicNum);
135 }
136 
137 
138 
139 /**************************************************************************
140  *                                                                        *
141  *                    P U B L I C    F U N C T I O N S                    *
142  *                                                                        *
143  **************************************************************************/
144 
145 void
optionsInit(Widget parent)146 optionsInit(Widget parent)
147 {
148     Widget form, form2, ok, cancel, drawText, hsText, timingText;
149 
150     optionsParent = parent;
151     optionsWidget
152 	= XtVaCreatePopupShell("optionsWindow",
153 			       transientShellWidgetClass, parent,
154 			       XtNtitle, "Sol Options",
155 			       NULL);
156     form
157 	= XtVaCreateManagedWidget("options",
158 				  formWidgetClass, optionsWidget,
159 				  NULL);
160     form2
161 	= XtVaCreateManagedWidget("options2",
162 				  formWidgetClass, form,
163 				  NULL);
164     bgWidget
165 	= XtVaCreateManagedWidget("bgPix",
166 				  coreWidgetClass, form2,
167 				  XtNborderWidth, 0,
168 				  XtNwidth, CARD_WIDTH,
169 				  XtNheight, CARD_HEIGHT,
170 				  NULL);
171     bgPrev
172 	= XtVaCreateManagedWidget("prev",
173 				  commandWidgetClass, form2,
174 				  XtNlabel, "<-",
175 				  XtNfromVert, bgWidget,
176 				  NULL);
177     bgNext
178 	= XtVaCreateManagedWidget("next",
179 				  commandWidgetClass, form2,
180 				  XtNlabel, "->",
181 				  XtNfromVert, bgWidget,
182 				  XtNfromHoriz, bgPrev,
183 				  NULL);
184     drawText
185 	= XtVaCreateManagedWidget("drawText",
186 				  labelWidgetClass, form2,
187 				  XtNlabel, "Number of cards to draw",
188 				  XtNborderWidth, 0,
189 				  XtNfromHoriz, bgWidget,
190 				  NULL);
191     tglDraw1
192 	= XtVaCreateManagedWidget("draw1",
193 				  toggleWidgetClass, form2,
194 				  XtNlabel, "1",
195 				  XtNfromHoriz, drawText,
196 				  NULL);
197     tglDraw3
198 	= XtVaCreateManagedWidget("draw3",
199 				  toggleWidgetClass, form2,
200 				  XtNradioGroup, tglDraw1,
201 				  XtNlabel, "3",
202 				  XtNfromHoriz, tglDraw1,
203 				  NULL);
204     timingText
205 	= XtVaCreateManagedWidget("timintText",
206 				  labelWidgetClass, form2,
207 				  XtNlabel, "Timing",
208 				  XtNborderWidth, 0,
209 				  XtNfromVert, drawText,
210 				  XtNfromHoriz, bgWidget,
211 				  NULL);
212     tglTiming
213 	= XtVaCreateManagedWidget("includeHighscore",
214 				  toggleWidgetClass, form2,
215 				  XtNlabel, " ",
216 				  XtNfromHoriz, timingText,
217 				  XtNfromVert, drawText,
218 				  NULL);
219     hsText
220 	= XtVaCreateManagedWidget("includeHighscoreText",
221 				  labelWidgetClass, form2,
222 				  XtNlabel, "Include in highscore list",
223 				  XtNborderWidth, 0,
224 				  XtNfromVert, timingText,
225 				  XtNfromHoriz, bgWidget,
226 				  NULL);
227     tglHighscore
228 	= XtVaCreateManagedWidget("includeHighscore",
229 				  toggleWidgetClass, form2,
230 				  XtNlabel, " ",
231 				  XtNfromHoriz, hsText,
232 				  XtNfromVert, timingText,
233 				  NULL);
234     ok
235 	= XtVaCreateManagedWidget("ok",
236 				  commandWidgetClass, form,
237 				  XtNlabel, "OK",
238 				  XtNfromVert, form2,
239 				  NULL);
240     cancel
241 	= XtVaCreateManagedWidget("cancel",
242 				  commandWidgetClass, form,
243 				  XtNlabel, "Cancel",
244 				  XtNfromHoriz, ok,
245 				  XtNfromVert, form2,
246 				  NULL);
247     XtAddCallback(ok, XtNcallback, callbackOk, 0);
248     XtAddCallback(cancel, XtNcallback, callbackCancel, 0);
249     XtAddEventHandler(bgWidget, ExposureMask, 0, showCard, NULL);
250     XtAddCallback(bgPrev, XtNcallback, callbackBack, 0);
251     XtAddCallback(bgNext, XtNcallback, callbackBack, 0);
252 }
253 
254 void
optionsFinish(void)255 optionsFinish(void)
256 {
257 }
258 
259 void
optionsPopup(void)260 optionsPopup(void)
261 {
262     Dimension popWidth, popHeight, parWidth, parHeight;
263     Position  x, y;
264 
265     if (isPoppedUp)
266 	return;
267     isPoppedUp = 1;
268 
269     /* initiate controls from state variables */
270     tglSetState(tglDraw1, (gameNumCardsToDraw == 1));
271     tglSetState(tglDraw3, (gameNumCardsToDraw == 3));
272     tglSetState(tglTiming, (gameDoTiming != 0));
273     tglSetState(tglHighscore, (gameIncludeInHighscoreList != 0));
274     bgPicNum = boardCardBackground;
275     XtSetSensitive(bgPrev, (bgPicNum > 0));
276     XtSetSensitive(bgNext, (bgPicNum < CARD_NUM_BACKS - 1));
277 
278     /* must temporarily realize the widget to be able to get it's size */
279     XtRealizeWidget(optionsWidget);
280     XtUnrealizeWidget(optionsWidget);
281 
282     XtVaGetValues(optionsWidget,
283 		  XtNwidth, &popWidth, XtNheight, &popHeight, NULL);
284     XtVaGetValues(optionsParent,
285 		  XtNwidth, &parWidth, XtNheight, &parHeight, NULL);
286     XtTranslateCoords(optionsParent,
287 		      (Position) (parWidth - popWidth) / 2,
288 		      (Position) (parHeight - popHeight) / 2,
289 		      &x, &y);
290     XtVaSetValues(optionsWidget,
291 		  XtNx, x, XtNy, y,
292 		  NULL);
293     XtPopup(optionsWidget, XtGrabExclusive);
294 }
295