home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / MM1 / CMDS / pcxview_mm1.lzh / PCXVIEW / gui.c < prev    next >
C/C++ Source or Header  |  1997-05-13  |  5KB  |  183 lines

  1. #include <stdio.h>
  2. #include <modes.h>
  3. #include <signal.h>
  4.  
  5. #include <cgfx/wind.h>
  6. #include <cgfx/mouse.h>
  7. #define MAIN
  8. #include <cgfx/stdmenu.h>
  9. #include <cgfx/buffs.h>
  10. #include <math.h>
  11.  
  12. extern unsigned char colormap[256][3];
  13. extern short h_pos, v_pos, ncolors, gotsig, x_max, y_max;
  14. extern int scale;
  15.  
  16. #define MS_SIG 200
  17. #define KEY_SIG 201
  18. #define MN_PREV 30
  19. #define MN_NEXT 31
  20. #define MN_SEL 32
  21. #define MN_SCA 33
  22.  
  23. #define K_LEFT 2
  24. #define K_BACK 8
  25. #define K_RIGHT 6
  26. #define K_DOWN 14
  27. #define K_UP 16
  28.  
  29. MIDSCR _sclms[] = {
  30.    {"1", ENABLE, RESERVED, 0},
  31.    {"2", ENABLE, RESERVED, 0}
  32. };
  33.  
  34. #define SCL_SZ sizeof(_sclms)/sizeof(_sclms[0])
  35. MNDSCR wnmen[] =
  36. {
  37.  {"Prev", MN_PREV, 6, 0, ENABLE},
  38.  {"Next", MN_NEXT, 6, 0, ENABLE},
  39.  {"Select", MN_SEL, 6, 0, ENABLE},
  40.  {"Scale", MN_SCA, 6, SCL_SZ, ENABLE, RESERVED, _sclms}
  41. };
  42.  
  43. WNDSCR windat = {
  44.    "pcxview", sizeof(wnmen) / sizeof(wnmen[0]), 45, 10, WINSYNC, RESERVED, wnmen};
  45.  
  46. int wtype = WT_FSWIN | WC_MOVE | WC_GROW;
  47. MSRET ms;
  48.  
  49. openwin(actwin)
  50. int actwin;
  51. {
  52.    register int i;
  53.    int palfg, palbg, fg, bg, val;
  54.  
  55.    palfg = palbg = fg = -1;
  56.    bg = 1000;
  57.  
  58.    for ( i = 0; i < ncolors; i++ ) {
  59.       val = colormap[i][0] + colormap[i][1] + colormap[i][2];
  60.       if ( val < bg ) {
  61.          palbg = i;
  62.          bg = val;
  63.       }
  64.       if ( val > fg ) {
  65.          palfg = i;
  66.          fg = val;
  67.       }
  68.    }
  69.  
  70.    Mn_Colors(actwin, palfg, palbg, palbg, palfg, palfg);
  71.    _ss_wset(actwin, wtype, &windat);
  72.    Font(actwin, GRP_FONT, FNT_G8X8);
  73.    _ss_sbar(actwin, h_pos, v_pos);
  74. }
  75.  
  76. int mmenu(actwin, argc, argv)
  77. int actwin, argc;
  78. char **argv;
  79. {
  80.    int sel, item, n;
  81.    char c = 0;
  82.  
  83.    for (;;) {
  84.       _ss_ubar(actwin);
  85.       _ss_msig(actwin, MS_SIG);
  86.       n = _gs_rdy(actwin);
  87.       while ( n-- > 0 )
  88.           read(actwin, &c, 1);
  89.       _ss_ssig(actwin, KEY_SIG);
  90.       sleep(0);
  91.       _ss_rel(actwin);
  92.       if ( gotsig == KEY_SIG ) {
  93.         read(actwin, &c, 1);
  94.         switch ( c ) {
  95.         case K_RIGHT:
  96.              item = h_pos + x_max / 4;
  97.              if ( item > x_max )
  98.                 item = x_max;
  99.              if ( h_pos != item && repaint(item, v_pos) ) {
  100.                 h_pos = item;
  101.                 _ss_sbar(actwin, h_pos, v_pos);
  102.              }
  103.              break;
  104.         case K_BACK:
  105.         case K_LEFT:
  106.              item = h_pos - x_max / 4;
  107.              write(actwin, "", 1);   /* neutralize a possible bug in K-Windows */
  108.              if ( item < 0 )
  109.                 item = 0;
  110.              if ( h_pos != item && repaint(item, v_pos) ) {
  111.                 h_pos = item;
  112.                 _ss_sbar(actwin, h_pos, v_pos);
  113.              }
  114.              break;
  115.         case K_DOWN:
  116.              item = v_pos + y_max / 4;
  117.              if ( item > y_max )
  118.                 item = y_max;
  119.              if ( v_pos != item && repaint(h_pos, item) ) {
  120.                 v_pos = item;
  121.                 _ss_sbar(actwin, h_pos, v_pos);
  122.              }
  123.              break;
  124.         case K_UP:
  125.              item = v_pos - y_max / 4;
  126.              if ( item < 0 )
  127.                 item = 0;
  128.              if ( v_pos != item && repaint(h_pos, item) ) {
  129.                 v_pos = item;
  130.                 _ss_sbar(actwin, h_pos, v_pos);
  131.              }
  132.              break;
  133.         default :
  134.              return 0;
  135.         }
  136.       }
  137.       if (gotsig != MS_SIG)
  138.          continue;
  139.       _gs_mouse(actwin, &ms);
  140.       if (ms.pt_area != WR_CNTRL || ms.pt_valid == 0)
  141.          continue;                  /* not control region - ignore */
  142.  
  143.       sel = _gs_msel(actwin, &item);
  144.       switch ( sel ) {
  145.       case MN_CLOS:
  146.            Select(0);
  147.            kill(getpid(), SIGINT);
  148.            exit(0);                   /* should kill() fail */
  149.       case MN_PREV:
  150.            return -1;
  151.       case MN_NEXT:
  152.            return 0;
  153.       case MN_SEL:
  154.            list_box(actwin, &item, argv+1, argc-1, 5, 0, 40, 57, "Which file?");
  155.            if ( item == 0 )
  156.               break;
  157.            return item;
  158.       case MN_HSCRL:
  159.            if ( h_pos != item && repaint(item, v_pos) ) {
  160.               h_pos = item;
  161.               _ss_sbar(actwin, h_pos, v_pos);
  162.            }
  163.            break;
  164.       case MN_VSCRL:
  165.            if ( v_pos != item && repaint(h_pos, item) ) {
  166.               v_pos = item;
  167.               _ss_sbar(actwin, h_pos, v_pos);
  168.            }
  169.            break;
  170.       case MN_SCA:
  171.            switch ( item ) {
  172.            case 1: scale = 1;
  173.                    break;
  174.            case 2: scale = 2;
  175.                    break;
  176.            }
  177.            break;
  178.       default:
  179.            continue;
  180.       }
  181.    }
  182. }
  183.