home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / zip / program / popup.zoo / demo / demo.c next >
C/C++ Source or Header  |  1991-11-18  |  8KB  |  305 lines

  1. /* Demonstration program to illustrate the use of popup menus. (c) 1991 by
  2.    Andrew Brown. Copying and distribution subject to the restrictions laid
  3.    out in the main documentation
  4.  
  5.   COMPILER: Lattice 'C' V5
  6.      NOTES: File is fully prototyped, you can use the -rr option */
  7.  
  8.  
  9. #include <aes.h>
  10. #include <vdi.h>
  11. #include <osbind.h>
  12. #include <string.h>
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <stddef.h>
  16. #include "popup.h"     /* vital file: you must include this */
  17. #include "demo.h"      /* this contains the popup menu source */
  18.  
  19.  
  20. #define TRUE 1          /* These really should be standard defines */
  21. #define FALSE 0
  22.  
  23. #define KBD_ALTA 0x1e00   /* keyboard scan codes */
  24. #define KBD_ALTC 0x2e00
  25. #define KBD_ALTQ 0x1000
  26. #define KBD_ALTD 0x2000
  27. #define KBD_ALTH 0x2300
  28.  
  29.  
  30. int main(void);                         /* Function prototypes */
  31. int topmenu_choice(int,int);
  32. int topmenu_useitem(MITEM *,int);
  33. int handle_keybd(int);
  34. void do_events(void);
  35. void menu_switch(int);
  36.  
  37.  
  38. extern int PopupMenu_Index;       /* These are vital if you are using a */
  39. extern int PopupMenu_X;           /* popup menu as your top bar */
  40. extern int PopupMenu_Y;
  41.  
  42.  
  43. int ws_handle;                              /* VDI Workstation handle */
  44. int CH_HEIGHT,CH_WIDTH,SCR_W,SCR_H;         /* Screen/character sizes */
  45. int NPLANES,MENUDISP;                       /* Colour planes/menu disp */
  46. char *topmenu_bar="  Desk  File  Options";  /* Our menu bar */
  47.  
  48.  
  49. /****************************/
  50. /* Main program starts here */
  51. /****************************/
  52.  
  53. int main(void)
  54. {
  55. int work_in[11]={1,1,1,1,1,1,1,1,1,1,2};
  56. int work_out[57],dummy;
  57.  
  58.   if(appl_init()<0)           /* tell AES I exist */
  59.   {
  60.     puts("Cannot initialise application");
  61.     Crawcin();
  62.     exit(-1);
  63.   }
  64.   ws_handle=graf_handle(&dummy,&dummy,&dummy,&dummy);
  65.   v_opnvwk(work_in,&ws_handle,work_out);    /* open VDI workstation */
  66.   if(!ws_handle)
  67.   {
  68.     form_alert(1,"[1][Cannot open workstation][Abort]");
  69.     return(appl_exit());
  70.   }
  71.   graf_mouse(ARROW,NULL);
  72.  
  73.   CH_WIDTH=8;
  74.   SCR_W=work_out[0]+1;
  75.   SCR_H=work_out[1]+1;
  76.   switch(Getrez())        /* some variables must be set */
  77.   {
  78.     case 0:               /* Low resolution */
  79.       NPLANES=4;
  80.       CH_HEIGHT=8;
  81.       MENUDISP=1;
  82.       break;
  83.     case 1:               /* Medium resolution */
  84.       NPLANES=2;
  85.       CH_HEIGHT=8;
  86.       MENUDISP=1;
  87.       break;
  88.     case 2:               /* High resolution */
  89.       NPLANES=1;
  90.       CH_HEIGHT=16;
  91.       SCR_W=640;
  92.       SCR_H=400;
  93.       MENUDISP=2;
  94.   }
  95.  
  96.   PopupInit(work_out[0]+1,work_out[1]+1,ws_handle);  /* initialise popups */
  97.   PopupRegister(topmenu_bar);     /* register my menu bar */
  98.  
  99.   do_events();          /* central program function */
  100.  
  101.   v_clsvwk(ws_handle);    /* close virtual work station */
  102.   return(appl_exit());    /* quit, returning an exit code */
  103. }
  104.  
  105. /*************************/
  106. /* Main program function */
  107. /*************************/
  108.  
  109. void do_events(void)
  110. {
  111. int mx,my,dummy,events,key,code;
  112.  
  113.   menu_switch(TRUE);            /* display top menu bar */
  114.   code=TRUE;
  115.   do
  116.   {
  117.     events=evnt_multi(MU_KEYBD|MU_M1,0,0,0,
  118.                         0,0,0,SCR_W,CH_HEIGHT+MENUDISP,
  119.                         0,0,0,0,0,
  120.                         0L,
  121.                         0,0,
  122.                         &mx,&my,&dummy,&dummy,&key,&dummy);
  123.     if(events & MU_KEYBD) code=handle_keybd(key);   /* keyboard event */
  124.     if(events & MU_M1) code=topmenu_choice(mx,my);  /* mouse in menu bar */
  125.   } while(code);
  126.  
  127.   menu_switch(FALSE);
  128. }
  129.  
  130. /*******************/
  131. /* Handle keypress */
  132. /*******************
  133.  
  134. This is a good example of how to implement keyboard shortcuts to the menu
  135. options. */
  136.  
  137. int handle_keybd(key)
  138. int key;
  139. {
  140.   switch(key)
  141.   {
  142.     case KBD_ALTA:
  143.       return(topmenu_useitem(MENU_DESK,ITM_ABOUT));
  144.     case KBD_ALTC:
  145.       return(topmenu_useitem(MENU_FILE,ITM_CHECKME));
  146.     case KBD_ALTQ:
  147.       return(topmenu_useitem(MENU_FILE,ITM_QUIT));
  148.     case KBD_ALTD:
  149.       return(topmenu_useitem(MENU_OPTIONS,ITM_DROPDOWN));
  150.     case KBD_ALTH:
  151.       return(topmenu_useitem(MENU_OPTIONS,ITM_HOLDDOWN));
  152.   }
  153. }
  154.  
  155. /*******************************/
  156. /* handle top line menu choice */
  157. /*******************************
  158.  
  159. You may use this function as it stands, by calling in the manner above.
  160. All you must do is change or add to the case statements that select the
  161. appropriate menu tree. Note that FALSE is returned if QUIT is selected
  162. from the menu, otherwise TRUE is returned */
  163.  
  164.  
  165. int topmenu_choice(mx,my)
  166. int mx,my;
  167. {
  168. int mx1,pxyarray[4],dummy,item,menu,index;
  169. MITEM *tree;
  170.  
  171.   vs_clip(ws_handle,FALSE,pxyarray);
  172.   vsf_color(ws_handle,BLACK);
  173.   vsf_interior(ws_handle,FIS_SOLID);
  174.   vsf_style(ws_handle,8);
  175.   pxyarray[1]=1;
  176.   pxyarray[3]=CH_HEIGHT+MENUDISP;
  177.  
  178.   while(my<CH_HEIGHT+2)
  179.   {
  180.     mx/=CH_WIDTH;
  181.     if(topmenu_bar[mx]==' ' || mx>strlen(topmenu_bar)-1) return(TRUE);
  182.  
  183.     while(topmenu_bar[--mx]!=' ');
  184.     mx1=++mx;
  185.     while(topmenu_bar[mx1]!=' ' && topmenu_bar[mx1]) mx1++;
  186.     pxyarray[0]=(mx-1)*CH_WIDTH;
  187.     pxyarray[2]=(mx1+1)*CH_WIDTH;
  188.     vswr_mode(ws_handle,MD_XOR);
  189.     graf_mouse(M_OFF,0L);
  190.     vr_recfl(ws_handle,pxyarray);
  191.     graf_mouse(M_ON,0L);
  192.     vswr_mode(ws_handle,MD_REPLACE);
  193.  
  194.     for(menu=index=0;;)
  195.     {
  196.       while(topmenu_bar[menu++]==' ');
  197.       menu--;
  198.       if(menu==mx) break;
  199.       index++;
  200.       while(topmenu_bar[menu++]!=' ');
  201.     }
  202.     PopupMenu_Index=index;
  203.     switch(index)
  204.     {
  205.       case 0:
  206.         tree=MENU_DESK;
  207.         break;
  208.       case 1:
  209.         tree=MENU_FILE;
  210.         break;
  211.       case 2:
  212.         tree=MENU_OPTIONS;
  213.         break;
  214.     }
  215.     PopupMenu_X=(mx-1)*CH_WIDTH;
  216.     PopupMenu_Y=CH_HEIGHT+2;
  217.     item=PopupMenu(tree,TRUE,TRUE);
  218.     vswr_mode(ws_handle,MD_XOR);
  219.     graf_mouse(M_OFF,0L);
  220.     vr_recfl(ws_handle,pxyarray);
  221.     graf_mouse(M_ON,0L);
  222.     vswr_mode(ws_handle,MD_REPLACE);
  223.     if(item!=-1) break;
  224.     graf_mkstate(&mx,&my,&dummy,&dummy);
  225.   }
  226.   return(topmenu_useitem(tree,item));
  227. }
  228.  
  229. /***************************/
  230. /* Use the top menu choice */
  231. /***************************
  232.  
  233. You may use this function 'as is' without modifying it's structure at all.
  234. All you should do is change/add to the 'else if' list, and insert the
  235. appropriate case statements. Do not use one huge case list as some of the
  236. menu item indices are likely to be the same. In this case, FALSE is returned
  237. if 'Quit' is selected, else FALSE is returned */
  238.  
  239.  
  240. int topmenu_useitem(tree,item)
  241. MITEM *tree;
  242. int item;
  243. {
  244.   if(tree==MENU_DESK && item==ITM_ABOUT)
  245.     form_alert(1,"[1][Popup demo program, written|by Andrew Brown 1991.][ Okay ]");
  246.   else if(tree==MENU_FILE)
  247.   {
  248.     switch(item)
  249.     {
  250.       case ITM_CHECKME:
  251.         tree[ITM_CHECKME].flags^=MCHECKED;
  252.         break;
  253.       case ITM_QUIT:
  254.         if(form_alert(1,"[2][Really quit ?][ Quit | Cancel ]")==1) return(FALSE);
  255.         break;
  256.     }
  257.   }
  258.   else if(tree==MENU_OPTIONS)
  259.   {
  260.     switch(item)
  261.     {
  262.       case ITM_DROPDOWN:
  263.         menu_switch(FALSE);                     /* top menu off */
  264.         PopupMenu(MENU_DROPDOWN,TRUE,FALSE);    /* handle popup */
  265.         menu_switch(TRUE);                      /* top menu back on */
  266.         break;
  267.       case ITM_HOLDDOWN:
  268.         menu_switch(FALSE);
  269.         PopupMenu(MENU_HOLDDOWN,FALSE,FALSE);
  270.         menu_switch(TRUE);
  271.         break;
  272.     }
  273.   }
  274.   return(TRUE);     /* 'Quit' not selected, so return TRUE */
  275. }
  276.  
  277. /******************************/
  278. /* Top line menu bar switcher */
  279. /******************************/
  280.  
  281. void menu_switch(flag)
  282. int flag;
  283. {
  284. int pxyarray[4];
  285.  
  286.   vs_clip(ws_handle,FALSE,pxyarray);
  287.   vswr_mode(ws_handle,MD_REPLACE);
  288.   graf_mouse(M_OFF,NULL);
  289.   pxyarray[0]=pxyarray[1]=0;
  290.   pxyarray[2]=SCR_W-1;
  291.   pxyarray[3]=CH_HEIGHT;
  292.   vsf_color(ws_handle,WHITE);
  293.   vsf_style(ws_handle,FIS_SOLID);
  294.   vr_recfl(ws_handle,pxyarray);
  295.   if(flag) v_gtext(ws_handle,0,CH_HEIGHT-MENUDISP,topmenu_bar);
  296.   vsl_color(ws_handle,BLACK);
  297.   vsl_type(ws_handle,SOLID);
  298.   pxyarray[0]=0;
  299.   pxyarray[1]=pxyarray[3]=CH_HEIGHT+2;
  300.   pxyarray[2]=SCR_W-1;
  301.   v_pline(ws_handle,2,pxyarray);
  302.   graf_mouse(M_ON,NULL);
  303. }
  304.  
  305.