home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / Tools / freeWAIS-sf-1.1 / x / util.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-01-10  |  16.7 KB  |  791 lines

  1. /* WIDE AREA INFORMATION SERVER SOFTWARE:
  2.    No guarantees or restrictions.  See the readme file for the full standard
  3.    disclaimer.
  4.  
  5.    This is part of the X user-interface for the WAIS software.  Do with it
  6.    as you please.
  7.  
  8.    jonathan@Think.COM
  9.  
  10. */
  11.  
  12. /* Copyright (c) CNIDR (see ../COPYRIGHT) */
  13.  
  14.  
  15. #ifndef lint
  16. static char *RCSid = "$Header: /usr/local/ls6/src+data/src/freeWAIS-sf/x/RCS/util.c,v 1.3 1994/12/23 16:46:16 pfeifer Exp $";
  17. #endif
  18.  
  19. #define _C_UTIL
  20.  
  21. #define XWAIS
  22. #include "xwais.h"
  23.  
  24. #include <X11/Xaw/TextP.h> /* for XawLF */
  25.  
  26. #ifdef XawLF
  27. # define X11R5
  28. #else
  29. # ifdef X11R5
  30. #  undef X11R5
  31. # endif
  32. #endif
  33.  
  34. int get_selected_item(w)
  35. Widget w;
  36. {
  37. #ifdef MOTIF
  38.   int *positions, size, i;
  39.  
  40.   if(XmListGetSelectedPos(w, &positions, &size) == TRUE)
  41.     return (positions[0]-1);
  42.  
  43.   return NO_ITEM_SELECTED;
  44. #else
  45.   XawListReturnStruct *selected;
  46.  
  47.   if((selected = XawListShowCurrent(w)) == NULL)
  48.     return NO_ITEM_SELECTED;
  49.   else return selected->list_index;
  50. #endif
  51. }
  52.  
  53. int listlength(list)
  54. List list;
  55. {
  56.   int num;
  57.   List l;
  58.  
  59.   for(num = 0, l = list; l != NULL; num++, l = l->nextNode);
  60.  
  61.   return num;
  62. }
  63.  
  64. int charlistlength(list)
  65. char **list;
  66. {
  67.   int num;
  68.  
  69.   if(list) {
  70.     for(num = 0; list[num] != NULL; num++);
  71.     return num;
  72.   }
  73.   else 
  74.     return 0;
  75. }
  76.  
  77. void
  78. PrintStatusW(str, w, replacep)
  79. char * str;
  80. Widget w;
  81. boolean replacep;
  82. {
  83.   XEvent event;
  84.   XawTextBlock text;
  85.   static long lastlen = 0;
  86.   XawTextPosition pos = XawTextGetInsertionPoint(w);
  87.  
  88.   if(w == NULL)
  89.     fprintf(stderr, "Couldn't display status, invalid window.\n%s", str);
  90.   else {
  91.     text.length = strlen(str);
  92.     text.ptr = str;
  93.     text.firstPos = 0;
  94.     text.format = FMT8BIT;
  95.  
  96.     XawTextReplace(w, (replacep?pos-lastlen:pos), pos, &text);
  97.  
  98.     pos += text.length;
  99.     XawTextSetInsertionPoint(w, pos);
  100.     lastlen = text.length;
  101.     XawTextDisplay(w);
  102.   }
  103.   while((XtPending()&XtIMXEvent) != 0) {
  104.     XtNextEvent(&event);
  105.     XtDispatchEvent(&event);
  106.   }
  107. }
  108.  
  109. void PrintStatus
  110. #ifdef ANSI_LIKE /* use ansi varargs */
  111. (long logtype, long loglevel, char* format, ...)
  112. #else /* k&r */
  113. (va_alist)
  114. va_dcl
  115. #endif ANSI_LIKE
  116. {
  117.   va_list ap;            /* the variable arguments */
  118.   char message[1000];
  119.   static long last_type = STATUS_INFO;
  120.  
  121. #ifndef ANSI_LIKE
  122.   long logtype, loglevel;
  123.   char *format;
  124.  
  125.   va_start(ap);
  126.   logtype = va_arg(ap, int);
  127.   loglevel = va_arg(ap, int);
  128.   format = va_arg(ap, char*);
  129. #else
  130.   va_start(ap, format);
  131. #endif
  132.  
  133.   vsprintf(message, format, ap);
  134.  
  135.   PrintStatusW(message, messwidget, 
  136.            (last_type == STATUS_CONT && logtype == STATUS_CONT));
  137.   last_type = logtype;
  138.  
  139.   if (logtype == STATUS_URGENT) sleep(2);
  140. #ifndef ANSI_LIKE
  141.   va_end(ap);
  142. #endif
  143. }
  144.  
  145. void
  146. XwaisPrintf(str)
  147. char * str;
  148. {
  149.   PrintStatusW(str, messwidget, false);
  150. }
  151.  
  152. void
  153. ReplaceText(w, str)
  154. Widget w;
  155. char * str;
  156. {
  157. #ifdef MOTIF
  158.   int    lastpos;
  159.   char *spaces = "";
  160.   lastpos = XmTextGetLastPosition(w);
  161.     
  162.   XmTextReplace(w,0,lastpos,spaces);
  163.   XmTextSetInsertionPosition(w,0);
  164.  
  165.   XmTextReplace(w,0,0,str);
  166.   XmTextSetInsertionPosition(w,0);
  167. #else
  168.   ReplaceAsciiText(w, str);
  169. #endif
  170. }
  171.  
  172. void ReplaceAsciiText(w, str)
  173. Widget w;
  174. char* str;
  175. {
  176.   Arg args[ONE];
  177.  
  178.   XtSetArg(args[ZERO], XtNstring, str);
  179.   XtSetValues(w, args, ONE);
  180. }
  181.  
  182. Widget
  183. MakeCommandButton(box, name, function, vlink, hlink, data)
  184. Widget box, vlink, hlink;
  185. char *name;
  186. XtCallbackProc function;
  187. caddr_t data;
  188. {
  189.   Widget w;
  190.   Arg args[10];
  191.   Cardinal numargs;
  192.  
  193.   numargs = 0;
  194.   if(vlink != NULL) {
  195.     XtSetArg(args[numargs], XtNfromVert, vlink); numargs++;
  196.   }
  197.   if(hlink != NULL) {
  198.     XtSetArg(args[numargs], XtNfromHoriz, hlink); numargs++;
  199.   }
  200.   w = XtCreateManagedWidget(name, COMMANDBUTTON, box, args, numargs);
  201.   if (function != NULL)
  202.     XtAddCallback(w, COMMANDCALLBACK, function, data);
  203.   return w;
  204. }
  205.  
  206. Widget
  207. MakeListWidget(parent, name, list, callback, vlink, hlink)
  208. Widget parent, vlink, hlink;
  209. String name;
  210. char **list;
  211. XtCallbackProc callback;
  212. {
  213.   Arg args[6];
  214.   Cardinal numargs;
  215.   Widget ListW, form;
  216.  
  217.   numargs = 0;
  218.   if (vlink != NULL) {
  219.     XtSetArg(args[numargs], XtNfromVert, vlink); numargs++;
  220.   }
  221.   if (hlink != NULL) {
  222.     XtSetArg(args[numargs], XtNfromHoriz, hlink); numargs++;
  223.   }
  224. #ifdef MOTIF
  225.   form = XtCreateManagedWidget (name, formWidgetClass,
  226.                 parent, args, numargs);
  227.   numargs = 0;
  228.   XtSetArg( args[numargs], XmNselectionPolicy, XmSINGLE_SELECT); numargs++;
  229.   XtSetArg(args[numargs], XmNscrollBarDisplayPolicy, XmSTATIC); numargs++;
  230.   ListW = XmCreateScrolledList(form, name, args, numargs);
  231.   XtManageChild(ListW);
  232. #else
  233.   XtSetArg(args[numargs], XtNhorizDistance, 0); numargs++;
  234.   XtSetArg(args[numargs], XtNlist, list); numargs++;
  235.   XtSetArg(args[numargs], XtNforceColumns, True); numargs++;
  236.   XtSetArg(args[numargs], XtNdefaultColumns, 1); numargs++;
  237. #ifdef X11R5
  238.   ListW = XtCreateManagedWidget(name, myListWidgetClass,
  239.                 parent, args, numargs);
  240. #else
  241.   ListW = XtCreateManagedWidget(name, listWidgetClass,
  242.                 parent, args, numargs);
  243. #endif
  244. #endif
  245.   if (callback != NULL)
  246.     XtAddCallback(ListW, 
  247. #ifdef MOTIF
  248.           XmNdefaultActionCallback,
  249. #else
  250.           XtNcallback,
  251. #endif
  252.           callback, NULL);
  253.  
  254.   return ListW;
  255. }  
  256.  
  257. #ifdef MOTIF
  258. static void
  259.  moveViewport(p, action)
  260. Widget p;
  261. long action;
  262. {
  263.   return;
  264. }
  265. #else
  266. #include <X11/Xaw/ViewportP.h>
  267.  
  268. static void SetBar(w, top, length, total)
  269.     Widget w;
  270.     Position top;
  271.     Dimension length, total;
  272. {
  273.     XawScrollbarSetThumb(w, (float)top/(float)total,
  274.              (float)length/(float)total);
  275. }
  276.  
  277. #ifdef X11R5
  278.  
  279. static void
  280.  moveViewport(p, action)
  281. Widget p;
  282. long action;
  283. {
  284.   if (action == LIST_TOP) {
  285.     XawViewportSetLocation(p, 0.0, 0.0);
  286.   }
  287.   else if (action == LIST_BOTTOM) {
  288.     XawViewportSetLocation(p, 0.0, 1.0);
  289.   }
  290. }
  291.  
  292. #else /* X11R4 is badly broken.  Lets see if we can fix it. */
  293.  
  294. static void
  295.  moveViewport(p, action)
  296. Widget p;
  297. long action;
  298. {
  299.   ViewportWidget w = (ViewportWidget)p;
  300.   Widget child, clip, scrollbar;
  301.  
  302.   if(w->composite.num_children >= 3) { 
  303.     /* 3 widgets: clip, child, and scrollbar (I hope) */
  304.     clip =  w->composite.children[0];
  305.     child = w->composite.children[1];
  306.     scrollbar = w->composite.children[2];
  307.  
  308.     if (action == LIST_TOP) {
  309.       XtMoveWidget(child, 0, 0);
  310.       SetBar(scrollbar, 0,
  311.          clip->core.height, child->core.height );
  312.     }
  313.     else if (action == LIST_BOTTOM) {
  314.       XtMoveWidget(child, 0, -(child->core.height - clip->core.height));
  315.       SetBar(scrollbar, -(child->core.y),
  316.          clip->core.height, child->core.height );
  317.       return;
  318.     }
  319.   }
  320. }
  321.  
  322. #endif /* X11R5 */
  323. #endif /* MOTIF */
  324.  
  325. void RebuildListWidget(s, list, action)
  326. ScrollList s;
  327. String *list;
  328. long action;
  329. {
  330.   Widget p = XtParent(s->ListWidget);
  331.  
  332.   if(s->ListWidget == NULL)
  333.       s->ListWidget = MakeListWidget(p, s->name, list, s->callback, NULL, NULL);
  334.   else {
  335. #ifdef MOTIF
  336.     XmString strn;
  337.  
  338.     if (s != NULL) {
  339.       XmListDeleteAllItems( s->ListWidget );
  340.       while(*list) {
  341.     strn = XmStringCreateSimple( *list );
  342.     XmListAddItem( s->ListWidget, strn, 0);
  343.     XmStringFree( strn );
  344.     list++;
  345.       }
  346.     }
  347. #else
  348.     if (list != NULL) XawListChange(s->ListWidget, list, 0, 0, True);
  349.     moveViewport(p, action);
  350. #endif
  351.   }
  352. }
  353.  
  354. ScrollList
  355. MakeScrollList(parent, name, items, callback, vlink, hlink)
  356. Widget parent, vlink, hlink;
  357. XtCallbackProc callback;
  358. String name, *items;
  359. {
  360.   Arg arglist[10];
  361.   Cardinal num_args;
  362.   static char names[STRINGSIZE];
  363.   ScrollList result;
  364.  
  365.   result = (ScrollList) s_malloc(sizeof(_ScrollList));
  366.  
  367.   result->name = s_strdup(name);
  368.   result->callback = callback;
  369.  
  370.   num_args = 0;
  371.   if(vlink != NULL) {
  372.     XtSetArg(arglist[num_args], XtNfromVert, vlink); num_args++;
  373.   }
  374.   if(hlink != NULL) {
  375.     XtSetArg(arglist[num_args], XtNfromHoriz, hlink); num_args++;
  376.   }
  377.   XtSetArg(arglist[num_args], XtNorientation, XtorientVertical); num_args++;
  378.   result->ListWidget = MakeListWidget(parent, name, items, 
  379.                       callback, vlink, NULL);
  380.  
  381.   return(result);
  382. }
  383.  
  384. Widget 
  385. MakeStringBox(parent, name, string, vlink, hlink)
  386. Widget parent, vlink, hlink;
  387. String name, string;
  388. {
  389.   Arg args[5];
  390.   Cardinal numargs = 0;
  391.   Widget StringW;
  392.  
  393. #ifndef MOTIF
  394.   XtSetArg(args[numargs], XtNeditType, XawtextEdit); numargs++;
  395. #endif
  396.   XtSetArg(args[numargs], NSTRING, string); numargs++;
  397.   if(vlink != NULL) {
  398.     XtSetArg(args[numargs], XtNfromVert, vlink); numargs++;
  399.   }
  400.   if(hlink != NULL) {
  401.     XtSetArg(args[numargs], XtNfromHoriz, hlink); numargs++;
  402.   }
  403.  
  404.   StringW = XtCreateManagedWidget(name, TEXTWIDGET, parent, args, numargs);
  405.   return(StringW);  
  406. }
  407.  
  408. #ifdef MOTIF
  409. Widget 
  410. MakeScrolledText(parent, name, string, vlink, hlink)
  411. Widget parent, vlink, hlink;
  412. String name, string;
  413. {
  414.   Arg args[5];
  415.   Cardinal numargs = 0;
  416.   Widget form, StringW;
  417.   char *textWname[STRINGSIZE];
  418.  
  419.   if(vlink != NULL) {
  420.     XtSetArg(args[numargs], XtNfromVert, vlink); numargs++;
  421.   }
  422.   if(hlink != NULL) {
  423.     XtSetArg(args[numargs], XtNfromHoriz, hlink); numargs++;
  424.   }
  425.  
  426.   form = XtCreateManagedWidget (name, formWidgetClass,
  427.                 parent, args, numargs);
  428.  
  429.   sprintf(textWname, "textW%s", name);
  430.   numargs = 0;
  431.   XtSetArg(args[numargs], XmNeditMode, XmMULTI_LINE_EDIT); numargs++;
  432.  
  433.   StringW = XmCreateScrolledText(form, textWname, args, numargs);
  434.   XtManageChild(StringW);
  435.   ReplaceText(StringW, string);
  436.   return(StringW);  
  437. }
  438.  
  439. Widget MakeSeparator(parent, name, vlink)
  440. Widget parent, vlink;
  441. String name;
  442. {
  443.   Arg args[5];
  444.   Cardinal numargs = 0;
  445.   Widget sep;
  446.  
  447.   if(vlink != NULL) {
  448.     XtSetArg(args[numargs], XtNfromVert, vlink); numargs++;
  449.   }
  450.  
  451.   sep = XtCreateManagedWidget(name, xmSeparatorWidgetClass, parent,
  452.                   args, numargs);
  453.  
  454.   return(sep);  
  455. }
  456. #endif
  457.  
  458. /*    Function Name: GetString
  459.  *    Description: retrieves the string from a asciiText widget.
  460.  *    Arguments: w - the ascii text widget.
  461.  *    Returns: the filename.
  462.  */
  463.  
  464. String
  465. GetString(w)
  466. Widget w;
  467. {
  468.   String str;
  469.   Arg args[1];
  470.   
  471.   XtSetArg(args[0], NSTRING, &str);
  472.   XtGetValues( w, args, ONE);
  473.   return(str);
  474. }
  475.  
  476. String
  477. GetAsciiString(w)
  478. Widget w;
  479. {
  480.   String str;
  481.   Arg args[1];
  482.   
  483.   XtSetArg(args[0], XtNstring, &str);
  484.   XtGetValues( w, args, ONE);
  485.   return(str);
  486. }
  487.  
  488. Widget MakeLabel(parent, name, label, vlink, hlink)
  489. Widget parent, vlink, hlink;
  490. char *name, *label;
  491. {
  492.   Arg args[5];
  493.   Cardinal numargs;
  494.   Widget labelwid;
  495. #ifdef MOTIF
  496.   XmString strn = XmStringCreateSimple(label);
  497. #else
  498.   char* strn = label;
  499. #endif
  500.  
  501.   numargs = 0;
  502.   XtSetArg(args[numargs], NLABEL, strn); numargs++;
  503.   if(vlink != NULL) {
  504.     XtSetArg(args[numargs], XtNfromVert, vlink); numargs++;
  505.   }
  506.   if(hlink != NULL) {
  507.     XtSetArg(args[numargs], XtNfromHoriz, hlink); numargs++;
  508.   }
  509.   /* XtSetArg(args[numargs], XtNborderWidth, 0); numargs++; Use default borderWidth dimension; i.e. 1 */
  510.   labelwid = XtCreateManagedWidget(name,LABELWIDGET, parent, args, numargs);
  511. #ifdef MOTIF
  512.   XmStringFree( strn );
  513. #endif
  514.   return(labelwid);
  515. }
  516.  
  517. #define BEFORE 1
  518. #define DURING 2
  519. #define QUOTE 5
  520.  
  521. /* ripped out of gmacs-ui.c */
  522. int find_string_slot(source, key, value, value_size, delete_internal_quotes)
  523. char *source, *key, *value;
  524. long value_size;
  525. boolean delete_internal_quotes;
  526. {
  527.   char ch;
  528.   short state = BEFORE;
  529.   long position = 0;  /* position in value */
  530.   char *pos =(char*)strstr(source, key); /* address into source */
  531.  
  532.   value[0] = '\0';        /* initialize to nothing */
  533.  
  534.   if(NULL == pos)
  535.     return(1);
  536.  
  537.   for(pos = pos + strlen(key); pos < source + strlen(source); pos++){
  538.     ch = *pos;
  539.     if((state == BEFORE) && (ch == '\"'))
  540.       state = DURING;
  541.     else if ((state == DURING) && (ch == '\\')){
  542.       state = QUOTE;    
  543.       if(!delete_internal_quotes){
  544.     value[position] = ch;
  545.     position++;
  546.     if(position >= value_size){
  547.       value[value_size - 1] = '\0';
  548.       return(-1);
  549.     }
  550.       }
  551.     }
  552.     else if ((state == DURING) && (ch == '"')){    
  553.       value[position] = '\0';
  554.       return(0);
  555.     }
  556.     else if ((state == QUOTE) || (state == DURING)){
  557.       if(state ==  QUOTE)
  558.     state = DURING;
  559.       value[position] = ch;
  560.       position++;
  561.       if(position >= value_size){
  562.     value[value_size - 1] = '\0';
  563.     return(-1);
  564.       }
  565.     }
  566.     /* otherwise we are still before the start of the value */
  567.   }
  568.   value[position] = '\0';
  569.   return(-1); /* error because we are in the middle of the string */
  570. }
  571.  
  572. void find_value(source, key, value, value_size)
  573. char *source, *key, *value;
  574. int value_size;
  575. {
  576.   char ch;
  577.   long position = 0;  /* position in value */
  578.   char *pos =(char*)strstr(source, key); /* address into source */
  579.  
  580.   value[0] = '\0';        /* initialize to nothing */
  581.  
  582.   if(NULL == pos)
  583.     return;
  584.  
  585.   pos = pos + strlen(key);
  586.   ch = *pos;
  587.   /* skip leading quotes and spaces */
  588.   while((ch == '\"') || (ch == ' ')) {
  589.     pos++; ch = *pos;
  590.   }
  591.   for(position = 0; pos < source + strlen(source); pos++){
  592.     if((ch = *pos) == ' ') {
  593.       value[position] = '\0';
  594.       return;
  595.     }
  596.     value[position] = ch;
  597.     position++;
  598.     if(position >= value_size){
  599.       value[value_size - 1] = '\0';
  600.       return;
  601.     }
  602.   }
  603.   value[position] = '\0';
  604. }
  605.  
  606. void SortSources()
  607. {
  608.   Boolean Changed = TRUE;
  609.   Source s;
  610.   SList sl;
  611.  
  612.   while(Changed) {
  613.     Changed = FALSE;
  614.     for(sl = Sources; sl->nextSource != NULL; sl = sl->nextSource) {
  615.       if(sl->nextSource->thisSource->name == NULL) {
  616.     Changed = TRUE;
  617.     sl->nextSource = sl->nextSource->nextSource;
  618.       }
  619.       else
  620.     if(0 < strcmp(sl->thisSource->name, sl->nextSource->thisSource->name)) {
  621.       Changed = TRUE;
  622.       s = sl->thisSource;
  623.       sl->thisSource = sl->nextSource->thisSource;
  624.       sl->nextSource->thisSource = s;
  625.     }
  626.     }
  627.   }
  628. }
  629.  
  630. char *
  631. get_filename(name)
  632. char* name;
  633. {
  634.   char *result, *loc;
  635.   long i;
  636.  
  637.   loc = (char*)strchr(name,' ');
  638.   if (loc == NULL) return name;
  639.  
  640.   i = (long)loc - (long)name;
  641.   
  642.   result = s_malloc(i+1);
  643.   strncpy(result, name, i);
  644.   result[i] = 0;
  645.   return result;
  646. }
  647.  
  648. void
  649. Feep()
  650. {
  651.   if (CurDpy != NULL)
  652.     XBell(CurDpy, 0);
  653. }
  654.  
  655. extern int alphasort();
  656.  
  657. char **
  658. GetDirNames(directory)
  659. char *directory;
  660. {
  661.   char **result;
  662.   struct dirent **list;
  663.   int i, j;
  664.  
  665.   if ((j = scandir(directory, &list, NULL, alphasort)) < 0) {
  666.     PrintStatus(STATUS_URGENT, STATUS_HIGH,
  667.         "Error on open of source directory: %s.\n", directory);
  668.     result = NULL;
  669.   }
  670.   else {
  671.     result = (char**) s_malloc((j+1) * sizeof(char*));
  672.  
  673.     for (i = 0; i < j; i++) {
  674.       result[i] = s_strdup(list[i]->d_name);
  675.       s_free(list[i]);
  676.     }
  677.     s_free(list);
  678.   }
  679.   return result;
  680. }
  681.  
  682. #include "xwaist.bit"
  683.  
  684. void SettIcon(parent)
  685. Widget parent;
  686. {
  687.   Arg args[1];
  688.   Pixmap icon_pixmap = None;
  689.  
  690.   XtSetArg (args[ZERO], XtNiconPixmap, &icon_pixmap);
  691.   XtGetValues(parent, args, ONE);
  692.   if (icon_pixmap == None) {
  693.     XtSetArg(args[ZERO], XtNiconPixmap, 
  694.          XCreateBitmapFromData(XtDisplay(parent),
  695.                    XtScreen(parent)->root,
  696.                    xwaist_bits, xwaist_width, xwaist_height));
  697.     XtSetValues (parent, args, ONE);
  698.   }
  699. }
  700.  
  701. static Widget helpwindow = NULL;
  702.  
  703. void EndHelp(w, closure, call_data)
  704. Widget w;
  705. XtPointer closure, call_data;
  706. {
  707.   XtPopdown(helpwindow);
  708. }
  709.  
  710. #ifdef MOTIF
  711. static insert_help(w, filename)
  712. char *filename;
  713. {
  714.   FILE *hf;
  715.   char buffer[10000];
  716.   int loc;
  717.  
  718.   if((hf= fopen(filename, "r")) == NULL) {
  719.     XwaisPrintf("Error opening help file");
  720.   }
  721.   loc = fread(buffer, 1, 10000, hf);
  722.   buffer[loc] = 0;
  723.   ReplaceText(w, buffer);
  724.  
  725.   fclose(hf);
  726. }  
  727. #endif
  728.  
  729. /* ARGSUSED */
  730. void XwaisHelp(w, closure, call_data)
  731. Widget w;
  732. XtPointer closure, call_data;
  733. {
  734.   Widget textwindow, frame, button;
  735.   Arg arglist[10];
  736.   Cardinal num_args;
  737.   static String items[] = {NULL};
  738.  
  739.   if (helpwindow == NULL) {
  740.     num_args = 0;
  741.     XtSetArg(arglist[num_args], XtNtitle, "X WAIS Help"); num_args++;
  742.     XtSetArg(arglist[num_args], XtNiconName, "X WAIS Help"); num_args++;
  743.     helpwindow = XtCreatePopupShell("textpopup", applicationShellWidgetClass,
  744.                     top, arglist, num_args);
  745.     frame =
  746.       XtCreateManagedWidget("helppopupform", formWidgetClass,
  747.                 helpwindow, NULL, ZERO);
  748. #ifdef MOTIF
  749.     textwindow =
  750.       MakeScrolledText(frame, "textWindow", "", NULL, NULL);
  751.     button = MakeCommandButton(frame, "tdone", EndHelp,
  752.                    XtParent(XtParent(textwindow)), NULL);
  753.     insert_help(textwindow, app_resources.helpFile);
  754. #else
  755.     num_args = 0;
  756.     XtSetArg(arglist[num_args], XtNtype, XawAsciiFile); num_args++;
  757.     XtSetArg(arglist[num_args], XtNstring, app_resources.helpFile); num_args++;
  758.     XtSetArg(arglist[num_args], XtNeditType, XawtextRead); num_args++;
  759.     textwindow =
  760.       XtCreateManagedWidget("textWindow", asciiTextWidgetClass, frame, arglist, num_args);
  761.     button = MakeCommandButton(frame, "tdone", EndHelp,
  762.                    textwindow, NULL, NULL);
  763. #endif
  764.     SettIcon(helpwindow);
  765.   }
  766.   XtPopup(helpwindow, XtGrabNone);
  767. }
  768.  
  769. /*
  770.  * $Log: util.c,v $
  771.  * Revision 1.3  1994/12/23  16:46:16  pfeifer
  772.  * Use default borderWidth dimension; i.e. 1
  773.  *
  774.  * Revision 1.3  1994/12/23  16:46:16  pfeifer
  775.  * Use default borderWidth dimension; i.e. 1
  776.  *
  777.  * Revision 1.2  1994/08/05  07:27:37  pfeifer
  778.  * Release beta 04
  779.  *
  780.  * Revision 1.1  1993/02/16  15:10:18  freewais
  781.  * Initial revision
  782.  *
  783.  * Revision 1.14  92/06/22  10:50:22  jonathan
  784.  * Removed app_context from calls, using Xt calls instead.
  785.  * 
  786.  * Revision 1.13  92/06/15  13:46:55  jonathan
  787.  * Modified PrintStatus to use variable length arguments, and added two new
  788.  * args: logtype and loglevel (defined in ui/status.h).
  789.  * 
  790.  */
  791.