home *** CD-ROM | disk | FTP | other *** search
/ FreeWare Collection 2 / FreeSoftwareCollection2pd199x-jp.img / look / src / menu.c < prev    next >
Text File  |  1990-06-14  |  3KB  |  143 lines

  1. #include    <stdio.h>
  2. #include    <stdlib.h>
  3. #include    <string.h>
  4. #include    <ctype.h>
  5. #include    <mos.h>
  6.  
  7. #define    ERR        (-1)
  8.  
  9. #define    FRACOL    15
  10. #define    BAKCOL    8
  11. #define    CHRCOL    15
  12.  
  13. int        MENU_sub(lx,ly,rx,ry,fra,bak)
  14. int        lx,ly,rx,ry,fra,bak;
  15. {
  16.     int        no,i,y;
  17.     int        sw,mosx,mosy;
  18.  
  19.     MOS_rdpos(&sw,&mosx,&mosy);
  20.     if ( mosx >= lx && mosx <= rx && mosy > ly && mosy < ry ) {
  21.         no = (mosy - ly) / 16;
  22.         y = ly + no * 16;
  23.     } else
  24.         no = ERR;
  25.  
  26.     do {
  27.         if ( no != ERR )
  28.             fbox(lx,y,rx,y+15,fra,bak,4);
  29.         do {
  30.             MOS_rdpos(&sw,&mosx,&mosy);
  31.             if ( mosx >= lx && mosx <= rx &&
  32.                  mosy > ly && mosy <  ry )
  33.                 i = (mosy - ly) / 16;
  34.             else
  35.                 i = ERR;
  36.         } while ( sw != 0 && no == i );
  37.         if ( no != ERR )
  38.             fbox(lx,y,rx,y+15,fra,bak,4);
  39.         if ( (no = i) != ERR )
  40.             y = ly + no * 16;
  41.     } while ( sw != 0 );
  42.  
  43. /*****************
  44.     if ( no >= 0 ) {
  45.         fbox(lx,y,rx,y+15,fra,bak,4);
  46.         if ( mosclip(sw,mosx,mosy) == 0 )
  47.             no = ERR;
  48.         fbox(lx,y,rx,y+15,fra,bak,4);
  49.     }
  50. ****************/
  51.     return no;
  52. }
  53. int        MENU_select(menu)
  54. char    *menu[];
  55. {
  56.     int        len,max,no,i;
  57.     int        sw,mosx,mosy;
  58.     int        lx,ly,rx,ry,sx,sy;
  59.     char    *bkvram;
  60.  
  61.     MOS_rdpos(&sw,&mosx,&mosy);
  62.  
  63.     for ( len = max = 0 ; menu[max] != NULL ; max++ ) {
  64.         if ( len < strlen(menu[max]) )
  65.             len = strlen(menu[max]);
  66.     }
  67.     sx = len * 8 + 16;
  68.     sy = max * 16 + 8;
  69.     if ( (lx = mosx - sx / 2) < 0 )
  70.         lx = 0;
  71.     if ( (rx = lx + sx) >= 1024 ) {
  72.         lx = 1023 - sx; rx = 1023;
  73.     }
  74.     if ( (ly = mosy - 8) < 0 )
  75.         ly = 0;
  76.     if ( (ry = ly + sy) >= 512 ) {
  77.         ly = 511 - sy; ry = 511;
  78.     }
  79.     lx &= 0xfffe; rx &= 0xfffe;
  80.  
  81.     bkvram = (char *)getvram(lx,ly,rx,ry);
  82.     fbox(lx,ly,rx,ry,FRACOL,BAKCOL,0);
  83.  
  84.     for ( i=0 ; i < max ; i++ )
  85.         wrtstr(menu[i],lx + 8,ly + 4 + i * 16,0,CHRCOL,BAKCOL);
  86.  
  87.     do {
  88.         MOS_rdpos(&sw,&mosx,&mosy);
  89.     } while ( sw == 0 && 
  90.               mosx >= lx && mosx <= rx &&
  91.               mosy >= ly && mosy <= ry );
  92.  
  93.     if ( sw != 0 )
  94.         no = MENU_sub(lx + 4,ly + 4,rx - 4,ry - 4,FRACOL,FRACOL);
  95.     else
  96.         no = ERR;
  97.  
  98.     putvram(bkvram,lx,ly,rx,ry);
  99.     free(bkvram);
  100.     return no;
  101. }
  102. void    MSG_disp(char *str,int col)
  103. {
  104.     int        i,b,x,y;
  105.     int        lx,ly,rx,ry,sx;
  106.     char    *bkvram;
  107.  
  108.     MOS_rdpos(&b,&x,&y);
  109.  
  110.     sx = strlen(str) * 8 + 16;
  111.     if ( (lx = x - sx / 2) < 0 )
  112.         lx = 0;
  113.     if ( (rx = lx + sx) >= 1024 ) {
  114.         lx = 1023 - sx; rx = 1023;
  115.     }
  116.     if ( (ly = y - 8) < 0 )
  117.         ly = 0;
  118.     if ( (ry = ly + 24) >= 512 ) {
  119.         ly = 480 ; ry = 504;
  120.     }
  121.     lx &= 0xfffe; rx &= 0xfffe;
  122.  
  123.     bkvram = (char *)getvram(lx,ly,rx,ry);
  124.     fbox(lx,ly,rx,ry,col,BAKCOL,0);
  125.     wrtstr(str,lx + 8,ly + 4,0,col,BAKCOL);
  126.  
  127.     i = 50000;
  128.     do {
  129.         MOS_rdpos(&b,&x,&y);
  130.         i--;
  131.     } while ( i > 0 && x >= lx && x <= rx && y >= ly && y <= ry );
  132.  
  133.     putvram(bkvram,lx,ly,rx,ry);
  134.     free(bkvram);
  135. }
  136. void    DSP_error(char *frm,char *para)
  137. {
  138.     char    tmp[256];
  139.  
  140.     sprintf(tmp,frm,para);
  141.     MSG_disp(tmp,10);
  142. }
  143.