Viewer for plain ASCII The viewer is an applet corresponding to W3A/V. It works by opening an XmText widget and displaying the text in it. [[instance]] is an array that maps IDs to XmText widgets. [[ninstances]] is the number of assigned IDs, except that there may be lower numbered IDs that have been freed again. When [[closePlain]] is called, the corresponding widget element of [[instance]] is set to [[NULL]], so that the ID can be reused. [[openPlain]] finds the first unused element in [[instance]]. The index will be the ID that is passed to the caller. It then asks for a work area and creates an XmText widget under it. [[writePlain]] adds text to the XmText widget. [[closePlain]] destroys the XmText widget and marks the element in [[instance]] as free, by setting it to [[NULL]]. <<*>>= #include #include #include #define MAXINSTANCE 30 static struct {Widget w; int nchars;} instance[MAXINSTANCE]; static int ninstances = 0; Bool initPlain() { /* Nothing to initialize */ } long openPlain(const W3ADocumentInfo info, W3AWindow work_area) { Widget w; Arg args[3]; int i, nargs = 0; for (i = 0; i < ninstances; i++) if (! instance[i].w) break; XtSetArg(args[nargs], XmNeditMode, XmMULTI_LINE_EDIT); nargs++; XtSetArg(args[nargs], XmNeditable, FALSE); nargs++; w = XmCreateScrolledText(work_area, "plain", args, nargs); XtManageChild(w); XtRealizeWidget(w); instance[i].w = w; instance[i].nchars = 0; if (i == ninstances) ninstances++; return i; } int writePlain(long id, const char *buf, size_t nbytes) { char *s, *t; s = XtMalloc(nbytes + 1); *s = '\0'; strncat(s, buf, nbytes); for (t = s; *t; t++) if (*t == '\015') *t = ' '; XmTextInsert(instance[id].w, instance[id].nchars, s); XtFree(s); instance[id].nchars += nbytes; return nbytes; } Bool closePlain(long id) { int i; XtDestroyWidget(instance[id].w); instance[id].w = NULL; }