/* The functions used to set up and control GadTools menus are discussed * in the next section. Before looking at these functions in detail, it * may be helpful to look at a brief example. */ /* gadtoolsmenu.c ** Example showing the basic usage of the menu system with a window. ** Menu layout is done with GadTools, as is recommended for applications. ** ** Compiled with SAS C v5.10a ** lc -b1 -cfistq -v -y gadtoolsmenu ** blink FROM LIB:c.o gadtoolsmenu.o TO gadtoolsmenu LIB LIB:lc.lib LIB:amiga.lib */ #define INTUI_V36_NAMES_ONLY #include <exec/types.h> #include <intuition/intuition.h> #include <intuition/intuitionbase.h> #include <libraries/gadtools.h> #include <clib/exec_protos.h> #include <clib/gadtools_protos.h> #include <clib/intuition_protos.h> #include <stdio.h> #ifdef LATTICE int CXBRK(void) { return(0); } /* Disable Lattice CTRL/C handling */ int chkabort(void) { return(0); } /* really */ #endif struct Library *GadToolsBase; struct IntuitionBase *IntuitionBase; struct NewMenu mynewmenu[] = { { NM_TITLE, "Project", 0 , 0, 0, 0,}, { NM_ITEM, "Open...", "O", 0, 0, 0,}, { NM_ITEM, "Save", "S", 0, 0, 0,}, { NM_ITEM, NM_BARLABEL, 0 , 0, 0, 0,}, { NM_ITEM, "Print", 0 , 0, 0, 0,}, { NM_SUB, "Draft", 0 , 0, 0, 0,}, { NM_SUB, "NLQ", 0 , 0, 0, 0,}, { NM_ITEM, NM_BARLABEL, 0 , 0, 0, 0,}, { NM_ITEM, "Quit...", "Q", 0, 0, 0,}, { NM_TITLE, "Edit", 0 , 0, 0, 0,}, { NM_ITEM, "Cut", "X", 0, 0, 0,}, { NM_ITEM, "Copy", "C", 0, 0, 0,}, { NM_ITEM, "Paste", "V", 0, 0, 0,}, { NM_ITEM, NM_BARLABEL, 0 , 0, 0, 0,}, { NM_ITEM, "Undo", "Z", 0, 0, 0,}, { NM_END, NULL, 0 , 0, 0, 0,}, }; /* ** Watch the menus and wait for the user to select the close gadget ** or quit from the menus. */ VOID handle_window_events(struct Window *win, struct Menu *menuStrip) { struct IntuiMessage *msg; SHORT done; 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) && (NULL != (msg = (struct IntuiMessage *)GetMsg(win->UserPort)))) { switch (msg->Class) { case IDCMP_CLOSEWINDOW: done = TRUE; break; case IDCMP_MENUPICK: menuNumber = msg->Code; while ((menuNumber != MENUNULL) && (!done)) { item = ItemAddress(menuStrip, menuNumber); /* process the item here! */ menuNum = MENUNUM(menuNumber); itemNum = ITEMNUM(menuNumber); subNum = SUBNUM(menuNumber); /* stop if quit is selected. */ if ((menuNum == 0) && (itemNum == 5)) done = TRUE; menuNumber = item->NextSelect; } break; } ReplyMsg((struct Message *)msg); } } } /* ** Open all of the required libraries and set-up the menus. */ VOID main(int argc, char *argv[]) { struct Window *win; APTR *my_VisualInfo; struct Menu *menuStrip; /* Open the Intuition Library */ IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 37); if (IntuitionBase != NULL) { /* Open the gadtools Library */ GadToolsBase = OpenLibrary("gadtools.library", 37); if (GadToolsBase != NULL) { if (NULL != (win = OpenWindowTags(NULL, WA_Width, 400, WA_Activate, TRUE, WA_Height, 100, WA_CloseGadget, TRUE, WA_Title, "Menu Test Window", WA_IDCMP, IDCMP_CLOSEWINDOW | IDCMP_MENUPICK, TAG_END))) { if (NULL != (my_VisualInfo = GetVisualInfo(win->WScreen, TAG_END))) { if (NULL != (menuStrip = CreateMenus(mynewmenu, TAG_END))) { if (LayoutMenus(menuStrip, my_VisualInfo, TAG_END)) { if (SetMenuStrip(win, menuStrip)) { handle_window_events(win,menuStrip); ClearMenuStrip(win); } FreeMenus(menuStrip); } } FreeVisualInfo(my_VisualInfo); } CloseWindow(win); } CloseLibrary((struct Library *)GadToolsBase); } CloseLibrary((struct Library *)IntuitionBase); } }