home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / snip9707.zip / QMENU.C < prev    next >
C/C++ Source or Header  |  1997-07-05  |  5KB  |  242 lines

  1. /* +++Date last modified: 05-Jul-1997 */
  2.  
  3. /*
  4.  *  QuickMenu VidMgr demonstration application.
  5.  *
  6.  *  Written in June 1996 by Andrew Clarke and released to the public domain.
  7.  *
  8.  *  Currently assumes 80x25 video output, but may be rewritten to
  9.  *  recognise other video dimensions.
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include "vidmgr.h"
  16. #include "vioimage.h"
  17.  
  18. #define maxx  vm_getscreenwidth()
  19. #define maxy  vm_getscreenheight()
  20.  
  21. #define PROG     "QuickMenu"
  22. #define VERSION  "1.2"
  23.  
  24. #define MAXITEMS 12
  25.  
  26. typedef struct
  27. {
  28.     char desc[40];
  29.     char cmd[250];
  30. }
  31. MENUDATA;
  32.  
  33. static VIOIMAGE sysimage;
  34. static MENUDATA menudata[MAXITEMS];
  35. static int menuitems, curritem, olditem;
  36.  
  37. int qmenuLoadMenu(char *fnm)
  38. {
  39.     FILE *fp;
  40.     int item, line;
  41.  
  42.     fp = fopen(fnm, "r");
  43.     if (fp == NULL)
  44.     {
  45.         perror(fnm);
  46.         return 0;
  47.     }
  48.  
  49.     item = 0;
  50.     line = 1;
  51.     while (item < MAXITEMS && !feof(fp))
  52.     {
  53.         char *p;
  54.         
  55.         if (fgets(menudata[item].desc, 40, fp) == NULL)
  56.         {
  57.             break;
  58.         }
  59.  
  60.         p = strrchr(menudata[item].desc, '\n');
  61.         if (p != NULL)
  62.         {
  63.             *p = '\0';
  64.         }
  65.  
  66.         if (*menudata[item].desc == '\0')
  67.         {
  68.             printf("%s(%d): Error! Expected description but found ''\n", fnm, line);
  69.             return 0;
  70.         }
  71.  
  72.         line++;
  73.         if (fgets(menudata[item].cmd, 250, fp) == NULL)
  74.         {
  75.             printf("%s(%d): Error! Expected command but reached end of file\n", fnm, line);
  76.             return 0;
  77.         }
  78.  
  79.         p = strrchr(menudata[item].cmd, '\n');
  80.         if (p != NULL)
  81.         {
  82.             *p = '\0';
  83.         }
  84.         
  85.         if (*menudata[item].cmd == '\0')
  86.         {
  87.             printf("%s(%d): Error! Expected command but found ''\n", fnm, line);
  88.             return 0;
  89.         }
  90.  
  91.         line++;
  92.         item++;
  93.     }
  94.  
  95.     fclose(fp);
  96.  
  97.     menuitems = item;
  98.  
  99.     return 1;
  100. }
  101.  
  102. void qmenuRun(void)
  103. {
  104.     int done, ch;
  105.     FILE *ofp;
  106.     char qmtmpfnm[12];
  107.     
  108. #if defined(OS2)
  109.     strcpy(qmtmpfnm, "$qmtemp.cmd");
  110. #elif defined(EMX)
  111.     if (_osmode == DOS_MODE)
  112.     {
  113.         strcpy(qmtmpfnm, "$qmtemp.bat");
  114.     }
  115.     else
  116.     {
  117.         strcpy(qmtmpfnm, "$qmtemp.cmd");
  118.     }
  119. #else
  120.     strcpy(qmtmpfnm, "$qmtemp.bat");
  121. #endif
  122.  
  123.     vm_attrib(24, (char) (7 + curritem), 56, (char) (7 + curritem), vm_mkcolor(WHITE, BLACK));
  124.  
  125.     done = 0;
  126.     while (!done)
  127.     {
  128.         if (curritem != olditem)
  129.         {
  130.             vm_attrib(24, (char) (7 + olditem), 56, (char) (7 + olditem), vm_mkcolor(BLACK, LIGHTGRAY));
  131.             vm_attrib(24, (char) (7 + curritem), 56, (char) (7 + curritem), vm_mkcolor(WHITE, BLACK));
  132.         }
  133.  
  134.         while (!vm_kbhit())
  135.         {
  136.             /* nada */
  137.         }
  138.  
  139.         ch = vm_getch();
  140.         switch (ch)
  141.         {
  142.         case 0x3b00:    /* F1 */
  143.             /* nada */
  144.             break;
  145.  
  146.         case 0x4800:    /* up arrow */
  147.             olditem = curritem;
  148.             if (curritem != 0)
  149.             {
  150.                 curritem--;
  151.             }
  152.             break;
  153.  
  154.         case 0x5000:    /* down arrow */
  155.             olditem = curritem;
  156.             if (curritem != menuitems - 1)
  157.             {
  158.                 curritem++;
  159.             }
  160.             break;
  161.  
  162.         case 0x4700:    /* Home */
  163.             olditem = curritem;
  164.             curritem = 0;
  165.             break;
  166.  
  167.         case 0x4f00:    /* End */
  168.             olditem = curritem;
  169.             curritem = menuitems - 1;
  170.             break;
  171.  
  172.         case 0x001b:    /* Escape */
  173.         case 0x3d00:    /* F3 */
  174.         case 0x4400:    /* F10 */
  175.         case 0x6b00:    /* Alt+F4 */
  176.         case 0x2d00:    /* Alt+X */
  177.             remove(qmtmpfnm);
  178.             done = 1;
  179.             break;
  180.  
  181.         case 0x000d:    /* Enter */
  182.             ofp = fopen(qmtmpfnm, "w");
  183.             fputs("@echo off\n", ofp);
  184.             fputs(menudata[curritem].cmd, ofp);
  185.             fputs("\n", ofp);
  186.             fputs("qm\n", ofp);
  187.             fclose(ofp);
  188.             done = 1;
  189.             break;
  190.             
  191.         default:
  192.             break;
  193.         }
  194.     }
  195. }
  196.  
  197. void qmenuTerm(void)
  198. {
  199.     vioImageRestore(&sysimage, 1, 1);
  200.     vioImageTerm(&sysimage);
  201.     vm_gotoxy(vm_startup.xpos, vm_startup.ypos);
  202.     vm_done();
  203. }
  204.  
  205. void qmenuInit(void)
  206. {
  207.     int item;
  208.  
  209.     printf("\n" PROG " " VERSION "; Written in June 1996 by Andrew Clarke.\n");
  210.     printf("Released to the public domain.\n");
  211.  
  212.     vm_init();
  213.     vioImageDefaults(&sysimage);
  214.     vioImageInit(&sysimage, maxx, maxy);
  215.     vioImageSave(&sysimage, 1, 1);
  216.  
  217.     if (qmenuLoadMenu("qmenu.mnu") != 1)
  218.     {
  219.         vm_done();
  220.         exit(EXIT_FAILURE);
  221.     }
  222.  
  223.     vm_setcursorstyle(CURSORHIDE);
  224.  
  225.     vm_attrib(22, 6, 62, 21, vm_mkcolor(LIGHTGRAY, BLACK));
  226.     vm_paintclearbox(20, 5, 60, 20, vm_mkcolor(BLACK, LIGHTGRAY));
  227.     vm_frame(23, 6, 57, 19, vm_mkcolor(BLACK, LIGHTGRAY), vm_frame_double);
  228.  
  229.     for (item = 0; item < menuitems; item++)
  230.     {
  231.         vm_puts(25, (char) (7 + item), menudata[item].desc);
  232.     }
  233. }
  234.  
  235. int main(void)
  236. {
  237.     qmenuInit();
  238.     qmenuRun();
  239.     qmenuTerm();
  240.     return 0;
  241. }
  242.