home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 240.lha / PopMenu / demo.c < prev    next >
C/C++ Source or Header  |  1989-05-04  |  9KB  |  401 lines

  1. /*
  2.  *  Simple Demonstration Program Using Pop-up Menus
  3.  *
  4.  *  Written by Derek Zahn (Gambit Software, Madison WI), July 1987
  5.  *
  6.  *  This code is freely distributable and is blessed by its author for
  7.  *  inclusion, in this form or any other, into Amiga programs,
  8.  *  commercial or non-commercial.  If this is done, no credit must be
  9.  *  given to me (although I wouldn't mind).
  10.  *
  11.  *  I think that the movmem() function used here is Manx-specific.  This
  12.  *  code developed and tested under 1.2 and Manx C v. 3.40a
  13.  */
  14.  
  15. /* include files */
  16.  
  17. #include <exec/types.h>
  18. #include <exec/memory.h>
  19. #include <intuition/intuitionbase.h>
  20. #include <intuition/intuition.h>
  21. #include <graphics/gfxmacros.h>
  22. #include "popmenu.h"
  23.  
  24. extern LONG PopChoose();  /* the Pop-up Menu call */
  25.  
  26. extern VOID CloseLibrary(), CloseWindow(), ReplyMsg(), FreeMem();
  27. extern struct IntuiMessage *GetMsg();
  28. extern struct Window *OpenWindow();
  29. extern APTR OpenLibrary(), AllocMem();
  30.  
  31. /* This is the window in which the pop-up menus will appear */
  32.  
  33. struct NewWindow demo_window = {
  34.     100, 50,
  35.     300, 50,
  36.     (UBYTE) -1, (UBYTE) -1,
  37.     MOUSEBUTTONS | CLOSEWINDOW,
  38.     ACTIVATE | RMBTRAP | WINDOWCLOSE | WINDOWDRAG,
  39.     NULL,
  40.     NULL,
  41.     (UBYTE *) "Pop-up menu demo",
  42.     NULL,
  43.     NULL,
  44.     0, 0,
  45.     0, 0,
  46.     WBENCHSCREEN
  47. };
  48.  
  49. /* Following are the two images that are used in the demo menu */
  50.  
  51. #define PIC2SIZE 240
  52. USHORT *chipped_pic2;
  53.  
  54. USHORT demo_pic2_imageData[] =
  55. {
  56. 0xFFFF,0xFFFF,0xFF80,0xFFFF,0xFFFF,0xFF80,
  57. 0xFC1F,0xC1FC,0x1F80,0xF80F,0x80F8,0x0F80,
  58. 0xF007,0x0070,0x0780,0xE082,0x0820,0x8380,
  59. 0xF007,0x0070,0x0780,0xF80F,0x80F8,0x0F80,
  60. 0xFC1F,0xC1FC,0x1F80,0xFEBF,0xF7FE,0xBF80,
  61. 0xFF7F,0xEBFF,0x7F80,0xFC1F,0xC1FC,0x1F80,
  62. 0xF80F,0x80F8,0x0F80,0xF007,0x0070,0x0780,
  63. 0xE082,0x0820,0x8380,0xF007,0x0070,0x0780,
  64. 0xF80F,0x80F8,0x0F80,0xFC1F,0xC1FC,0x1F80,
  65. 0xFFFF,0xFFFF,0xFF80,0xFFFF,0xFFFF,0xFF80,
  66.  
  67. 0x0000,0x0000,0x0000,0x03E0,0x3E03,0xE000,
  68. 0x0410,0x4104,0x1000,0x0BE8,0xBE8B,0xE800,
  69. 0x1635,0x6356,0x3400,0x2EBA,0xEBAE,0xBA00,
  70. 0x1635,0x6356,0x3400,0x0BE8,0xBE8B,0xE800,
  71. 0x0410,0x4104,0x1000,0x03E0,0x3E03,0xE000,
  72. 0x03E0,0x3E03,0xE000,0x0410,0x4104,0x1000,
  73. 0x0BE8,0xBE8B,0xE800,0x1635,0x6356,0x3400,
  74. 0x2EBA,0xEBAE,0xBA00,0x1635,0x6356,0x3400,
  75. 0x0BE8,0xBE8B,0xE800,0x0410,0x4104,0x1000,
  76. 0x03E0,0x3E03,0xE000,0x0000,0x0000,0x0000
  77. };
  78. struct Image demo_pic2_image =
  79. {
  80. 10,0,          /* LeftEdge, TopEdge */
  81. 41,20,2,      /* Width, Height, Depth */
  82. NULL,        /* filled in later */
  83. 3,0,        /* PlanePick, PlaneOnOff */
  84. NULL,        /* Pointer to next Image */
  85. };
  86.  
  87. #define PIC1SIZE 96
  88. USHORT *chipped_pic1;
  89.  
  90. USHORT demo_pic1_imageData[] =
  91. {
  92. 0xFFFF,0xFFFF,0xC000,0xFFFC,0x07FF,0xC000,
  93. 0xFFFB,0xFBFF,0xC000,0xE007,0xFC01,0xC000,
  94. 0xE007,0xFC01,0xC000,0xFFFB,0xFBFF,0xC000,
  95. 0xFFFC,0x07FF,0xC000,0xFFFF,0xFFFF,0xC000,
  96.  
  97. 0x0000,0x0000,0x0000,0x0002,0x0000,0x0000,
  98. 0x0004,0x3400,0x0000,0x1FF8,0x6000,0x0000,
  99. 0x0000,0x63FE,0x0000,0x0004,0x6400,0x0000,
  100. 0x0002,0x0000,0x0000,0x0000,0x0000,0x0000
  101. };
  102.  
  103. struct Image demo_pic1_image =
  104. {
  105. 10,1,          /* LeftEdge, TopEdge */
  106. 34,8,2,      /* Width, Height, Depth */
  107. NULL,  /* Set Later */
  108. 3,0,        /* PlanePick, PlaneOnOff */
  109. NULL,        /* Pointer to next Image */
  110. };
  111.  
  112. /* This is the list of demo menu MenuItems.  Note the use of the flags and */
  113. /* the effects they have on what is displayed.                             */
  114.  
  115. struct IntuiText demo_text6_text = {
  116.     (UBYTE) 0, (UBYTE) 1,
  117.     JAM1,
  118.     (SHORT) 2 + CHECKWIDTH, (SHORT) 2,
  119.     NULL,
  120.     (UBYTE *) "Mut Ex 3",
  121.     NULL
  122. };
  123.  
  124. struct MenuItem demo_text6 = {
  125.     NULL,
  126.     (SHORT) 0, (SHORT) 90,
  127.     (SHORT) 100, (SHORT) 10,
  128.     (USHORT) (ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT),
  129.     (LONG) 0x0c0,
  130.     (APTR) &demo_text6_text,
  131.     NULL,
  132.     (BYTE) 0,
  133.     NULL,
  134.     (USHORT) 0
  135. };
  136.  
  137. struct IntuiText demo_text5_text = {
  138.     (UBYTE) 0, (UBYTE) 1,
  139.     JAM1,
  140.     (SHORT) 2 + CHECKWIDTH, (SHORT) 2,
  141.     NULL,
  142.     (UBYTE *) "Mut Ex 2",
  143.     NULL
  144. };
  145.  
  146. struct MenuItem demo_text5 = {
  147.     &demo_text6,
  148.     (SHORT) 0, (SHORT) 80,
  149.     (SHORT) 100, (SHORT) 10,
  150.     (USHORT) (ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT),
  151.     (LONG) 0x140,
  152.     (APTR) &demo_text5_text,
  153.     NULL,
  154.     (BYTE) 0,
  155.     NULL,
  156.     (USHORT) 0
  157. };
  158.  
  159. struct IntuiText demo_text4_text = {
  160.     (UBYTE) 0, (UBYTE) 1,
  161.     JAM1,
  162.     (SHORT) 2 + CHECKWIDTH, (SHORT) 2,
  163.     NULL,
  164.     (UBYTE *) "Mut Ex 1",
  165.     NULL
  166. };
  167.  
  168. struct MenuItem demo_text4 = {
  169.     &demo_text5,
  170.     (SHORT) 0, (SHORT) 70,
  171.     (SHORT) 100, (SHORT) 10,
  172.     (USHORT) (ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT),
  173.     (LONG) 0x180,
  174.     (APTR) &demo_text4_text,
  175.     NULL,
  176.     (BYTE) 0,
  177.     NULL,
  178.     (USHORT) 0
  179. };
  180.  
  181. struct IntuiText demo_text3_text = {
  182.     (UBYTE) 2, (UBYTE) 1,
  183.     JAM1,
  184.     (SHORT) 2, (SHORT) 2,
  185.     NULL,
  186.     (UBYTE *) "Shadow",
  187.     NULL
  188. };
  189.  
  190. struct MenuItem demo_text3 = {
  191.     &demo_text4,
  192.     (SHORT) 0, (SHORT) 60,
  193.     (SHORT) 100, (SHORT) 10,
  194.     (USHORT) (ITEMTEXT),
  195.     (LONG) 0,
  196.     (APTR) &demo_text3_text,
  197.     NULL,
  198.     (BYTE) 0,
  199.     NULL,
  200.     (USHORT) 0
  201. };
  202.  
  203. struct MenuItem demo_image3 = {
  204.     &demo_text3,
  205.     (SHORT) 5, (SHORT) 40,
  206.     (SHORT) 60, (SHORT) 20,
  207.     (USHORT) (HIGHBOX | ITEMENABLED),
  208.     (LONG) 0,
  209.     (APTR) &demo_pic2_image,
  210.     NULL,
  211.     (BYTE) 0,
  212.     NULL,
  213.     (USHORT) 0
  214. };
  215.  
  216. struct MenuItem demo_image2 = {
  217.     &demo_image3,
  218.     (SHORT) 0, (SHORT) 30,
  219.     (SHORT) 100, (SHORT) 10,
  220.     (USHORT) (HIGHBOX),
  221.     (LONG) 0,
  222.     (APTR) &demo_pic1_image,
  223.     NULL,
  224.     (BYTE) 0,
  225.     NULL,
  226.     (USHORT) 0
  227. };
  228.  
  229. struct IntuiText demo_text2_text = {
  230.     (UBYTE) 0, (UBYTE) 1,
  231.     JAM1,
  232.     (SHORT) 2 + CHECKWIDTH, (SHORT) 2,
  233.     NULL,
  234.     (UBYTE *) "Text 2",
  235.     NULL
  236. };
  237.  
  238. struct IntuiText demo_text2_alt = {
  239.     (UBYTE) 3, (UBYTE) 1,
  240.     JAM1,
  241.     (SHORT) 2 + CHECKWIDTH, (SHORT) 2,
  242.     NULL,
  243.     (UBYTE *) "tEXT 2",
  244.     NULL
  245. };
  246.  
  247. struct MenuItem demo_text2 = {
  248.     &demo_image2,
  249.     (SHORT) 0, (SHORT) 20,
  250.     (SHORT) 100, (SHORT) 10,
  251.     (USHORT) (ITEMTEXT | HIGHIMAGE | ITEMENABLED | CHECKIT | MENUTOGGLE),
  252.     (LONG) 0,
  253.     (APTR) &demo_text2_text,
  254.     (APTR) &demo_text2_alt,
  255.     (BYTE) 0,
  256.     NULL,
  257.     (USHORT) 0
  258. };
  259.  
  260. struct MenuItem demo_image1 = {
  261.     &demo_text2,
  262.     (SHORT) 0, (SHORT) 10,
  263.     (SHORT) 100, (SHORT) 10,
  264.     (USHORT) (HIGHCOMP | ITEMENABLED),
  265.     (LONG) 0,
  266.     (APTR) &demo_pic1_image,
  267.     NULL,
  268.     (BYTE) 0,
  269.     NULL,
  270.     (USHORT) 0
  271. };
  272.  
  273. struct IntuiText demo_text1_text = {
  274.     (UBYTE) 0, (UBYTE) 1,
  275.     JAM1,
  276.     (SHORT) 2, (SHORT) 2,
  277.     NULL,
  278.     (UBYTE *) "Text 1",
  279.     NULL
  280. };
  281.  
  282. struct MenuItem demo_text1 = {
  283.     &demo_image1,
  284.     (SHORT) 0, (SHORT) 0,
  285.     (SHORT) 100, (SHORT) 10,
  286.     (USHORT) (ITEMTEXT | HIGHBOX | ITEMENABLED),
  287.     (LONG) 0,
  288.     (APTR) &demo_text1_text,
  289.     NULL,
  290.     (BYTE) 0,
  291.     NULL,
  292.     (USHORT) 0
  293. };
  294.  
  295. /* This menu is attached to the Right mouse button.  It shows the use of a */
  296. /* title, and the POPPOINTREL and POPTIDY flags for menu positioning.      */
  297.  
  298. struct Menu demo_menu1 = {
  299.     NULL,
  300.     (SHORT) -1 * ((102 + POPTITLEHEIGHT) / 2),
  301.     (SHORT) -1 * POPTITLEHEIGHT / 2,
  302.     (SHORT) 100, (SHORT) 102 + POPTITLEHEIGHT,
  303.     (USHORT) (MENUENABLED | POPTIDY | POPPOINTREL | POPRIGHTBUTTON | 
  304.       POPTRIGGERUP),
  305.     (BYTE *) "Sample",
  306.     &demo_text1
  307. };
  308.  
  309. /* This menu is attached to the Left mouse button.  It is title-less (note */
  310. /* that it is shorter than the one with the title).  This demonstrates the */
  311. /* POPREMEMBER flag and the lack of POPTIDY.  Note that it uses the same   */
  312. /* MenuItems as demo_menu1; this is only a demo, and that was easy         */
  313.  
  314. struct Menu demo_menu2 = {
  315.     NULL,
  316.     (SHORT) 0, (SHORT) 0,
  317.     (SHORT) 100, (SHORT) 102,
  318.     (USHORT) (MENUENABLED | POPPOINTREL | POPLEFTBUTTON | 
  319.       POPTRIGGERUP | POPREMEMBER),
  320.     NULL,
  321.     &demo_text1
  322. };
  323.  
  324. /* In order to use the pop-up menus, the application MUST make the         */
  325. /* following declarations.                                                 */
  326.  
  327. struct IntuitionBase *IntuitionBase;
  328. struct GfxBase *GfxBase;
  329.  
  330. main()
  331. {
  332.     struct Window *win;
  333.     SHORT val, class, code;
  334.     struct IntuiMessage *message;
  335.  
  336.     /* The libraries MUST be opened in this or a similar manner in     */
  337.     /* order to use pop-up menus.                                      */
  338.  
  339.     IntuitionBase = (struct IntuitionBase *) 
  340.       OpenLibrary("intuition.library", 0L);
  341.     if(!IntuitionBase)
  342.         exit(0);
  343.     GfxBase = (struct GfxBase *) OpenLibrary("graphics.library", 0L);
  344.     if(!GfxBase) {
  345.         CloseLibrary(IntuitionBase);
  346.         exit(0);
  347.     }
  348.  
  349.     win = OpenWindow(&demo_window);
  350.     if(!win) {
  351.         CloseLibrary(IntuitionBase);
  352.         CloseLibrary(GfxBase);
  353.     }
  354.  
  355.     /* make sure the image data is in CHIP ram */
  356.  
  357.     chipped_pic1 = (USHORT *) AllocMem((LONG) PIC1SIZE, MEMF_CHIP);
  358.     movmem(&demo_pic1_imageData[0], chipped_pic1, PIC1SIZE);
  359.     demo_pic1_image.ImageData = chipped_pic1;
  360.     chipped_pic2 = (USHORT *) AllocMem((LONG) PIC2SIZE, MEMF_CHIP);
  361.     movmem(&demo_pic2_imageData[0], chipped_pic2, PIC2SIZE);
  362.     demo_pic2_image.ImageData = chipped_pic2;
  363.  
  364.     while(1) {
  365.         Wait((ULONG) 1L << win->UserPort->mp_SigBit);
  366.         while(message = GetMsg(win->UserPort)) {
  367.             class = message->Class;
  368.             code = message->Code;
  369.             ReplyMsg(message);
  370.             switch(class) {
  371.               case MOUSEBUTTONS:
  372.                   switch(code) {
  373.                   case SELECTDOWN:
  374.                     val = (SHORT) PopChoose(&demo_menu2,
  375.                       win);
  376.                     printf("val %d\n", val);
  377.                     break;
  378.                   case MENUDOWN:
  379.                     val = (SHORT) PopChoose(&demo_menu1,
  380.                       NULL);
  381.                     printf("val %d\n", val);
  382.                     break;
  383.                   default:
  384.                       break;
  385.                 }
  386.                 break;
  387.               case CLOSEWINDOW:
  388.                   CloseWindow(win);
  389.                 CloseLibrary(IntuitionBase);
  390.                 CloseLibrary(GfxBase);
  391.                 FreeMem(chipped_pic1, (LONG) PIC1SIZE);
  392.                 FreeMem(chipped_pic2, (LONG) PIC2SIZE);
  393.                 exit(0);
  394.               default:
  395.                   break;
  396.             }
  397.         }
  398.  
  399.     }
  400. }
  401.