home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
240.lha
/
PopMenu
/
demo.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-05-04
|
9KB
|
401 lines
/*
* Simple Demonstration Program Using Pop-up Menus
*
* Written by Derek Zahn (Gambit Software, Madison WI), July 1987
*
* This code is freely distributable and is blessed by its author for
* inclusion, in this form or any other, into Amiga programs,
* commercial or non-commercial. If this is done, no credit must be
* given to me (although I wouldn't mind).
*
* I think that the movmem() function used here is Manx-specific. This
* code developed and tested under 1.2 and Manx C v. 3.40a
*/
/* include files */
#include <exec/types.h>
#include <exec/memory.h>
#include <intuition/intuitionbase.h>
#include <intuition/intuition.h>
#include <graphics/gfxmacros.h>
#include "popmenu.h"
extern LONG PopChoose(); /* the Pop-up Menu call */
extern VOID CloseLibrary(), CloseWindow(), ReplyMsg(), FreeMem();
extern struct IntuiMessage *GetMsg();
extern struct Window *OpenWindow();
extern APTR OpenLibrary(), AllocMem();
/* This is the window in which the pop-up menus will appear */
struct NewWindow demo_window = {
100, 50,
300, 50,
(UBYTE) -1, (UBYTE) -1,
MOUSEBUTTONS | CLOSEWINDOW,
ACTIVATE | RMBTRAP | WINDOWCLOSE | WINDOWDRAG,
NULL,
NULL,
(UBYTE *) "Pop-up menu demo",
NULL,
NULL,
0, 0,
0, 0,
WBENCHSCREEN
};
/* Following are the two images that are used in the demo menu */
#define PIC2SIZE 240
USHORT *chipped_pic2;
USHORT demo_pic2_imageData[] =
{
0xFFFF,0xFFFF,0xFF80,0xFFFF,0xFFFF,0xFF80,
0xFC1F,0xC1FC,0x1F80,0xF80F,0x80F8,0x0F80,
0xF007,0x0070,0x0780,0xE082,0x0820,0x8380,
0xF007,0x0070,0x0780,0xF80F,0x80F8,0x0F80,
0xFC1F,0xC1FC,0x1F80,0xFEBF,0xF7FE,0xBF80,
0xFF7F,0xEBFF,0x7F80,0xFC1F,0xC1FC,0x1F80,
0xF80F,0x80F8,0x0F80,0xF007,0x0070,0x0780,
0xE082,0x0820,0x8380,0xF007,0x0070,0x0780,
0xF80F,0x80F8,0x0F80,0xFC1F,0xC1FC,0x1F80,
0xFFFF,0xFFFF,0xFF80,0xFFFF,0xFFFF,0xFF80,
0x0000,0x0000,0x0000,0x03E0,0x3E03,0xE000,
0x0410,0x4104,0x1000,0x0BE8,0xBE8B,0xE800,
0x1635,0x6356,0x3400,0x2EBA,0xEBAE,0xBA00,
0x1635,0x6356,0x3400,0x0BE8,0xBE8B,0xE800,
0x0410,0x4104,0x1000,0x03E0,0x3E03,0xE000,
0x03E0,0x3E03,0xE000,0x0410,0x4104,0x1000,
0x0BE8,0xBE8B,0xE800,0x1635,0x6356,0x3400,
0x2EBA,0xEBAE,0xBA00,0x1635,0x6356,0x3400,
0x0BE8,0xBE8B,0xE800,0x0410,0x4104,0x1000,
0x03E0,0x3E03,0xE000,0x0000,0x0000,0x0000
};
struct Image demo_pic2_image =
{
10,0, /* LeftEdge, TopEdge */
41,20,2, /* Width, Height, Depth */
NULL, /* filled in later */
3,0, /* PlanePick, PlaneOnOff */
NULL, /* Pointer to next Image */
};
#define PIC1SIZE 96
USHORT *chipped_pic1;
USHORT demo_pic1_imageData[] =
{
0xFFFF,0xFFFF,0xC000,0xFFFC,0x07FF,0xC000,
0xFFFB,0xFBFF,0xC000,0xE007,0xFC01,0xC000,
0xE007,0xFC01,0xC000,0xFFFB,0xFBFF,0xC000,
0xFFFC,0x07FF,0xC000,0xFFFF,0xFFFF,0xC000,
0x0000,0x0000,0x0000,0x0002,0x0000,0x0000,
0x0004,0x3400,0x0000,0x1FF8,0x6000,0x0000,
0x0000,0x63FE,0x0000,0x0004,0x6400,0x0000,
0x0002,0x0000,0x0000,0x0000,0x0000,0x0000
};
struct Image demo_pic1_image =
{
10,1, /* LeftEdge, TopEdge */
34,8,2, /* Width, Height, Depth */
NULL, /* Set Later */
3,0, /* PlanePick, PlaneOnOff */
NULL, /* Pointer to next Image */
};
/* This is the list of demo menu MenuItems. Note the use of the flags and */
/* the effects they have on what is displayed. */
struct IntuiText demo_text6_text = {
(UBYTE) 0, (UBYTE) 1,
JAM1,
(SHORT) 2 + CHECKWIDTH, (SHORT) 2,
NULL,
(UBYTE *) "Mut Ex 3",
NULL
};
struct MenuItem demo_text6 = {
NULL,
(SHORT) 0, (SHORT) 90,
(SHORT) 100, (SHORT) 10,
(USHORT) (ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT),
(LONG) 0x0c0,
(APTR) &demo_text6_text,
NULL,
(BYTE) 0,
NULL,
(USHORT) 0
};
struct IntuiText demo_text5_text = {
(UBYTE) 0, (UBYTE) 1,
JAM1,
(SHORT) 2 + CHECKWIDTH, (SHORT) 2,
NULL,
(UBYTE *) "Mut Ex 2",
NULL
};
struct MenuItem demo_text5 = {
&demo_text6,
(SHORT) 0, (SHORT) 80,
(SHORT) 100, (SHORT) 10,
(USHORT) (ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT),
(LONG) 0x140,
(APTR) &demo_text5_text,
NULL,
(BYTE) 0,
NULL,
(USHORT) 0
};
struct IntuiText demo_text4_text = {
(UBYTE) 0, (UBYTE) 1,
JAM1,
(SHORT) 2 + CHECKWIDTH, (SHORT) 2,
NULL,
(UBYTE *) "Mut Ex 1",
NULL
};
struct MenuItem demo_text4 = {
&demo_text5,
(SHORT) 0, (SHORT) 70,
(SHORT) 100, (SHORT) 10,
(USHORT) (ITEMTEXT | ITEMENABLED | HIGHCOMP | CHECKIT),
(LONG) 0x180,
(APTR) &demo_text4_text,
NULL,
(BYTE) 0,
NULL,
(USHORT) 0
};
struct IntuiText demo_text3_text = {
(UBYTE) 2, (UBYTE) 1,
JAM1,
(SHORT) 2, (SHORT) 2,
NULL,
(UBYTE *) "Shadow",
NULL
};
struct MenuItem demo_text3 = {
&demo_text4,
(SHORT) 0, (SHORT) 60,
(SHORT) 100, (SHORT) 10,
(USHORT) (ITEMTEXT),
(LONG) 0,
(APTR) &demo_text3_text,
NULL,
(BYTE) 0,
NULL,
(USHORT) 0
};
struct MenuItem demo_image3 = {
&demo_text3,
(SHORT) 5, (SHORT) 40,
(SHORT) 60, (SHORT) 20,
(USHORT) (HIGHBOX | ITEMENABLED),
(LONG) 0,
(APTR) &demo_pic2_image,
NULL,
(BYTE) 0,
NULL,
(USHORT) 0
};
struct MenuItem demo_image2 = {
&demo_image3,
(SHORT) 0, (SHORT) 30,
(SHORT) 100, (SHORT) 10,
(USHORT) (HIGHBOX),
(LONG) 0,
(APTR) &demo_pic1_image,
NULL,
(BYTE) 0,
NULL,
(USHORT) 0
};
struct IntuiText demo_text2_text = {
(UBYTE) 0, (UBYTE) 1,
JAM1,
(SHORT) 2 + CHECKWIDTH, (SHORT) 2,
NULL,
(UBYTE *) "Text 2",
NULL
};
struct IntuiText demo_text2_alt = {
(UBYTE) 3, (UBYTE) 1,
JAM1,
(SHORT) 2 + CHECKWIDTH, (SHORT) 2,
NULL,
(UBYTE *) "tEXT 2",
NULL
};
struct MenuItem demo_text2 = {
&demo_image2,
(SHORT) 0, (SHORT) 20,
(SHORT) 100, (SHORT) 10,
(USHORT) (ITEMTEXT | HIGHIMAGE | ITEMENABLED | CHECKIT | MENUTOGGLE),
(LONG) 0,
(APTR) &demo_text2_text,
(APTR) &demo_text2_alt,
(BYTE) 0,
NULL,
(USHORT) 0
};
struct MenuItem demo_image1 = {
&demo_text2,
(SHORT) 0, (SHORT) 10,
(SHORT) 100, (SHORT) 10,
(USHORT) (HIGHCOMP | ITEMENABLED),
(LONG) 0,
(APTR) &demo_pic1_image,
NULL,
(BYTE) 0,
NULL,
(USHORT) 0
};
struct IntuiText demo_text1_text = {
(UBYTE) 0, (UBYTE) 1,
JAM1,
(SHORT) 2, (SHORT) 2,
NULL,
(UBYTE *) "Text 1",
NULL
};
struct MenuItem demo_text1 = {
&demo_image1,
(SHORT) 0, (SHORT) 0,
(SHORT) 100, (SHORT) 10,
(USHORT) (ITEMTEXT | HIGHBOX | ITEMENABLED),
(LONG) 0,
(APTR) &demo_text1_text,
NULL,
(BYTE) 0,
NULL,
(USHORT) 0
};
/* This menu is attached to the Right mouse button. It shows the use of a */
/* title, and the POPPOINTREL and POPTIDY flags for menu positioning. */
struct Menu demo_menu1 = {
NULL,
(SHORT) -1 * ((102 + POPTITLEHEIGHT) / 2),
(SHORT) -1 * POPTITLEHEIGHT / 2,
(SHORT) 100, (SHORT) 102 + POPTITLEHEIGHT,
(USHORT) (MENUENABLED | POPTIDY | POPPOINTREL | POPRIGHTBUTTON |
POPTRIGGERUP),
(BYTE *) "Sample",
&demo_text1
};
/* This menu is attached to the Left mouse button. It is title-less (note */
/* that it is shorter than the one with the title). This demonstrates the */
/* POPREMEMBER flag and the lack of POPTIDY. Note that it uses the same */
/* MenuItems as demo_menu1; this is only a demo, and that was easy */
struct Menu demo_menu2 = {
NULL,
(SHORT) 0, (SHORT) 0,
(SHORT) 100, (SHORT) 102,
(USHORT) (MENUENABLED | POPPOINTREL | POPLEFTBUTTON |
POPTRIGGERUP | POPREMEMBER),
NULL,
&demo_text1
};
/* In order to use the pop-up menus, the application MUST make the */
/* following declarations. */
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
main()
{
struct Window *win;
SHORT val, class, code;
struct IntuiMessage *message;
/* The libraries MUST be opened in this or a similar manner in */
/* order to use pop-up menus. */
IntuitionBase = (struct IntuitionBase *)
OpenLibrary("intuition.library", 0L);
if(!IntuitionBase)
exit(0);
GfxBase = (struct GfxBase *) OpenLibrary("graphics.library", 0L);
if(!GfxBase) {
CloseLibrary(IntuitionBase);
exit(0);
}
win = OpenWindow(&demo_window);
if(!win) {
CloseLibrary(IntuitionBase);
CloseLibrary(GfxBase);
}
/* make sure the image data is in CHIP ram */
chipped_pic1 = (USHORT *) AllocMem((LONG) PIC1SIZE, MEMF_CHIP);
movmem(&demo_pic1_imageData[0], chipped_pic1, PIC1SIZE);
demo_pic1_image.ImageData = chipped_pic1;
chipped_pic2 = (USHORT *) AllocMem((LONG) PIC2SIZE, MEMF_CHIP);
movmem(&demo_pic2_imageData[0], chipped_pic2, PIC2SIZE);
demo_pic2_image.ImageData = chipped_pic2;
while(1) {
Wait((ULONG) 1L << win->UserPort->mp_SigBit);
while(message = GetMsg(win->UserPort)) {
class = message->Class;
code = message->Code;
ReplyMsg(message);
switch(class) {
case MOUSEBUTTONS:
switch(code) {
case SELECTDOWN:
val = (SHORT) PopChoose(&demo_menu2,
win);
printf("val %d\n", val);
break;
case MENUDOWN:
val = (SHORT) PopChoose(&demo_menu1,
NULL);
printf("val %d\n", val);
break;
default:
break;
}
break;
case CLOSEWINDOW:
CloseWindow(win);
CloseLibrary(IntuitionBase);
CloseLibrary(GfxBase);
FreeMem(chipped_pic1, (LONG) PIC1SIZE);
FreeMem(chipped_pic2, (LONG) PIC2SIZE);
exit(0);
default:
break;
}
}
}
}