+ return nl;
+}
+
+void
+dayback(Widget unused, XtPointer client_data, XtPointer call_data)
+{
+ (void)unused;
+ Widget disp = (Widget) client_data;
+ XmListCallbackStruct *list_cbs = (XmListCallbackStruct *) call_data;
+ char *nl = getmenu(days[list_cbs->item_position - 1]);
+ char *oldtext = XmTextGetString(disp) ;
+ XmTextReplace((Widget) disp, 0, strlen(oldtext), nl);
+ free(nl);
+ free(oldtext);
+}
+
+// Convert an array of string to an array of compound strings
+XmStringTable ArgvToXmStringTable (int argc, char **argv)
+{
+ XmStringTable new =
+ (XmStringTable) XtMalloc ((argc+1) * sizeof (XmString));
+ if (!new)
+ return (XmStringTable) 0;
+ new[argc] = (XmString) 0;
+ while (--argc >= 0)
+ new[argc] = XmStringGenerate ((XtPointer) argv[argc], "tag2",
+ XmCHARSET_TEXT, NULL);
+ return new;
+}
+
+int
+main(int argc, char *argv[])
+{
+ if (argc > 1) {
+ printf("Usage: %s\n", argv[0]);
+ exit(3);
+ }
+
+ // Initialize motif
+ Widget toplevel, rowcol, daysel, disp;
+ XmStringTable strs;
+ XtAppContext app;
+ Arg args[5];
+
+ XtSetLanguageProc(NULL, NULL, NULL);
+ toplevel = XtVaOpenApplication(&app, "Castle Menu", NULL, 0, &argc, argv,
+ NULL, sessionShellWidgetClass, NULL);
+
+ int n = 0;
+ XtSetArg (args[n], XmNorientation, XmHORIZONTAL); n++;
+ rowcol = XmCreateRowColumn(toplevel, "rowcol", args, n);
+ XtManageChild(rowcol);
+
+ // Create text widget to display menu
+ n = 0;
+ char *nl = getmenu("");
+ XtSetArg(args[n], XmNvalue, nl); n++;
+ XtSetArg(args[n], XmNeditable, False); n++;
+ XtSetArg(args[n], XmNcolumns, 80); n++;
+ XtSetArg(args[n], XmNrows, 20); n++;
+ XtSetArg (args[n], XmNeditMode, XmMULTI_LINE_EDIT); n++;
+ XtSetArg(args[n], XmNcursorPositionVisible, False); n++;
+ disp = XmCreateScrolledText(rowcol, "text", args, n);
+ XtManageChild(disp);
+ free(nl);
+
+ // Create day selector
+ strs = ArgvToXmStringTable (XtNumber(days), days);
+ daysel = XmCreateScrolledList(rowcol, "list", NULL, 0);
+ XtVaSetValues(daysel, XmNitems, strs, XmNitemCount, XtNumber(days), NULL);
+ XtAddCallback(daysel, XmNbrowseSelectionCallback, dayback, (XtPointer) disp);
+ XtManageChild(daysel);