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