home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 2 / crawlyvol2.bin / program / c / spdsrc / testspd.c next >
C/C++ Source or Header  |  1994-03-31  |  11KB  |  438 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <aes.h>
  5. #include <vdi.h>
  6. #include <osbind.h>
  7. #include <mintbind.h>
  8. #include "testspde.h"
  9. #include "testspde.c"
  10.  
  11. #define FALSE 0
  12. #define TRUE  1
  13.  
  14. void fix_tree(OBJECT *,int);
  15.  
  16. int main(int, char*[]);
  17. void handle_message(short[]);
  18. int redraw(int, GRECT*);
  19. void open_window(void);
  20. void redraw_all(void);
  21. short show_othersize(void);
  22. void show_about(void);
  23. void make_fontmenu(void);
  24. void handle_menu(OBJECT*, short);
  25. short show_otherwidth(void);
  26. void handle_dragdrop(short, short);
  27.  
  28. short int ApId;
  29. short vdihandle, work_in[] = {1,1,1,1,1,1,1,1,1,1,2}, work_out[57],
  30.       numfonts, fontsize, fontwidth, font;
  31. short windowhandle, quit = FALSE;
  32. char menu_title[] = "  Test Speedo";
  33. char **fontnames;
  34. OBJECT *smenufont;
  35.  
  36. int main(int argc, char *argv[])  {
  37.   char *altNoVDIWork = "[3][Gem is unable to|allocate a workstation.|The program must abort.[ OK ]";
  38.   short msgbuf[8], dum;
  39.   
  40.     ApId = appl_init();
  41.     if (ApId == -1)
  42.         return -1;
  43.     
  44.     if (_AESglobal[0] < 0x0303)  {
  45.         form_alert(1, "[3][Gem v3.3 or above|is required.][ Abort ]");
  46.         appl_exit();
  47.         return -1;
  48.     }
  49.     
  50.     work_in[0] = 2 + Getrez();
  51.     vdihandle = graf_handle(&dum, &dum, &dum, &dum);
  52.     v_opnvwk(work_in, &vdihandle, work_out);
  53.     if (vdihandle == 0)  {
  54.         form_alert(1, altNoVDIWork);
  55.         appl_exit();
  56.         return -1;
  57.     }
  58.     
  59.     numfonts = vst_load_fonts(vdihandle, 0);
  60.     fontsize = 40;
  61.     fontwidth = 100;
  62.     font = 7;
  63.     
  64.     if (_AESglobal[1] == -1)  menu_register(ApId, menu_title);
  65.     
  66.     rsrc_init();
  67.     make_fontmenu();
  68.     menu_bar(MAINMENU, 1);
  69.     menu_icheck(smenufont, font - 1, 1);
  70.     menu_icheck(SIZEMENU, SI_OTHER, 1);
  71.     menu_icheck(WIDTHMENU, WI_100, 1);
  72.         
  73.     open_window();
  74.     
  75.     while (!quit)  {
  76.         evnt_mesag(msgbuf);
  77.         handle_message(msgbuf);
  78.     }
  79.     
  80.     menu_bar(MAINMENU, 0);
  81.     vst_unload_fonts(vdihandle, 0);
  82.     v_clsvwk(vdihandle);
  83.     appl_exit();
  84.     
  85.     return 0;
  86. }
  87.  
  88.  
  89. void open_window(void)  {
  90.     GRECT desk;
  91.     
  92.     wind_get(0, WF_PREVXYWH, &desk.g_x, &desk.g_y, &desk.g_w, &desk.g_h);
  93.   windowhandle = wind_create(NAME|CLOSE|MOVE|SIZE, desk.g_x, desk.g_y, desk.g_w, desk.g_h);
  94.   wind_title(windowhandle, "Test");
  95.   wind_info(windowhandle, "");
  96.   wind_open(windowhandle, 100,100,350,200);
  97. }
  98.  
  99.  
  100. void handle_message(short msgbuf[])  {
  101.     int (*fptr)(int,GRECT*);
  102.     
  103.     switch(msgbuf[0])  {
  104.     case MN_SELECTED:
  105.     handle_menu((OBJECT *) *((long *) (msgbuf+5)), msgbuf[4]);
  106.     menu_tnormal(MAINMENU, msgbuf[3], 1);
  107.         break;
  108.     case WM_REDRAW:
  109.       fptr = &redraw;
  110.         wind_redraw(windowhandle, (GRECT *) (msgbuf + 4), fptr);
  111.         break;
  112.     case WM_TOPPED:
  113.         if (msgbuf[3] == windowhandle)
  114.             wind_set(msgbuf[3], WF_TOP, msgbuf[3], 0, 0, 0);
  115.         break;
  116.     case WM_CLOSED:
  117.         if (msgbuf[3] == windowhandle)  {
  118.             wind_close(msgbuf[3]);
  119.             wind_delete(msgbuf[3]);
  120.             quit = TRUE;
  121.         }
  122.         break;
  123.     case WM_MOVED:
  124.         if (msgbuf[3] == windowhandle)
  125.             wind_set(msgbuf[3], WF_CURRXYWH, msgbuf[4], msgbuf[5], msgbuf[6],
  126.                      msgbuf[7]);
  127.         break;
  128.     case WM_SIZED:
  129.         if (msgbuf[3] == windowhandle)  {
  130.             wind_set(msgbuf[3], WF_CURRXYWH, msgbuf[4], msgbuf[5], msgbuf[6],
  131.                      msgbuf[7]);
  132.             redraw_all();
  133.         }
  134.         break;
  135.     case AP_DRAGDROP:
  136.         if (msgbuf[3] == windowhandle)  {
  137.             handle_dragdrop(msgbuf[1], msgbuf[7]);
  138.         }
  139.         break;
  140.     }
  141. }
  142.  
  143.  
  144. void handle_menu(OBJECT *tree, short item)  {
  145.     if (tree == MAINMENU)  {
  146.         switch (item)  {
  147.         case ME_ABOUT:
  148.             show_about();
  149.             break;
  150.         case ME_FONT:
  151.             break;
  152.         case ME_QUIT:
  153.             wind_close(windowhandle);
  154.             wind_delete(windowhandle);
  155.             quit = TRUE;
  156.             break;
  157.         }
  158.     }
  159.     
  160.     if (tree == smenufont)  {
  161.         menu_icheck(smenufont, font - 1, 0);
  162.         font = item + 1;
  163.         redraw_all();
  164.         menu_icheck(smenufont, font - 1, 1);
  165.     }
  166.     
  167.     if (tree == SIZEMENU)  {
  168.         menu_icheck(SIZEMENU, SI_10, 0);
  169.         menu_icheck(SIZEMENU, SI_12, 0);
  170.         menu_icheck(SIZEMENU, SI_18, 0);
  171.         menu_icheck(SIZEMENU, SI_24, 0);
  172.         menu_icheck(SIZEMENU, SI_OTHER, 0);
  173.         switch (item)  {
  174.         case SI_10:
  175.             fontsize = 10;
  176.             menu_icheck(SIZEMENU, SI_10, 1);
  177.             break;
  178.         case SI_12:
  179.             fontsize = 12;
  180.             menu_icheck(SIZEMENU, SI_12, 1);
  181.             break;
  182.         case SI_18:
  183.             fontsize = 18;
  184.             menu_icheck(SIZEMENU, SI_18, 1);
  185.             break;
  186.         case SI_24:
  187.             fontsize = 24;
  188.             menu_icheck(SIZEMENU, SI_24, 1);
  189.             break;
  190.         case SI_OTHER:
  191.             fontsize = show_othersize();
  192.             menu_icheck(SIZEMENU, SI_OTHER, 1);
  193.             break;
  194.         }
  195.         redraw_all();
  196.     }
  197.     
  198.     if (tree == WIDTHMENU)  {
  199.         menu_icheck(WIDTHMENU, WI_50, 0);
  200.         menu_icheck(WIDTHMENU, WI_75, 0);
  201.         menu_icheck(WIDTHMENU, WI_100, 0);
  202.         menu_icheck(WIDTHMENU, WI_150, 0);
  203.         menu_icheck(WIDTHMENU, WI_200, 0);
  204.         menu_icheck(WIDTHMENU, WI_OTHER, 0);
  205.         switch(item)  {
  206.         case WI_50:
  207.             fontwidth = 50;
  208.             menu_icheck(WIDTHMENU, WI_50, 1);
  209.             break;
  210.         case WI_75:
  211.             fontwidth = 75;
  212.             menu_icheck(WIDTHMENU, WI_75, 1);
  213.             break;
  214.         case WI_100:
  215.             fontwidth = 100;
  216.             menu_icheck(WIDTHMENU, WI_100, 1);
  217.             break;
  218.         case WI_150:
  219.             fontwidth = 150;
  220.             menu_icheck(WIDTHMENU, WI_150, 1);
  221.             break;
  222.         case WI_200:
  223.             fontwidth = 200;
  224.             menu_icheck(WIDTHMENU, WI_200, 1);
  225.             break;
  226.         case WI_OTHER:
  227.             fontwidth = show_otherwidth();
  228.             menu_icheck(WIDTHMENU, WI_OTHER, 1);
  229.             break;
  230.         }
  231.         redraw_all();
  232.     }
  233. }
  234.  
  235.  
  236. void handle_dragdrop(short tapid, short pipeno)  {
  237.     int pipehandle;
  238.     char pipename[128], myfiletypes[32], *msghdr, size;
  239.     
  240.     /* Open pipe to originator */
  241.     sprintf(pipename, "U:\\PIPE\\DRAGDROP.%c%c", *((char *)&pipeno), *((char*)(&pipeno)+1));
  242.     printf("%s\n", pipename);
  243.     pipehandle = Fopen(pipename, 1);
  244.     
  245.     /* Send acceptable data types */
  246.     sprintf(myfiletypes, "ARGS");
  247.     Fwrite(pipehandle, 32, (void *) myfiletypes);
  248.     
  249.     /* Find size of, reserve memory for, and read message header */
  250.     while (Fread(pipehandle, 2, (void *) &size) > 0)  {
  251.         msghdr = (char *) malloc(size);
  252.         Fread(pipehandle, size, (void *) msghdr);
  253.         if (strncmp(msghdr, "ARGS", 4))  {
  254.             form_alert(1, "[1][DRAGDROP successfully|negotiated][Continue]");
  255.         }
  256.         Fputchar(pipehandle, 2, 0);   /* Send DD_EXT */
  257.         free((void *) msghdr);
  258.     }
  259.     Fclose(pipehandle);
  260. }
  261.  
  262.  
  263. int redraw(int windowhandle, GRECT *rect)  {
  264.     short pxyarray[4], fontindex, charw, charh, cellw, cellh, dummy, extent[8];
  265.     char fontname[50];
  266.     GRECT workarea;
  267.     
  268.     pxyarray[0] = rect->g_x;
  269.     pxyarray[1] = rect->g_y;
  270.     pxyarray[2] = rect->g_x + rect->g_w - 1;
  271.     pxyarray[3] = rect->g_y + rect->g_h - 1;
  272.     vs_clip(vdihandle, 1, pxyarray);
  273.     
  274.     vsf_color(vdihandle, 0);
  275.     vsf_style(vdihandle, 8);
  276.     vsf_interior(vdihandle, 2);
  277.     vr_recfl(vdihandle, pxyarray);
  278.     fontindex = vqt_name(vdihandle, font, fontname);
  279.     vst_font(vdihandle, fontindex);
  280.     vst_arbpt(vdihandle, fontsize, &charw, &charh, &cellw, &cellh);
  281.     vst_setsize(vdihandle, (int) ((float) fontwidth * (float) fontsize / 100.0), &charw, &charh, &cellw, &cellh);
  282.     vst_alignment(vdihandle, 0, 2, &dummy, &dummy);
  283.     wind_get(windowhandle, WF_WORKXYWH, &workarea.g_x, &workarea.g_y, &workarea.g_w, &workarea.g_h);
  284.     
  285.     vqt_extent(vdihandle, fontname, extent);
  286.     v_ftext(vdihandle, workarea.g_x + workarea.g_w / 2 - extent[4] / 2,
  287.             workarea.g_y + workarea.g_h / 2 - charh / 2, fontname);
  288.  
  289.     return 1;
  290. }
  291.  
  292.  
  293. short show_otherwidth(void)  {
  294.     short x, y, w, h, ret;
  295.     int newwidth;
  296.     
  297.     sprintf(((TEDINFO *)OTHERWIDTH[OS_TEXT].ob_spec)->te_ptext, "%3d", fontwidth);
  298.     
  299.     form_center(OTHERWIDTH, &x, &y, &w, &h);
  300.     x-=2;
  301.     y-=2;
  302.     w+=4;
  303.     h+=4;
  304.     wind_update(BEG_UPDATE);
  305.     form_dial(FMD_START, x, y, w, h, x, y, w, h);
  306.     
  307.     objc_draw(OTHERWIDTH, 0, 7, x, y, w, h);
  308.     ret = form_do(OTHERWIDTH, 0);
  309.     sscanf(((TEDINFO *)OTHERWIDTH[OS_TEXT].ob_spec)->te_ptext, "%d", &newwidth);
  310.     
  311.     OTHERWIDTH[OS_OK].ob_state &= ~SELECTED;
  312.     OTHERWIDTH[OS_CANCEL].ob_state &= ~SELECTED;
  313.     form_dial(FMD_FINISH, x, y, w, h, x, y, w, h);
  314.     wind_update(END_UPDATE);
  315.     
  316.     if (ret == OS_OK)
  317.         return (short) newwidth;
  318.     else
  319.         return fontwidth;
  320. }
  321.  
  322.  
  323. short show_othersize(void)  {
  324.     short x, y, w, h, ret;
  325.     int newsize;
  326.     
  327.     sprintf(((TEDINFO *)OTHERSIZE[OS_TEXT].ob_spec)->te_ptext, "%3d", fontsize);
  328.     
  329.     form_center(OTHERSIZE, &x, &y, &w, &h);
  330.     x-=2;
  331.     y-=2;
  332.     w+=4;
  333.     h+=4;
  334.     wind_update(BEG_UPDATE);
  335.     form_dial(FMD_START, x, y, w, h, x, y, w, h);
  336.     
  337.     objc_draw(OTHERSIZE, 0, 7, x, y, w, h);
  338.     ret = form_do(OTHERSIZE, 0);
  339.     sscanf(((TEDINFO *)OTHERSIZE[OS_TEXT].ob_spec)->te_ptext, "%d", &newsize);
  340.     
  341.     OTHERSIZE[OS_OK].ob_state &= ~SELECTED;
  342.     OTHERSIZE[OS_CANCEL].ob_state &= ~SELECTED;
  343.     form_dial(FMD_FINISH, x, y, w, h, x, y, w, h);
  344.     wind_update(END_UPDATE);
  345.     
  346.     if (ret == OS_OK)
  347.         return (short) newsize;
  348.     else
  349.         return fontsize;
  350. }
  351.  
  352.  
  353. void show_about(void)  {
  354.     short x, y, w, h;
  355.     
  356.     form_center(ABOUT, &x, &y, &w, &h);
  357.     x-=2;
  358.     y-=2;
  359.     w+=4;
  360.     h+=4;
  361.     wind_update(BEG_UPDATE);
  362.     form_dial(FMD_START, x, y, w, h, x, y, w, h);
  363.     
  364.     objc_draw(ABOUT, 0, 7, x, y, w, h);
  365.     form_do(ABOUT, 0);
  366.     
  367.     ABOUT[AB_OK].ob_state &= ~SELECTED;
  368.     form_dial(FMD_FINISH, x, y, w, h, x, y, w, h);
  369.     wind_update(END_UPDATE);
  370. }
  371.  
  372.  
  373. void redraw_all(void)  {
  374.     GRECT desk;
  375.  
  376.     wind_get(0, WF_PREVXYWH, &desk.g_x, &desk.g_y, &desk.g_w, &desk.g_h);
  377.     wind_redraw(windowhandle, &desk, &redraw);
  378. }
  379.  
  380.  
  381. void make_fontmenu(void)  {
  382.     int n;
  383.     char temp[50];
  384.     MENU submenu;
  385.     
  386.     /* Allocate space for font names and object tree */
  387.     fontnames = (char **) malloc(numfonts * sizeof(char *));
  388.     smenufont = (OBJECT *) malloc((numfonts + 1) * sizeof(OBJECT));
  389.     
  390.     /* Build object tree for submenu */
  391.     smenufont[ROOT].ob_next = -1;
  392.     smenufont[ROOT].ob_head = 1;
  393.     smenufont[ROOT].ob_tail = numfonts-1;
  394.     smenufont[ROOT].ob_type = G_BOX;
  395.     smenufont[ROOT].ob_flags = 0x0;
  396.     smenufont[ROOT].ob_state = 0x0;
  397.     smenufont[ROOT].ob_spec = (void *)0xff1100;
  398.     smenufont[ROOT].ob_x = 4;
  399.     smenufont[ROOT].ob_y = 0;
  400.     smenufont[ROOT].ob_width = 27;
  401.     smenufont[ROOT].ob_height = numfonts - 1;
  402.     
  403.     for (n = 2; n <= numfonts; n++)  {
  404.       vqt_name(vdihandle, n, temp);
  405.         fontnames[n - 1] = (char *) malloc(28);
  406.         sprintf(fontnames[n-1], "  %-23s  ", temp);
  407.         smenufont[n-1].ob_next = n;
  408.         smenufont[n-1].ob_head = -1;
  409.         smenufont[n-1].ob_tail = -1;
  410.         smenufont[n-1].ob_type = G_STRING;
  411.         smenufont[n-1].ob_flags = 0x0;
  412.         smenufont[n-1].ob_state = 0x0;
  413.         smenufont[n-1].ob_spec = (void *)fontnames[n - 1];
  414.         smenufont[n-1].ob_x = 0;
  415.         smenufont[n-1].ob_y = n - 2;
  416.         smenufont[n-1].ob_width = 27;
  417.         smenufont[n-1].ob_height = 1;
  418.     }
  419.     smenufont[numfonts-1].ob_next = ROOT;
  420.     smenufont[numfonts-1].ob_flags = LASTOB;
  421.     fix_tree(smenufont, numfonts);
  422.     
  423.     /* Attach submenu to main menu */
  424.     submenu.mn_tree = smenufont;
  425.     submenu.mn_menu = 0;
  426.     submenu.mn_item = 1;
  427.     submenu.mn_scroll = 1;
  428.     submenu.mn_keystate = 0;
  429.     menu_attach(1, MAINMENU, ME_FONT, &submenu);
  430.  
  431.     /* Attach size submenu */
  432.     submenu.mn_tree = SIZEMENU;
  433.     menu_attach(1, MAINMENU, ME_SIZE, &submenu);
  434.     
  435.     /* Attach width submenu */
  436.     submenu.mn_tree = WIDTHMENU;
  437.     menu_attach(1, MAINMENU, ME_WIDTH, &submenu);
  438. }