1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <X11/StringDefs.h>
5 #include <X11/Intrinsic.h>
6 #include <X11/Xaw/Box.h>
7 #include <X11/Xaw/Label.h>
8 #include <Mowitz/Mowitz.h>
9
10 #define MENUBAR (1)
11
12 static int bars = MENUBAR;
13
14 static Widget topLevel, topbox;
15 static Widget animator, canvas, check, color, combo, frame, image;
16 static Widget menubar, menubox, menubutton, menu;
17 static Widget richtext, rudegrid, ruler, slider, vslider;
18 static Widget spinner, tabbing, table, tabs, textfield, tooltip;
19
20 static XColor xcolor;
21
22 static String fallback[] = {
23 "*background: grey",
24 "*MwRichtext.background: white",
25 "*MwTextField.background: white",
26 #if 0
27 "*borderWidth: 0",
28 #endif
29 "*Frame.shadowWidth: 1",
30 "*font: -*-helvetica-medium-r-normal-*-12-*-*-*-*-*-iso8859-*",
31 NULL
32 };
33
34 static char *years[] = {
35 "2000", "2001", "2002", "2003", "2004", "2005", "2006",
36 "2007", "2008", "2009", "2010", "2011", "2012", "2013",
37 "2014", "2015", "2016", "2017", "2018", "2019", "2020"
38 };
39
40 static char *months[] = {
41 "January", "February", "March", "April", "May", "June",
42 "July", "August", "September", "October", "November", "December"
43 };
44
45 static char *days[] = {
46 "Monday", "Tuesday", "Wednesday", "Thursday", "Friday",
47 "Saturday", "Sunday"
48 };
49
50 static MwAniScript script0[] = {
51 {0, 0, 0, 10, 100, 1, script0+1},
52 {1000, 0, 0, 100, 10, 1, NULL}};
53
54 static MwAniScript script1[] = {{0, 110, 20, 0, 0, 1, NULL}};
55 static MwAniScript script2[] = {{0, 110, 35, 0, 0, 1, NULL}};
56 static MwAniScript script3[] = {{0, 110, 50, 0, 0, 1, NULL}};
57 static MwAniScript script4[] = {{0, 110, 65, 0, 0, 1, NULL}};
58
59 static MwAniObject cast[] = {
60 {MW_ANI_RECTANGLE, "Object0", script0, 0, "", cast+1},
61 {MW_ANI_STRING, "Object1", script1, 0, "C = play", cast+2},
62 {MW_ANI_STRING, "Object2", script2, 0, "S = pause", cast+3},
63 {MW_ANI_STRING, "Object3", script3, 0, "P = previous frame", cast+4},
64 {MW_ANI_STRING, "Object4", script4, 0, "N = next frame", NULL},
65 };
66
67 static MwFmt myfmt = {"Courier", 150, 1, 0, 0, 0, "red", "yellow", 0,
68 MW_VADJ_CENTER, MW_HADJ_LEFT, 0};
69
70 /* width height colours a z colour1 colour2 */
71 static char *mygrad = "100 100 128 0 1 SpringGreen Chartreuse";
72
73
redraw_canvas(Widget w,XtPointer client_data,XtPointer call_data)74 static void redraw_canvas(Widget w, XtPointer client_data, XtPointer call_data)
75 {
76 printf("redraw canvas\n");
77 }
78
cb_spinner(Widget w,XtPointer client_data,XtPointer call_data)79 static void cb_spinner(Widget w, XtPointer client_data, XtPointer call_data)
80 {
81 int n = (int)call_data;
82 printf("cb_spinner(%s) => %d\n", XtName(w), n);
83 }
84
set_color(XColor * xcolor)85 static void set_color(XColor *xcolor)
86 {
87 MwAllocColor(XtDisplay(color), None, xcolor);
88 XtVaSetValues(color, XtNbackground, xcolor->pixel, (char *)0);
89 }
90
cb_red(Widget w,XtPointer client_data,XtPointer call_data)91 static void cb_red(Widget w, XtPointer client_data, XtPointer call_data)
92 {
93 int n = (int)call_data;
94 xcolor.red = n;
95 set_color(&xcolor);
96 }
97
cb_green(Widget w,XtPointer client_data,XtPointer call_data)98 static void cb_green(Widget w, XtPointer client_data, XtPointer call_data)
99 {
100 int n = (int)call_data;
101 xcolor.green = n;
102 set_color(&xcolor);
103 }
104
cb_blue(Widget w,XtPointer client_data,XtPointer call_data)105 static void cb_blue(Widget w, XtPointer client_data, XtPointer call_data)
106 {
107 int n = (int)call_data;
108 xcolor.blue = n;
109 set_color(&xcolor);
110 }
111
cb_open(Widget w,XtPointer client_data,XtPointer call_data)112 static void cb_open(Widget w, XtPointer client_data, XtPointer call_data)
113 {
114 char path[1024] = ".";
115 char name[1024] = "";
116 char *patterns[] = { "All files (*)", NULL };
117 char fmt[1024] = "";
118 char *extra = NULL;
119 int ext = 0;
120
121 MwFileselInput(topLevel, path, name, patterns, fmt, extra, ext);
122 }
123
cb_quit(Widget w,XtPointer client_data,XtPointer call_data)124 static void cb_quit(Widget w, XtPointer client_data, XtPointer call_data)
125 {
126 MwMallocExit();
127 exit(0);
128 }
129
cb_error(Widget w,XtPointer client_data,XtPointer call_data)130 static void cb_error(Widget w, XtPointer client_data, XtPointer call_data)
131 {
132 MwErrorBox(topLevel, "Nothing to see here.");
133 }
134
135
cb_alert(Widget w,XtPointer client_data,XtPointer call_data)136 static void cb_alert(Widget w, XtPointer client_data, XtPointer call_data)
137 {
138 char *buttons[] = {"Abort", "Retry", "Continue", "Fail"};
139 MwAlertBox(topLevel, "An unexpected error didn't occur at all.",
140 buttons, 4);
141 }
142
143
cb_about(Widget w,XtPointer client_data,XtPointer call_data)144 static void cb_about(Widget w, XtPointer client_data, XtPointer call_data)
145 {
146 printf("cb_about(%s)\n", XtName(w));
147 MwAboutSiag(topLevel);
148 }
149
quit(Widget w,XEvent * event,String * params,Cardinal * n)150 static void quit(Widget w, XEvent *event, String *params, Cardinal *n)
151 {
152 exit(0);
153 }
154
155 static XtActionsRec actions[] =
156 {
157 {"quit", quit}
158 };
159
remake_ylayout(void)160 static void remake_ylayout(void)
161 {
162 char b[100];
163 sprintf(b, "%s 100%%",
164 (bars&MENUBAR)?"30":"0");
165 XtVaSetValues(rudegrid,
166 XtNyLayout, b,
167 (char *)0);
168 }
169
attach(Widget w,XtPointer client_data,XtPointer call_data)170 static void attach(Widget w, XtPointer client_data, XtPointer call_data)
171 {
172 Widget vw = (Widget)call_data;
173 printf("attach(%s)\n", XtName(w));
174 if (vw == menubar) bars |= MENUBAR;
175 remake_ylayout();
176 }
177
detach(Widget w,XtPointer client_data,XtPointer call_data)178 static void detach(Widget w, XtPointer client_data, XtPointer call_data)
179 {
180 Widget vw = (Widget)call_data;
181 printf("detach(%s)\n", XtName(w));
182 if (vw == menubar) bars &= ~MENUBAR;
183 remake_ylayout();
184 }
185
select_tab(Widget w,XtPointer client_data,XtPointer call_data)186 static void select_tab(Widget w, XtPointer client_data, XtPointer call_data)
187 {
188 Widget label = (Widget)client_data;
189 int pos = (int)call_data;
190 char *n = MwTabbingPosToText(w, pos);
191 XtVaSetValues(label, XtNlabel, n, (char *)0);
192 }
193
table_text(void * p,int r,int c)194 static char *table_text(void *p, int r, int c)
195 {
196 static char b[1024];
197 sprintf(b, "%d*%d = %d", r, c, r*c);
198 return b;
199 }
200
main(int argc,char ** argv)201 int main(int argc, char **argv)
202 {
203 Atom wm_protocols, wm_delete_window;
204 XtAppContext ac;
205 Widget w;
206 int i;
207
208 topLevel = XtVaAppInitialize(&ac, "AllWidgets",
209 NULL, 0,
210 &argc, argv,
211 fallback,
212 XtNwidth, 300,
213 XtNheight, 200,
214 (char *)0);
215 XtAppAddActions(ac, actions, XtNumber(actions));
216 rudegrid = XtVaCreateManagedWidget("rudegrid",
217 mwRudegridWidgetClass, topLevel,
218 XtNyLayout, "30 100%",
219 (char *)0);
220 menubar = XtVaCreateManagedWidget("menubar",
221 mwRudegridWidgetClass, rudegrid,
222 XtNxLayout, "9 100%",
223 (char *)0);
224 MwMakeHandle(menubar, menubar, detach, attach);
225 menubox = XtVaCreateManagedWidget("menubox",
226 mwMenuBarWidgetClass, menubar,
227 XtNgridx, 1,
228 (char *)0);
229 bars |= MENUBAR;
230 menubutton = XtVaCreateManagedWidget("menubutton",
231 mwMBButtonObjectClass, menubox,
232 XtNlabel, "File",
233 XtNmenu_name, "filemenu",
234 (char *)0);
235 menu = XtVaCreatePopupShell("filemenu",
236 mwMenuWidgetClass, menubox, NULL, 0);
237 w = XtVaCreateManagedWidget("Open",
238 mwLabelMEObjectClass, menu,
239 XtNlabel, "Open",
240 (char *)0);
241 XtAddCallback(w, XtNcallback, cb_open, NULL);
242 XtVaCreateManagedWidget("-",
243 mwLineMEObjectClass, menu,
244 (char *)0);
245 w = XtVaCreateManagedWidget("Exit",
246 mwLabelMEObjectClass, menu,
247 XtNlabel, "Exit",
248 (char *)0);
249 XtAddCallback(w, XtNcallback, cb_quit, NULL);
250
251 menubutton = XtVaCreateManagedWidget("menubutton",
252 mwMBButtonObjectClass, menubox,
253 XtNlabel, "Misc",
254 XtNmenu_name, "miscmenu",
255 (char *)0);
256 menu = XtVaCreatePopupShell("miscmenu",
257 mwMenuWidgetClass, menubox, NULL, 0);
258 w = XtVaCreateManagedWidget("Alert",
259 mwLabelMEObjectClass, menu,
260 XtNlabel, "Alert",
261 (char *)0);
262 XtAddCallback(w, XtNcallback, cb_alert, NULL);
263 w = XtVaCreateManagedWidget("Error",
264 mwLabelMEObjectClass, menu,
265 XtNlabel, "Error",
266 (char *)0);
267 XtAddCallback(w, XtNcallback, cb_error, NULL);
268
269 menubutton = XtVaCreateManagedWidget("menubutton",
270 mwMBButtonObjectClass, menubox,
271 XtNlabel, "Help",
272 XtNmenu_name, "helpmenu",
273 (char *)0);
274 menu = XtVaCreatePopupShell("helpmenu",
275 mwMenuWidgetClass, menubox, NULL, 0);
276 XtVaCreateManagedWidget("Contents",
277 mwLabelMEObjectClass, menu,
278 XtNlabel, "Contents",
279 (char *)0);
280 XtVaCreateManagedWidget("-",
281 mwLineMEObjectClass, menu,
282 (char *)0);
283 w = XtVaCreateManagedWidget("About",
284 mwLabelMEObjectClass, menu,
285 XtNlabel, "About",
286 (char *)0);
287 XtAddCallback(w, XtNcallback, cb_about, NULL);
288 tabs = XtVaCreateManagedWidget("tabs",
289 mwTabsWidgetClass, rudegrid,
290 XtNgridy, 1,
291 (char *)0);
292
293 for (i = 0; i < 5; i++) {
294 cast[i].fmt = MwEncodeFormat(~0, &myfmt);
295 }
296 animator = XtVaCreateManagedWidget("animator",
297 mwAnimatorWidgetClass, tabs,
298 XtNanimatorCast, cast,
299 XtNgradient, mygrad,
300 (char *)0);
301
302 canvas = XtVaCreateManagedWidget("canvas",
303 mwCanvasWidgetClass, tabs,
304 (char *)0);
305 XtAddCallback(canvas, XtNcallback, redraw_canvas, (char *)0);
306 topbox = XtVaCreateManagedWidget("check",
307 boxWidgetClass, tabs,
308 XtNborderWidth, 0,
309 (char *)0);
310 check = XtVaCreateManagedWidget("check",
311 mwCheckWidgetClass, topbox,
312 XtNlabel, "Check!",
313 (char *)0);
314 check = XtVaCreateManagedWidget("check",
315 mwCheckWidgetClass, topbox,
316 XtNlabel, "Radio!",
317 XtNcheckStyle, MwRadioWin,
318 XtNradioGroup, topbox,
319 XtNradioStart, topbox,
320 (char *)0);
321 check = XtVaCreateManagedWidget("check",
322 mwCheckWidgetClass, topbox,
323 XtNlabel, "Radio!",
324 XtNcheckStyle, MwRadioWin,
325 XtNradioGroup, topbox,
326 XtNradioStart, topbox,
327 (char *)0);
328 check = XtVaCreateManagedWidget("check",
329 mwCheckWidgetClass, topbox,
330 XtNlabel, "Check!",
331 (char *)0);
332 color = XtVaCreateManagedWidget("color",
333 mwRudegridWidgetClass, tabs,
334 XtNxLayout, "4 80 4 80",
335 XtNyLayout, "4 22 4 22 4 22",
336 (char *)0);
337 MwAllocNamedColor(XtDisplay(color), "red", &xcolor);
338 XtVaCreateManagedWidget("Red",
339 labelWidgetClass, color,
340 XtNgridx, 1, XtNgridy, 1,
341 XtNbackground, xcolor.pixel,
342 (char *)0);
343 w = XtVaCreateManagedWidget("red",
344 mwSpinnerWidgetClass, color,
345 XtNgridx, 3, XtNgridy, 1,
346 XtNmin, 0, XtNmax, 65535, XtNstep, 100,
347 (char *)0);
348 XtAddCallback(w, XtNcallback, cb_red, (char *)0);
349 MwAllocNamedColor(XtDisplay(color), "green", &xcolor);
350 XtVaCreateManagedWidget("Green",
351 labelWidgetClass, color,
352 XtNgridx, 1, XtNgridy, 3,
353 XtNbackground, xcolor.pixel,
354 (char *)0);
355 w = XtVaCreateManagedWidget("green",
356 mwSpinnerWidgetClass, color,
357 XtNgridx, 3, XtNgridy, 3,
358 XtNmin, 0, XtNmax, 65535, XtNstep, 100,
359 (char *)0);
360 XtAddCallback(w, XtNcallback, cb_green, (char *)0);
361 MwAllocNamedColor(XtDisplay(color), "blue", &xcolor);
362 XtVaCreateManagedWidget("Blue",
363 labelWidgetClass, color,
364 XtNgridx, 1, XtNgridy, 5,
365 XtNbackground, xcolor.pixel,
366 (char *)0);
367 w = XtVaCreateManagedWidget("blue",
368 mwSpinnerWidgetClass, color,
369 XtNgridx, 3, XtNgridy, 5,
370 XtNmin, 0, XtNmax, 65535, XtNstep, 100,
371 (char *)0);
372 XtAddCallback(w, XtNcallback, cb_blue, (char *)0);
373 xcolor.red = 0;
374 xcolor.green = 0;
375 xcolor.blue = 0;
376 set_color(&xcolor);
377 topbox = XtVaCreateManagedWidget("combo",
378 boxWidgetClass, tabs,
379 XtNborderWidth, 0,
380 (char *)0);
381 combo = XtVaCreateManagedWidget("combo",
382 mwComboWidgetClass, topbox,
383 XtNcomboData, years,
384 XtNcomboNData, sizeof(years)/sizeof(years[0]),
385 (char *)0);
386 combo = XtVaCreateManagedWidget("combo",
387 mwComboWidgetClass, topbox,
388 XtNcomboData, months,
389 XtNcomboNData, sizeof(months)/sizeof(months[0]),
390 (char *)0);
391 combo = XtVaCreateManagedWidget("combo",
392 mwComboWidgetClass, topbox,
393 XtNcomboData, days,
394 XtNcomboNData, sizeof(days)/sizeof(days[0]),
395 (char *)0);
396 combo = XtVaCreateManagedWidget("combo",
397 mwComboWidgetClass, topbox,
398 (char *)0);
399 MwComboTextChange(combo, "Ulric");
400 frame = XtVaCreateManagedWidget("frame",
401 mwFrameWidgetClass, tabs,
402 (char *)0);
403 image = XtVaCreateManagedWidget("image",
404 mwImageWidgetClass, tabs,
405 (char *)0);
406 richtext = XtVaCreateManagedWidget("richtext",
407 boxWidgetClass, tabs,
408 (char *)0);
409 XtVaCreateManagedWidget("richtext",
410 mwRichtextWidgetClass, richtext,
411 (char *)0);
412 XtVaCreateManagedWidget("richtext",
413 mwRichtextWidgetClass, richtext,
414 (char *)0);
415 XtVaCreateManagedWidget("richtext",
416 mwRichtextWidgetClass, richtext,
417 (char *)0);
418 ruler = XtVaCreateManagedWidget("ruler",
419 mwRulerWidgetClass, tabs,
420 (char *)0);
421 topbox = XtVaCreateManagedWidget("slider",
422 boxWidgetClass, tabs,
423 XtNborderWidth, 0,
424 (char *)0);
425 slider = XtVaCreateManagedWidget("slider",
426 mwSliderWidgetClass, topbox,
427 (char *)0);
428 vslider = XtVaCreateManagedWidget("vslider",
429 mwVSliderWidgetClass, topbox,
430 (char *)0);
431 topbox = XtVaCreateManagedWidget("spinner",
432 boxWidgetClass, tabs,
433 XtNborderWidth, 0,
434 (char *)0);
435 spinner = XtVaCreateManagedWidget("spinner",
436 mwSpinnerWidgetClass, topbox,
437 (char *)0);
438 XtAddCallback(spinner, XtNcallback, cb_spinner, (char *)0);
439 spinner = XtVaCreateManagedWidget("spinner",
440 mwSpinnerWidgetClass, topbox,
441 XtNmin, -100, XtNstep, 10, XtNmax, 100,
442 (char *)0);
443 XtAddCallback(spinner, XtNcallback, cb_spinner, (char *)0);
444 spinner = XtVaCreateManagedWidget("spinner",
445 mwSpinnerWidgetClass, topbox,
446 XtNmin, -1000, XtNstep, 20, XtNmax, 0,
447 (char *)0);
448 XtAddCallback(spinner, XtNcallback, cb_spinner, (char *)0);
449 spinner = XtVaCreateManagedWidget("spinner",
450 mwSpinnerWidgetClass, topbox,
451 XtNmin, 0, XtNstep, 5, XtNmax, 1000,
452 (char *)0);
453 XtAddCallback(spinner, XtNcallback, cb_spinner, (char *)0);
454 XtVaSetValues(spinner, XtNvalue, 10, (char *)0);
455 topbox = XtVaCreateManagedWidget("textfield",
456 boxWidgetClass, tabs,
457 (char *)0);
458 textfield = XtVaCreateManagedWidget("textfield",
459 mwTextfieldWidgetClass, topbox,
460 (char *)0);
461 topbox = XtVaCreateManagedWidget("tabbing",
462 mwRudegridWidgetClass, tabs,
463 XtNyLayout, "100% 20",
464 (char *)0);
465 w = XtVaCreateManagedWidget("tabbing",
466 labelWidgetClass, topbox,
467 XtNlabel, "Click tab to rename",
468 (char *)0);
469 tabbing = XtVaCreateManagedWidget("tabbing",
470 mwTabbingWidgetClass, topbox,
471 XtNgridy, 1,
472 (char *)0);
473 MwTabbingInsert(tabbing, "Page 1", 1);
474 MwTabbingInsert(tabbing, "Page 2", 2);
475 XtAddCallback(tabbing, XtNselectCallback, select_tab, (XtPointer)w);
476 table = XtVaCreateManagedWidget("table",
477 mwTableWidgetClass, tabs,
478 XtNtableText, table_text,
479 (char *)0);
480 tooltip = XtVaCreatePopupShell("tooltip",
481 mwTooltipWidgetClass, topLevel,
482 (char *)0);
483 MwTooltipAdd(tooltip, textfield, "Ulric fibbar");
484 XtRealizeWidget(topLevel);
485 wm_protocols = XInternAtom(XtDisplay(topLevel),
486 "WM_PROTOCOLS", False);
487 wm_delete_window = XInternAtom(XtDisplay(topLevel),
488 "WM_DELETE_WINDOW", False);
489 XtOverrideTranslations(topLevel,
490 XtParseTranslationTable(
491 "<Message>WM_PROTOCOLS: quit()"));
492 XSetWMProtocols(XtDisplay(topLevel), XtWindow(topLevel),
493 &wm_delete_window, 1);
494 XtAppMainLoop(ac);
495 return 0;
496 }
497