;/* simplemenu.c - Execute me to compile me with SAS C 5.10 LC -b1 -cfistq -v -y -j73 simplemenu.c Blink FROM LIB:c.o,simplemenu.o TO simplemenu LIBRARY LIB:LC.lib,LIB:Amiga.lib quit ** simplemenu.c: how to use the menu system with a window under all OS versions. */ #define INTUI_V36_NAMES_ONLY #include <exec/types.h> #include <exec/memory.h> #include <graphics/text.h> #include <intuition/intuition.h> #include <intuition/intuitionbase.h> #include <clib/exec_protos.h> #include <clib/graphics_protos.h> #include <clib/intuition_protos.h> #include <stdio.h> #include <string.h> #ifdef LATTICE int CXBRK(void) { return(0); } /* Disable Lattice CTRL/C handling */ int chkabort(void) { return(0); } /* really */ #endif /* These values are based on the ROM font Topaz8. Adjust these */ /* values to correctly handle the screen's current font. */ #define MENWIDTH (56+8) /* Longest menu item name * font width */ /* + 8 pixels for trim */ #define MENHEIGHT (10) /* Font height + 2 pixels */ struct Library *GfxBase; struct Library *IntuitionBase; /* To keep this example simple, we'll hard-code the font used for menu */ /* items. Algorithmic layout can be used to handle arbitrary fonts. */ /* Under Release 2, GadTools provides font-sensitive menu layout. */ /* Note that we still must handle fonts for the menu headers. */ struct TextAttr Topaz80 = { "topaz.font", 8, 0, 0 }; struct IntuiText menuIText[] = { { 0, 1, JAM2, 0, 1, &Topaz80, "Open...", NULL }, { 0, 1, JAM2, 0, 1, &Topaz80, "Save", NULL }, { 0, 1, JAM2, 0, 1, &Topaz80, "Print \273", NULL }, { 0, 1, JAM2, 0, 1, &Topaz80, "Draft", NULL }, { 0, 1, JAM2, 0, 1, &Topaz80, "NLQ", NULL }, { 0, 1, JAM2, 0, 1, &Topaz80, "Quit", NULL } }; struct MenuItem submenu1[] = { { /* Draft */ &submenu1[1], MENWIDTH-2, -2 , MENWIDTH, MENHEIGHT, ITEMTEXT | MENUTOGGLE | ITEMENABLED | HIGHCOMP, 0, (APTR)&menuIText[3], NULL, NULL, NULL, NULL }, { /* NLQ */ NULL, MENWIDTH-2, MENHEIGHT-2, MENWIDTH, MENHEIGHT, ITEMTEXT | MENUTOGGLE | ITEMENABLED | HIGHCOMP, 0, (APTR)&menuIText[4], NULL, NULL, NULL, NULL } }; struct MenuItem menu1[] = { { /* Open... */ &menu1[1], 0, 0, MENWIDTH, MENHEIGHT, ITEMTEXT | MENUTOGGLE | ITEMENABLED | HIGHCOMP, 0, (APTR)&menuIText[0], NULL, NULL, NULL, NULL }, { /* Save */ &menu1[2], 0, MENHEIGHT , MENWIDTH, MENHEIGHT, ITEMTEXT | MENUTOGGLE | ITEMENABLED | HIGHCOMP, 0, (APTR)&menuIText[1], NULL, NULL, NULL, NULL }, { /* Print */ &menu1[3], 0, 2*MENHEIGHT , MENWIDTH, MENHEIGHT, ITEMTEXT | MENUTOGGLE | ITEMENABLED | HIGHCOMP, 0, (APTR)&menuIText[2], NULL, NULL, &submenu1[0] , NULL }, { /* Quit */ NULL, 0, 3*MENHEIGHT , MENWIDTH, MENHEIGHT, ITEMTEXT | MENUTOGGLE | ITEMENABLED | HIGHCOMP, 0, (APTR)&menuIText[5], NULL, NULL, NULL, NULL }, }; /* We only use a single menu, but the code is generalizable to */ /* more than one menu. */ #define NUM_MENUS 1 STRPTR menutitle[NUM_MENUS] = { "Project" }; struct Menu menustrip[NUM_MENUS] = { { NULL, /* Next Menu */ 0, 0, /* LeftEdge, TopEdge, */ 0, MENHEIGHT, /* Width, Height, */ MENUENABLED, /* Flags */ NULL, /* Title */ &menu1[0] /* First item */ } }; struct NewWindow mynewWindow = { 40,40, 300,100, 0,1, IDCMP_CLOSEWINDOW | IDCMP_MENUPICK, WFLG_DRAGBAR | WFLG_ACTIVATE | WFLG_CLOSEGADGET, NULL,NULL, "Menu Test Window", NULL,NULL,0,0,0,0,WBENCHSCREEN }; /* our function prototypes */ VOID handleWindow(struct Window *win, struct Menu *menuStrip); /* Main routine. */ /* */ VOID main(int argc, char **argv) { struct Window *win=NULL; UWORD left, m; /* Open the Graphics Library */ GfxBase = OpenLibrary("graphics.library",33); if (GfxBase) { /* Open the Intuition Library */ IntuitionBase = OpenLibrary("intuition.library", 33); if (IntuitionBase) { if ( win = OpenWindow(&mynewWindow) ) { left = 2; for (m = 0; m < NUM_MENUS; m++) { menustrip[m].LeftEdge = left; menustrip[m].MenuName = menutitle[m]; menustrip[m].Width = TextLength(&win->WScreen->RastPort, menutitle[m], strlen(menutitle[m])) + 8; left += menustrip[m].Width; } if (SetMenuStrip(win, menustrip)) { handleWindow(win, menustrip); ClearMenuStrip(win); } CloseWindow(win); } CloseLibrary(IntuitionBase); } CloseLibrary(GfxBase); } } /* ** Wait for the user to select the close gadget. */ VOID handleWindow(struct Window *win, struct Menu *menuStrip) { struct IntuiMessage *msg; SHORT done; ULONG class; UWORD menuNumber; UWORD menuNum; UWORD itemNum; UWORD subNum; struct MenuItem *item; done = FALSE; while (FALSE == done) { /* we only have one signal bit, so we do not have to check which ** bit broke the Wait(). */ Wait(1L << win->UserPort->mp_SigBit); while ( (FALSE == done) && (msg = (struct IntuiMessage *)GetMsg(win->UserPort))) { class = msg->Class; if(class == IDCMP_MENUPICK) menuNumber = msg->Code; switch (class) { case IDCMP_CLOSEWINDOW: done = TRUE; break; case IDCMP_MENUPICK: while ((menuNumber != MENUNULL) && (!done)) { item = ItemAddress(menuStrip, menuNumber); /* process this item ** if there were no sub-items attached to that item, ** SubNumber will equal NOSUB. */ menuNum = MENUNUM(menuNumber); itemNum = ITEMNUM(menuNumber); subNum = SUBNUM(menuNumber); /* Note that we are printing all values, even things ** like NOMENU, NOITEM and NOSUB. An application should ** check for these cases. */ printf("IDCMP_MENUPICK: menu %d, item %d, sub %d\n", menuNum, itemNum, subNum); /* This one is the quit menu selection... ** stop if we get it, and don't process any more. */ if ((menuNum == 0) && (itemNum == 4)) done = TRUE; menuNumber = item->NextSelect; } break; } ReplyMsg((struct Message *)msg); } } }