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