home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / EFFO / pd8.lzh / SRC / popup.c < prev    next >
Text File  |  1990-04-13  |  2KB  |  74 lines

  1. /* put up a one-line menu consisting of the given fields and let op move
  2.  * between them with the same methods as sel_fld().
  3.  * return index of which he picked, or -1 if hit END.
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include "screen.h"
  8.  
  9. extern void bye();
  10.  
  11. #define    FLDGAP    2    /* inter-field gap */
  12. #define    MAXFLDS    32    /* max number of fields we can handle */
  13.  
  14. static char pup[] = "Select: ";
  15.  
  16. /* put up an array of strings on prompt line and let op pick one.
  17.  * start with field fn.
  18.  * N.B. we do not do much error/bounds checking.
  19.  */
  20. popup (fields, fn, nfields)
  21. char *fields[];
  22. int fn;
  23. int nfields;
  24. {
  25.     int fcols[MAXFLDS];    /* column to use for each field */
  26.     int i;
  27.  
  28.     if (nfields > MAXFLDS)
  29.         return (-1);
  30.  
  31.     again:
  32.     /* erase the prompt line; we are going to take it over */
  33.     c_pos (R_PROMPT, C_PROMPT);
  34.     c_eol();
  35.  
  36.     /* compute starting column for each field */
  37.     fcols[0] = sizeof(pup);
  38.     for (i = 1; i < nfields; i++)
  39.         fcols[i] = fcols[i-1] + strlen (fields[i-1]) + FLDGAP;
  40.  
  41.     /* draw each field, with comma after all but last */
  42.     c_pos (R_PROMPT, 1);
  43.     fputs (pup, stdout);
  44.     for (i = 0; i < nfields; i++) {
  45.         c_pos (R_PROMPT, fcols[i]);
  46.         printf (i < nfields-1 ? "%s," : "%s", fields[i]);
  47.     }
  48.  
  49.     /* let op choose one now; begin at fn.
  50.      */
  51.     while (1) {
  52.         c_pos (R_PROMPT, fcols[fn]);
  53.         switch (read_char()) {
  54.         case END: return (-1);
  55.         case QUIT:
  56.         f_prompt ("Exit ephem? (y) ");
  57.         if (read_char() == 'y')
  58.             bye();    /* never returns */
  59.         goto again;
  60.         case REDRAW: redraw_screen(2); goto again;
  61.         case VERSION: version(); goto again;
  62.         case '\r': return (fn);
  63.         case 'h':
  64.         if (--fn < 0)
  65.             fn = nfields - 1;
  66.         break;
  67.         case 'l':
  68.         if (++fn >= nfields)
  69.             fn = 0;
  70.         break;
  71.         }
  72.     }
  73. }
  74.