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