1 #include "components.h"
2
MenuBar(Widget parent,int radio_selection,int other_mode,int pixmap_selection)3 MenuBar::MenuBar(Widget parent, int radio_selection, int other_mode, int pixmap_selection)
4 {
5 Boolean trial_mode, gravity_mode;
6
7 switch(other_mode) {
8 case 0:
9 trial_mode = False;
10 gravity_mode = False;
11 break;
12 case 1:
13 trial_mode = True;
14 gravity_mode = False;
15 break;
16 case 2:
17 trial_mode = False;
18 gravity_mode = True;
19 break;
20 default:
21 fprintf(stderr, "Error: unknown game mode (%d)\n", other_mode);
22 exit(1);
23 }
24 #if USE_MOTIF
25 XmString str[20];
26 char button_name[9];
27
28 menubar = XmVaCreateSimpleMenuBar(parent, "mb",
29 XmVaCASCADEBUTTON, NULL, '\0',
30 XmVaCASCADEBUTTON, NULL, '\0',
31 XmVaCASCADEBUTTON, NULL, '\0',
32 XmVaCASCADEBUTTON, NULL, '\0',
33 NULL);
34 XtVaSetValues(menubar,
35 XmNtopAttachment, XmATTACH_FORM,
36 XmNrightAttachment, XmATTACH_FORM,
37 XmNleftAttachment, XmATTACH_FORM,
38 NULL);
39 title[0] = XmVaCreateSimplePulldownMenu(menubar,
40 "pd0", 0, (XtCallbackProc)GameCB,
41 XmVaPUSHBUTTON, NULL, '\0', NULL, NULL,
42 XmVaPUSHBUTTON, NULL, '\0', NULL, NULL,
43 XmVaPUSHBUTTON, NULL, '\0', NULL, NULL,
44 XmVaSEPARATOR,
45 XmVaPUSHBUTTON, NULL, '\0', NULL, NULL,
46 XmVaPUSHBUTTON, NULL, '\0', NULL, NULL,
47 XmVaSEPARATOR,
48 XmVaPUSHBUTTON, NULL, '\0', NULL, NULL,
49 XmVaSEPARATOR,
50 XmVaPUSHBUTTON, NULL, '\0', NULL, NULL,
51 NULL);
52 title[1] = XmVaCreateSimplePulldownMenu(menubar,
53 "pd1", 1, (XtCallbackProc)SuppCB,
54 XmVaPUSHBUTTON, NULL, '\0', NULL, NULL,
55 XmVaPUSHBUTTON, NULL, '\0', NULL, NULL,
56 NULL);
57 title[2] = XmVaCreateSimplePulldownMenu(menubar,
58 "pd2", 2, (XtCallbackProc)ChangeGameCB,
59 XmVaRADIOBUTTON, NULL, '\0', NULL, NULL,
60 XmVaRADIOBUTTON, NULL, '\0', NULL, NULL,
61 XmVaRADIOBUTTON, NULL, '\0', NULL, NULL,
62 XmVaSEPARATOR,
63 XmVaCHECKBUTTON, NULL, '\0', NULL, NULL,
64 XmVaCHECKBUTTON, NULL, '\0', NULL, NULL,
65 XmNradioBehavior, False,
66 XmNradioAlwaysOne, False,
67 NULL);
68 title[3] = XmVaCreateSimplePulldownMenu(menubar,
69 "pd3", 3, (XtCallbackProc)ChangePixmapCB,
70 XmVaRADIOBUTTON, NULL, '\0', NULL, NULL,
71 XmVaRADIOBUTTON, NULL, '\0', NULL, NULL,
72 XmNradioBehavior, False,
73 XmNradioAlwaysOne, False,
74 NULL);
75 XtManageChild(menubar);
76 #else /* USE_MOTIF */
77 char button_name[9];
78 Widget menushell0, menushell1, menushell2, menushell3;
79 static char check_bits[] = {
80 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20,
81 0x00, 0x10, 0x00, 0x18, 0x02, 0x0c, 0x04, 0x06, 0x08, 0x07, 0x98, 0x03,
82 0xf0, 0x01, 0xe0, 0x00, 0x40, 0x00, 0x00, 0x00};
83
84 menubar = XtVaCreateManagedWidget("mb", boxWidgetClass, parent,
85 XtNorientation, XtEhorizontal,
86 XtNtop, XawChainTop,
87 XtNbottom, XawChainTop,
88 XtNleft, XawChainLeft,
89 XtNright, XawChainLeft,
90 XtNborderWidth, 0,
91 NULL);
92 title[0] = XtVaCreateManagedWidget("pd0", menuButtonWidgetClass, menubar,
93 NULL);
94 title[1] = XtVaCreateManagedWidget("pd1", menuButtonWidgetClass, menubar,
95 NULL);
96 title[2] = XtVaCreateManagedWidget("pd2", menuButtonWidgetClass, menubar,
97 NULL);
98 title[3] = XtVaCreateManagedWidget("pd3", menuButtonWidgetClass, menubar,
99 NULL);
100 menushell0 = XtVaCreatePopupShell("menu", simpleMenuWidgetClass, title[0],
101 NULL);
102 menushell1 = XtVaCreatePopupShell("menu", simpleMenuWidgetClass, title[1],
103 NULL);
104 menushell2 = XtVaCreatePopupShell("menu", simpleMenuWidgetClass, title[2],
105 NULL);
106 menushell3 = XtVaCreatePopupShell("menu", simpleMenuWidgetClass, title[3],
107 NULL);
108 XtVaCreateManagedWidget("button_0", smeBSBObjectClass, menushell0,
109 NULL);
110 XtVaCreateManagedWidget("button_1", smeBSBObjectClass, menushell0,
111 NULL);
112 XtVaCreateManagedWidget("button_2", smeBSBObjectClass, menushell0,
113 NULL);
114 XtVaCreateManagedWidget("sep_0", smeLineObjectClass, menushell0,
115 NULL);
116 XtVaCreateManagedWidget("button_3", smeBSBObjectClass, menushell0,
117 NULL);
118 XtVaCreateManagedWidget("button_4", smeBSBObjectClass, menushell0,
119 NULL);
120 XtVaCreateManagedWidget("sep_1", smeLineObjectClass, menushell0,
121 NULL);
122 XtVaCreateManagedWidget("button_5", smeBSBObjectClass, menushell0,
123 NULL);
124 XtVaCreateManagedWidget("sep_2", smeLineObjectClass, menushell0,
125 NULL);
126 XtVaCreateManagedWidget("button_6", smeBSBObjectClass, menushell0,
127 NULL);
128 XtVaCreateManagedWidget("button_0", smeBSBObjectClass, menushell1,
129 NULL);
130 XtVaCreateManagedWidget("button_1", smeBSBObjectClass, menushell1,
131 NULL);
132 XtVaCreateManagedWidget("button_0", smeBSBObjectClass, menushell2,
133 XtNleftMargin, 16,
134 NULL);
135 XtVaCreateManagedWidget("button_1", smeBSBObjectClass, menushell2,
136 XtNleftMargin, 16,
137 NULL);
138 XtVaCreateManagedWidget("button_2", smeBSBObjectClass, menushell2,
139 XtNleftMargin, 16,
140 NULL);
141 XtVaCreateManagedWidget("sep_0", smeLineObjectClass, menushell2,
142 NULL);
143 XtVaCreateManagedWidget("button_3", smeBSBObjectClass, menushell2,
144 XtNleftMargin, 16,
145 NULL);
146 XtVaCreateManagedWidget("button_4", smeBSBObjectClass, menushell2,
147 XtNleftMargin, 16,
148 NULL);
149 XtVaCreateManagedWidget("button_0", smeBSBObjectClass, menushell3,
150 XtNleftMargin, 16,
151 NULL);
152 XtVaCreateManagedWidget("button_1", smeBSBObjectClass, menushell3,
153 XtNleftMargin, 16,
154 NULL);
155 XtAddCallback(XtNameToWidget(menushell0, "button_0"), XtNcallback,
156 (XtCallbackProc)GameCB, (XtPointer)0);
157 XtAddCallback(XtNameToWidget(menushell0, "button_1"), XtNcallback,
158 (XtCallbackProc)GameCB, (XtPointer)1);
159 XtAddCallback(XtNameToWidget(menushell0, "button_2"), XtNcallback,
160 (XtCallbackProc)GameCB, (XtPointer)2);
161 XtAddCallback(XtNameToWidget(menushell0, "button_3"), XtNcallback,
162 (XtCallbackProc)GameCB, (XtPointer)3);
163 XtAddCallback(XtNameToWidget(menushell0, "button_4"), XtNcallback,
164 (XtCallbackProc)GameCB, (XtPointer)4);
165 XtAddCallback(XtNameToWidget(menushell0, "button_5"), XtNcallback,
166 (XtCallbackProc)GameCB, (XtPointer)5);
167 XtAddCallback(XtNameToWidget(menushell0, "button_6"), XtNcallback,
168 (XtCallbackProc)GameCB, (XtPointer)6);
169 XtAddCallback(XtNameToWidget(menushell1, "button_0"), XtNcallback,
170 (XtCallbackProc)SuppCB, (XtPointer)0);
171 XtAddCallback(XtNameToWidget(menushell1, "button_1"), XtNcallback,
172 (XtCallbackProc)SuppCB, (XtPointer)1);
173 XtAddCallback(XtNameToWidget(menushell2, "button_0"), XtNcallback,
174 (XtCallbackProc)ChangeGameCB, (XtPointer)0);
175 XtAddCallback(XtNameToWidget(menushell2, "button_1"), XtNcallback,
176 (XtCallbackProc)ChangeGameCB, (XtPointer)1);
177 XtAddCallback(XtNameToWidget(menushell2, "button_2"), XtNcallback,
178 (XtCallbackProc)ChangeGameCB, (XtPointer)2);
179 XtAddCallback(XtNameToWidget(menushell2, "button_3"), XtNcallback,
180 (XtCallbackProc)ChangeGameCB, (XtPointer)3);
181 XtAddCallback(XtNameToWidget(menushell2, "button_4"), XtNcallback,
182 (XtCallbackProc)ChangeGameCB, (XtPointer)4);
183 XtAddCallback(XtNameToWidget(menushell3, "button_0"), XtNcallback,
184 (XtCallbackProc)ChangePixmapCB, (XtPointer)0);
185 XtAddCallback(XtNameToWidget(menushell3, "button_1"), XtNcallback,
186 (XtCallbackProc)ChangePixmapCB, (XtPointer)1);
187 check = XCreateBitmapFromData(XtDisplay(menubar),
188 XRootWindowOfScreen(XtScreen(menubar)),
189 check_bits, 16, 16);
190 #endif /* USE_MOTIF */
191
192 // Set one item on the radio button
193 CheckGame(radio_selection);
194 CheckPixmap(pixmap_selection);
195 // "Restart" and "Pause" is initially disabled.
196 DisableRestart();
197 // Set the "Click Trial" check button
198 ClickTrial(trial_mode, gravity_mode);
199 }
200
201 void
DisableRestart(void)202 MenuBar::DisableRestart(void)
203 {
204 XtVaSetValues(XtNameToWidget(title[0], "*button_1"),
205 XtNsensitive, False,
206 NULL);
207 XtVaSetValues(XtNameToWidget(title[0], "*button_2"),
208 XtNsensitive, False,
209 NULL);
210 restart_disabled = 1;
211 }
212
213 void
Sensitive(void)214 MenuBar::Sensitive(void)
215 {
216 XtVaSetValues(XtNameToWidget(title[1], "*button_0"),
217 XtNsensitive, True,
218 NULL);
219 XtVaSetValues(XtNameToWidget(title[1], "*button_1"),
220 XtNsensitive, True,
221 NULL);
222 if (restart_disabled) {
223 XtVaSetValues(XtNameToWidget(title[0], "*button_1"),
224 XtNsensitive, True,
225 NULL);
226 XtVaSetValues(XtNameToWidget(title[0], "*button_2"),
227 XtNsensitive, True,
228 NULL);
229 restart_disabled = 0;
230 }
231 }
232
233 void
Insensitive(void)234 MenuBar::Insensitive(void)
235 {
236 XtVaSetValues(XtNameToWidget(title[1], "*button_0"),
237 XtNsensitive, False,
238 NULL);
239 XtVaSetValues(XtNameToWidget(title[1], "*button_1"),
240 XtNsensitive, False,
241 NULL);
242 }
243
244 void
PauseOn(void)245 MenuBar::PauseOn(void)
246 {
247 XtVaSetValues(XtNameToWidget(title[0], "*button_0"),
248 XtNsensitive, False,
249 NULL);
250 XtVaSetValues(XtNameToWidget(title[0], "*button_1"),
251 XtNsensitive, False,
252 NULL);
253 Insensitive();
254 }
255
256 void
PauseOff(void)257 MenuBar::PauseOff(void)
258 {
259 XtVaSetValues(XtNameToWidget(title[0], "*button_0"),
260 XtNsensitive, True,
261 NULL);
262 XtVaSetValues(XtNameToWidget(title[0], "*button_1"),
263 XtNsensitive, True,
264 NULL);
265 Sensitive();
266 }
267
268 void
ClickTrial(Boolean click,Boolean gravity)269 MenuBar::ClickTrial(Boolean click, Boolean gravity)
270 {
271 #if USE_MOTIF
272 XtVaSetValues(XtNameToWidget(title[2], "*button_3"),
273 XmNset, click,
274 NULL);
275 XtVaSetValues(XtNameToWidget(title[2], "*button_4"),
276 XmNset, gravity,
277 NULL);
278 #else /* USE_MOTIF */
279 XtVaSetValues(XtNameToWidget(title[2], "*button_3"),
280 XtNleftBitmap, (click ? check : 0),
281 NULL);
282 XtVaSetValues(XtNameToWidget(title[2], "*button_4"),
283 XtNleftBitmap, (gravity ? check : 0),
284 NULL);
285 #endif /* USE_MOTIF */
286 }
287
288 void
DemoMode(void)289 MenuBar::DemoMode(void)
290 {
291 Arg arg;
292
293 // make only "exit" button remain active
294 XtSetArg(arg, XtNsensitive, False);
295 XtSetValues(XtNameToWidget(title[0], "*button_0"), &arg, 1);
296 XtSetValues(XtNameToWidget(title[0], "*button_1"), &arg, 1);
297 XtSetValues(XtNameToWidget(title[0], "*button_2"), &arg, 1);
298 XtSetValues(XtNameToWidget(title[1], "*button_0"), &arg, 1);
299 XtSetValues(XtNameToWidget(title[1], "*button_1"), &arg, 1);
300 }
301
302 void
CheckGame(int which)303 MenuBar::CheckGame(int which)
304 {
305 Arg arg_off, arg_on;
306 #if USE_MOTIF
307 XtSetArg(arg_off, XmNset, False);
308 XtSetArg(arg_on, XmNset, True);
309 #else /* USE_MOTIF */
310 /* Athena widget sets contains the 'Toggle' widget, but it
311 is unusable from the simple menubar widget. I have to
312 get it toggled by myself. */
313 XtSetArg(arg_off, XtNleftBitmap, NULL);
314 XtSetArg(arg_on, XtNleftBitmap, check);
315 #endif
316 switch(which) {
317 case 0:
318 XtSetValues(XtNameToWidget(title[2], "*button_0"), &arg_on, 1);
319 XtSetValues(XtNameToWidget(title[2], "*button_1"), &arg_off, 1);
320 XtSetValues(XtNameToWidget(title[2], "*button_2"), &arg_off, 1);
321 break;
322 case 1:
323 XtSetValues(XtNameToWidget(title[2], "*button_0"), &arg_off, 1);
324 XtSetValues(XtNameToWidget(title[2], "*button_1"), &arg_on, 1);
325 XtSetValues(XtNameToWidget(title[2], "*button_2"), &arg_off, 1);
326 break;
327 case 2:
328 XtSetValues(XtNameToWidget(title[2], "*button_0"), &arg_off, 1);
329 XtSetValues(XtNameToWidget(title[2], "*button_1"), &arg_off, 1);
330 XtSetValues(XtNameToWidget(title[2], "*button_2"), &arg_on, 1);
331 break;
332 }
333 }
334
335 void
CheckPixmap(int which)336 MenuBar::CheckPixmap(int which)
337 {
338 Arg arg_off, arg_on;
339 #if USE_MOTIF
340 XtSetArg(arg_off, XmNset, False);
341 XtSetArg(arg_on, XmNset, True);
342 #else /* USE_MOTIF */
343 /* Athena widget sets contains the 'Toggle' widget, but it
344 is unusable from the simple menubar widget. I have to
345 get it toggled by myself. */
346 XtSetArg(arg_off, XtNleftBitmap, NULL);
347 XtSetArg(arg_on, XtNleftBitmap, check);
348 #endif
349 switch(which) {
350 case 0:
351 XtSetValues(XtNameToWidget(title[3], "*button_0"), &arg_on, 1);
352 XtSetValues(XtNameToWidget(title[3], "*button_1"), &arg_off, 1);
353 break;
354 case 1:
355 XtSetValues(XtNameToWidget(title[3], "*button_0"), &arg_off, 1);
356 XtSetValues(XtNameToWidget(title[3], "*button_1"), &arg_on, 1);
357 break;
358 }
359 }
360