|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: M T
Length: 33727 (0x83bf) Types: TextFile Names: »MenuEdit.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z« └─⟦2109abc41⟧ └─⟦this⟧ »./X.V10R4/Toolkit/Xr/src/Xrlib/Dialog/MenuEdit.c«
/* * $Source: /u1/Xr/src/Xrlib/Dialog/RCS/MenuEdit.c,v $ * $Header: MenuEdit.c,v 1.1 86/12/17 08:58:05 swick Exp $ */ #ifndef lint static char *rcsid_MenuEdit_c = "$Header: MenuEdit.c,v 1.1 86/12/17 08:58:05 swick Exp $"; #endif lint #include <Xr/xr-copyright.h> /* $Header: MenuEdit.c,v 1.1 86/12/17 08:58:05 swick Exp $ */ /* Copyright 1986, Hewlett-Packard Company */ /* Copyright 1986, Massachussetts Institute of Technology */ static char rcsid[] = "$Header: MenuEdit.c,v 1.1 86/12/17 08:58:05 swick Exp $"; /*************************************<+>************************************* ***************************************************************************** ** ** File: MenuEdit.c ** ** Project: X-ray Toolbox ** ** Description: X-ray Toolbox Menu Editor ** ** ** ** ------------------------ MODIFICATION RECORD ------------------------ * * $Log: MenuEdit.c,v $ * Revision 1.1 86/12/17 08:58:05 swick * Initial revision * * Revision 7.0 86/11/13 08:27:56 08:27:56 ed () * Final QA release * * Revision 6.1 86/11/12 21:08:38 21:08:38 ed () * Fixed: Explicitly set title info to NULL if no title bar. * * Revision 6.0 86/11/10 15:37:15 15:37:15 ed () * QA #2 release * * Revision 5.2 86/11/07 14:09:52 14:09:52 ed () * Added procedure headers, new copyright message. * * Revision 5.1 86/11/06 11:33:18 11:33:18 ed () * Fixed space padding for keyboard equivalents. * * Revision 5.0 86/10/28 08:25:13 08:25:13 ed () * QA #1.1 release * * Revision 4.0 86/10/20 12:07:59 12:07:59 ed () * QA #1 release * * Revision 3.9 86/10/19 14:17:03 14:17:03 ed () * Linted, register variables, prepared for Beta release. * * Revision 3.8 86/10/18 16:58:40 16:58:40 ed () * Fixed cascade anomolieamlies * Tuned line placement * * Revision 3.7 86/10/15 21:43:16 21:43:16 ed () * Memory management changes * * Revision 3.6 86/10/14 16:45:24 16:45:24 ed () * Added item functs and item events * * Revision 3.5 86/10/13 20:43:32 20:43:32 ed () * Keyboard equivalents (added drawing). * * Revision 3.4 86/10/10 08:57:10 08:57:10 ed () * More drawing changes. * * Revision 3.2 86/10/09 15:49:40 15:49:40 ed () * Many editor drawing changes. Color, lines... * * Revision 3.1 86/10/08 08:43:15 08:43:15 ed () * Rearranged MSG_NEW, MSG_EDIT, added new XrMapButton * * Revision 3.0 86/10/02 16:03:34 16:03:34 ed () * Alpha Release set to 3.0 * * Revision 1.2 86/09/29 15:39:29 15:39:29 ed () * Removed code that created dithering pixmap. * Now using global. * * * Revision 1.1 86/09/28 19:15:43 19:15:43 ed () * Initial revision * ***************************************************************************** *************************************<+>*************************************/ #include <X/Xlib.h> #include <Xr/defs.h> #include <Xr/types.h> #include <Xr/in_types.h> extern INT32 createMenuEdit(); extern INT32 drawMenuEdit(); extern INT32 processMenuEdit(); extern INT32 highlightItem(); extern INT32 menuState(); static xrTitleBarInfo titleSizeInfo = {0, {0,0,0,0}, 0,0,0, NULL, NULL, NULL, NULL}; \f /*************************************<->************************************* * * XrMenuEdit(menuEdit, message, data) * * xrEditor * menuEdit * INT32 message; * INT8 * data; * * Description: * ----------- * This is the MenuEdit field editor. This editor was written for * the menu manager. It does not abide by all the rules of * standard editors and should not be used as one. This editor * is in charge of the visual and semantic aspects of menu items. * It is called by the menu manager. * * * Inputs: * ------ * menu = This value indicates to the menuEdit editor, * which editor should be dealt with. * * message = Contains the command to be executed. * * data = Varies depending on the message, But is generally * a pointer to a structure. * * * Outputs: * ------- * menuEdit = Returned from MSG_NEW. * * TRUE = Returned upon successful completion of a message. * * NULL = Returned if something went wrong. * * xrError = The error variable is set to one of several values * upon failure of this routine. * * Procedures Called * ----------------- * MSG_NEW: * (* xrMalloc)() * (* xrFree)() * createMenuEdit() * _XrInitEditorStruct() - editorUtil.c * * MSG_FREE: * XrTitleBar() - TitleBar.c * XFreePixmap() - XLib * (* xrFree)() * * MSG_EDIT: * XrSetPt() - calc.c * processMenuEdit() * XrInput() - input.c * * MSG_SIZE: * XrStringWidth() - editorUtil.c * _XrTextInfo() - editorUtil.c * XrTitleBar() - TitleBar.c * * * * *************************************<->***********************************/ xrEditor * XrMenuEdit (menuEdit, message, data) register xrEditor * menuEdit; INT32 message; INT8 * data; { /****************************************************************** * * Process the messages sent to the menu editor. * ******************************************************************/ switch (message) { case MSG_NEW: { xrEditor * mnuEdit; register xrMenuEditor * menuInfo = (xrMenuEditor *) data; INT8 * dataPtr; /* Validate the pointer to the info for the new editor instance */ if (menuInfo == NULL) { xrErrno = XrINVALIDPTR; return ((xrEditor *) NULL); } else if (menuInfo -> editorWindowId == 0) { xrErrno = XrINVALIDID; return ((xrEditor *) NULL); } /* Allocate some data area, to hold the instance specific data */ if ((dataPtr = (*xrMalloc) (sizeof(xrMenuData))) == NULL) { xrErrno = XrOUTOFMEM; return ((xrEditor *) NULL); } /* Allocate some space for the editor structure */ if ((mnuEdit = (xrEditor *)(*xrMalloc)(sizeof(xrEditor))) == NULL) { (*xrFree) (dataPtr); xrErrno = XrOUTOFMEM; return ((xrEditor *) NULL); } /* Call the routine responsible for creating the instance */ if (createMenuEdit(dataPtr, menuInfo, MSG_NEW) == FALSE) { /* Create failed; xrErrno is set by the create function */ (*xrFree) (dataPtr); (*xrFree) (mnuEdit); return ((xrEditor *)NULL); } /* Initialize the instance's data structures */ _XrInitEditorStruct (mnuEdit, menuInfo, dataPtr, XrMenuEdit); /* Create request was successful */ return (mnuEdit); break; } case MSG_FREE: { register xrMenuData * menuData; menuData = (xrMenuData *) menuEdit -> editorData; XrTitleBar(menuData -> menuTitleBar, MSG_FREE, NULL); XFreePixmap(menuData -> menuTile); (* xrFree)(menuData -> popupMenu); (* xrFree)(menuData -> itemFunct); (* xrFree)(menuData -> itemEvent); (* xrFree)(menuData -> itemPosy); (* xrFree)(menuData); (* xrFree)(menuEdit); return((xrEditor *) TRUE); break; } case MSG_EDIT: { xrEvent returnEvent; /* * Fill out the return keystroke. * The editor itself must fill out the value1 field. */ returnEvent.type = XrXRAY; returnEvent.source = menuEdit -> editorWindowId; returnEvent.inputType = XrEDITOR; returnEvent.inputCode = XrMENUEDIT; returnEvent.valuePtr = (INT32) menuEdit; XrSetPt (&returnEvent.valuePt, 0, 0); /* Process the keystroke */ processMenuEdit (menuEdit, &returnEvent); /* Push the xrEvent structure onto the input queue */ XrInput (NULL, MSG_PUSHEVENT, &returnEvent); return (menuEdit); break; } case MSG_GETSTATE: { return((xrEditor *) _MsgGetState(menuEdit, data)); break; } case MSG_SETSTATE: { return((xrEditor *) _MsgSetState(menuEdit, data, drawMenuEdit, NULL)); break; } case MSG_REDRAW: { return((xrEditor *) _MsgRedraw(menuEdit, data, drawMenuEdit, NULL)); break; } case MSG_RESET: { xrMenuData * meDataPtr; meDataPtr = (xrMenuData *) menuEdit -> editorData; meDataPtr -> menuArea = -1; meDataPtr -> menuItem = -1; return((xrEditor *)TRUE); break; } case MSG_SIZE: { register xrMenuEditor * menuInfo; INT32 currentWidth, currentHeight, stringWidth, tmpWidth; register INT32 i; register INT32 pad; xrTextInfo textInfo; INT32 lineThick, lineHeight, dlineHeight; /* * Return the size of the rectangle needed to enclose * an instance of this editor, using the specifications * passed in by the application program. */ menuInfo = (xrMenuEditor *) data; if (menuInfo == NULL) { xrErrno = XrINVALIDPTR; return((xrEditor *) NULL); } menuInfo -> editorRect.x = 0; menuInfo -> editorRect.y = 0; /* * Determine the width of the menu. * * width = pad * 2 + (left margin) * width of longest item + (item length) * pad + (middle margin) * fontinfo.width * 2 + (arrow, kbd equiv marks) * pad * 2; (right margin) */ /* width of the left margin */ pad = menuInfo -> editorFont -> width; currentWidth = pad * 2; /* width of the widest item */ stringWidth = 0; for (i=0; i < menuInfo -> numItems; i++) { if (menuInfo -> itemTypes[i] == XrSTRING || menuInfo -> itemTypes[i] == XrUSTRING) { tmpWidth = XrStringWidth( menuInfo -> editorFont, menuInfo -> menuStrings[i], * (menuInfo -> stringLengths + i), 0, 0); if (stringWidth < tmpWidth) stringWidth = tmpWidth; } } currentWidth += stringWidth; /* middle margin, arrow, kbd equivs, right margin */ currentWidth += pad; currentWidth += (pad * 2); currentWidth += pad * 2; menuInfo -> editorRect.width = currentWidth; /* * Determine the height of the menu. * * width = height of titlebar + (title height) * leading + (top margin) * sum of item heights + (item heights) * leading; (bottom margin) */ /* top margin */ _XrTextInfo(menuInfo -> editorFont, &textInfo); currentHeight = textInfo.leading; /* height of the title bar */ if (menuInfo -> menuTitle != NULL) { titleSizeInfo.editorFont = menuInfo -> editorFont; titleSizeInfo.titleName = menuInfo -> menuTitle; if (!(XrTitleBar(NULL, MSG_SIZE, &titleSizeInfo))) return((xrEditor *) NULL); if (titleSizeInfo.editorRect.width > menuInfo -> editorRect.width) menuInfo -> editorRect.width = titleSizeInfo.editorRect.width; currentHeight += titleSizeInfo.editorRect.height; } /* sum the item heights */ lineThick = textInfo.leading/3; if(lineThick == 0) lineThick = 1; lineHeight = lineThick * 4 + lineThick; dlineHeight = lineThick * 4 + lineThick * 3; for (i=0; i < menuInfo -> numItems; i++) { switch (menuInfo -> itemTypes[i]) { case XrSTRING: case XrUSTRING: currentHeight += (menuInfo -> editorFont -> height); break; case XrLINE: currentHeight += lineHeight; break; case XrDBLINE: currentHeight += dlineHeight; break; default: break; } } /* Bottom margin */ currentHeight += textInfo.leading; menuInfo -> editorRect.height = currentHeight; return((xrEditor *) TRUE); break; } /* end MSG_SIZE */ default: xrErrno = XrINVALIDMSG; return((xrEditor *) NULL); break; } /* end switch */ return((xrEditor *) NULL); } \f /*************************************<->************************************* * * createMenuEdit(meDataPtr, meInfoPtr) * xrMenuData * meDataPtr; * xrMenuEditor * meInfoPtr; * * Description: * ----------- * This routine take an editor info structure and creates the * internal data structure. * * * Inputs: * ------ * meDataPtr = A pointer to the internal menu structure. * meInfoPtr = A pointer to the info structure to be used. * * Outputs: * ------- * meDataPtr = a filled out xrMenuData structure. * * Procedures Called * ----------------- * (* xrMalloc)() * (* xrFree)() * XrCopyRect() - calc.c * XrTitleBar() - TitleBar.c * XrResource() - resource.c * XMakePixmap() - XLib * _XrTextInfo() - editorUtil.c * * *************************************<->***********************************/ static INT32 createMenuEdit(meDataPtr, meInfoPtr) register xrMenuData * meDataPtr; register xrMenuEditor * meInfoPtr; { register INT32 i; register INT32 pad; INT32 currentYPos, lineThick, lineHeight, dlineHeight; xrResourceInfo resourceInfo; if ((meDataPtr -> itemEvent = (xrEvent **) (*xrMalloc)(sizeof(xrEvent *) * (meInfoPtr -> numItems))) == NULL) { xrErrno = XrOUTOFMEM; return (NULL); } if ((meDataPtr -> itemFunct = (xrPFI *) (*xrMalloc)(sizeof(xrPFI) * (meInfoPtr -> numItems))) == NULL) { xrErrno = XrOUTOFMEM; (* xrFree)(meDataPtr -> itemEvent); return (NULL); } if ((meDataPtr -> popupMenu = (xrMenu **) (*xrMalloc)(sizeof(xrMenu *) * (meInfoPtr -> numItems))) == NULL) { xrErrno = XrOUTOFMEM; (* xrFree)(meDataPtr -> itemFunct); (* xrFree)(meDataPtr -> itemEvent); return (NULL); } if ((meDataPtr -> itemPosy = (INT32 *) (*xrMalloc)(sizeof(INT32) * (meInfoPtr -> numItems))) == NULL) { xrErrno = XrOUTOFMEM; (* xrFree)(meDataPtr -> popupMenu); (* xrFree)(meDataPtr -> itemFunct); (* xrFree)(meDataPtr -> itemEvent); return (NULL); } /* Create title bar if a title string is given. */ XrCopyRect(&xrZeroRect, &titleSizeInfo.editorRect); if (meInfoPtr -> menuTitle) { titleSizeInfo.editorWindowId = meInfoPtr -> editorWindowId; titleSizeInfo.editorState = XrVISIBLE | XrSENSITIVE; titleSizeInfo.editorFGColor = meInfoPtr -> editorFGColor; titleSizeInfo.editorBGColor = meInfoPtr -> editorBGColor; titleSizeInfo.editorFont = meInfoPtr -> editorFont; titleSizeInfo.titleName = meInfoPtr -> menuTitle; XrTitleBar(NULL, MSG_SIZE, &titleSizeInfo); titleSizeInfo.editorRect.width = meInfoPtr -> editorRect.width; meDataPtr -> menuTitleBar = XrTitleBar(NULL, MSG_NEW, &titleSizeInfo); } else { meDataPtr -> menuTitleBar = NULL; } /* Copy the elements of the info structure to the data structure */ meDataPtr -> meFGColor = meInfoPtr -> editorFGColor; meDataPtr -> meBGColor = meInfoPtr -> editorBGColor; resourceInfo.resourceType = XrTYPE_BITMAPID; resourceInfo.resourceId = XrPERCENT50; XrResource (MSG_FIND, &resourceInfo); meDataPtr -> menuTile = XMakePixmap (((xrBitmapId *)resourceInfo.resourceObject) -> bitmapId, meDataPtr -> meFGColor, meDataPtr -> meBGColor); meDataPtr -> numItems = meInfoPtr -> numItems; meDataPtr -> itemTypes = meInfoPtr -> itemTypes; meDataPtr -> menuStrings = meInfoPtr -> menuStrings; meDataPtr -> stringLengths = meInfoPtr -> stringLengths; meDataPtr -> keybdEquiv = meInfoPtr -> keybdEquiv; /* fill out the dataPtr elements used to draw the menu */ _XrTextInfo(meInfoPtr -> editorFont, &meDataPtr -> menuTextInfo); pad = meInfoPtr -> editorFont -> width; meDataPtr -> highlightStart = 2; meDataPtr -> highlightLength = meInfoPtr -> editorRect.width -4; meDataPtr -> itemPosx = pad * 2; meDataPtr -> kbdeqPosx = meInfoPtr -> editorRect.width - (pad * 4); meDataPtr -> popupPosx = meInfoPtr -> editorRect.width - (meInfoPtr -> editorRect.width / 3); /* Figure the y locations for each item in the menu */ currentYPos = titleSizeInfo.editorRect.height + meDataPtr -> menuTextInfo.leading + 1; meDataPtr -> stringHeight = meInfoPtr -> editorFont -> height; lineThick = meDataPtr -> menuTextInfo.leading/3; if(lineThick == 0) lineThick = 1; lineHeight = lineThick * 4 + lineThick; dlineHeight = lineThick * 4 + lineThick * 3; meDataPtr -> lineThickness = lineThick; for (i=0; i < meDataPtr -> numItems; i++) { meDataPtr -> itemFunct[i] = NULL; meDataPtr -> itemEvent[i] = NULL; meDataPtr -> popupMenu[i] = NULL; switch (meDataPtr -> itemTypes[i]) { case XrSTRING: case XrUSTRING: meDataPtr -> itemPosy[i] = currentYPos; currentYPos += (meInfoPtr -> editorFont -> height); break; case XrLINE: meDataPtr -> itemPosy[i] = currentYPos; currentYPos += lineHeight; break; case XrDBLINE: meDataPtr -> itemPosy[i] = currentYPos; currentYPos += dlineHeight; break; default: break; } } meDataPtr -> menuArea = -1; meDataPtr -> menuItem = -1; return(TRUE); } \f /*************************************<->************************************* * * drawMenuEdit(menuEdit, drawOption) * xrMenuEditor * meInfoPtr; * INT32 drawOption; * * Description: * ----------- * This routine take an editor structure and draws the * menu in the given window. * * * Inputs: * ------ * meInfoPtr = A pointer to the info structure to be used. * * Outputs: * ------- * None * * Procedures Called * ----------------- * XrTitleBar() - TitleBar.c * XText() - XLib * XTileFill() - XLib * XTextPad() - XLib * XPixSet() - XLib * * * *************************************<->***********************************/ static INT32 drawMenuEdit(menuEdit, drawOption) register xrEditor * menuEdit; INT32 drawOption; { register xrMenuData * menuData; register INT32 i; static char * popupMark = "->"; static char * kbdMark = "^ "; register char * mark; menuData = (xrMenuData *) (menuEdit -> editorData); XrTitleBar(menuData -> menuTitleBar, MSG_REDRAW, XrREDRAW_ALL); for (i=0; i < menuData -> numItems; i++) { mark = NULL; if (menuData -> popupMenu[i] != NULL) mark = popupMark; if (menuData -> keybdEquiv[i] != NULL) { kbdMark[1] = (INT8) menuData -> keybdEquiv[i]; mark = kbdMark; } switch (menuData -> itemTypes[i]) { case XrSTRING: { XText(menuEdit -> editorWindowId, menuData -> itemPosx, menuData -> itemPosy[i], menuData -> menuStrings[i], menuData -> stringLengths[i], menuData -> menuTextInfo.fontInfo -> id, menuData -> meFGColor, menuData -> meBGColor); if (mark) { XText(menuEdit -> editorWindowId, menuData -> kbdeqPosx, menuData -> itemPosy[i], mark, 2, menuData -> menuTextInfo.fontInfo -> id, menuData -> meFGColor, menuData -> meBGColor); } break; } case XrUSTRING: { XText (menuEdit -> editorWindowId, menuData -> itemPosx, menuData -> itemPosy[i], menuData -> menuStrings[i], menuData -> stringLengths[i], menuData -> menuTextInfo.fontInfo -> id, AllPlanes, 0); XTileFill (menuEdit -> editorWindowId, menuData -> itemPosx, menuData -> itemPosy[i], XrStringWidth(menuData -> menuTextInfo.fontInfo, menuData -> menuStrings[i], menuData -> stringLengths[i], 0,0), menuData -> menuTextInfo.fontInfo -> height, menuData -> menuTile, 0, GXand, AllPlanes); XTextPad (menuEdit -> editorWindowId, menuData -> itemPosx, menuData -> itemPosy[i], menuData -> menuStrings[i], menuData -> stringLengths[i], menuData -> menuTextInfo.fontInfo -> id, 0,0, BlackPixel, menuData -> meBGColor, GXor, AllPlanes); if (mark) { XText(menuEdit -> editorWindowId, menuData -> kbdeqPosx, menuData -> itemPosy[i], mark, 2, menuData -> menuTextInfo.fontInfo -> id, AllPlanes, 0); XTileFill (menuEdit -> editorWindowId, menuData -> kbdeqPosx, menuData -> itemPosy[i], XrStringWidth(menuData -> menuTextInfo.fontInfo, mark, 2, 0,0), menuData -> menuTextInfo.fontInfo -> height, menuData -> menuTile, 0, GXand, AllPlanes); XTextPad (menuEdit -> editorWindowId, menuData -> kbdeqPosx, menuData -> itemPosy[i], mark, 2, menuData -> menuTextInfo.fontInfo -> id, 0,0, BlackPixel, menuData -> meBGColor, GXor, AllPlanes); } break; } case XrLINE: XPixSet(menuEdit -> editorWindowId, menuEdit -> editorRect.x, menuData -> itemPosy[i] + menuData -> lineThickness * 2, menuEdit -> editorRect.width, menuData -> lineThickness, menuData -> meFGColor); break; case XrDBLINE: XPixSet(menuEdit -> editorWindowId, menuEdit -> editorRect.x, menuData -> itemPosy[i] + menuData -> lineThickness * 2, menuEdit -> editorRect.width, menuData -> lineThickness, menuData -> meFGColor); XPixSet(menuEdit -> editorWindowId, menuEdit -> editorRect.x, menuData -> itemPosy[i] + (menuData->lineThickness * 4), menuEdit -> editorRect.width, menuData -> lineThickness, menuData -> meFGColor); break; default: break; } } return(TRUE); } /*************************************<->************************************* * * processMenuEdit(menuEdit, returnEvent) * xrEditor * menuEdit; * xrEvent * returnEvent; * * Description: * ----------- * This routine processes input from the user while a menu is posted. * It informs the menu manager what is happening with a particular * posted menu. * * * Inputs: * ------ * menuEdit = The editor instance to process. * returnEvent = A return parameter. * * Outputs: * ------- * returnEvent = Filled out with the result of the menu editing * session. * * Procedures Called * ----------------- * XrInput() * XrMapButton() * highlightItem() * menuState() * * * *************************************<->***********************************/ static INT32 processMenuEdit(menuEdit, returnEvent) register xrEditor * menuEdit; xrEvent * returnEvent; { register xrMenuData * menuData; register INT32 currentArea, currentItem; INT32 newArea, newItem, stateChange; xrEvent key; XEvent * menuEvent; menuData = (xrMenuData *) (menuEdit -> editorData); currentArea = menuData -> menuArea; currentItem = menuData -> menuItem; while (1) { returnEvent -> value3 = NULL; if (XrInput (NULL, MSG_NONBLKREAD, &key)) { if(XrMapButton(XrMENUITEMSELECT,&key)) { returnEvent -> value1 = menuData -> menuArea = currentArea; returnEvent -> value2 = menuData -> menuItem = currentItem; returnEvent -> value3 = XrMENUITEMSELECT; return (TRUE); } else { /* check for leaving window keystroke */ menuEvent = (XEvent *) (& key); if ((menuEvent -> type == LeaveWindow) && (menuEvent -> window == menuEdit -> editorWindowId)) { returnEvent -> value1 = menuData -> menuArea = XrOUTSIDEMENU; returnEvent -> value2 = menuData -> menuItem = -1; highlightItem(menuEdit, currentItem, FALSE); return (TRUE); } } } menuState(menuEdit, currentArea, currentItem, &newArea, &newItem, &stateChange); switch (stateChange) { case XrNOCHANGE: break; case XrITEMCHANGE: if (currentItem != -1) { highlightItem(menuEdit, currentItem, FALSE); if (currentArea == XrPOPUPAREA) { returnEvent -> value1 = menuData -> menuArea = XrEXITPOPUP; returnEvent -> value2 = menuData -> menuItem = currentItem; return(TRUE); } } if (newItem != -1) highlightItem(menuEdit, newItem, TRUE); currentItem = newItem; break; case XrAREACHANGE: if (currentArea == XrPOPUPAREA) { returnEvent -> value1 = menuData -> menuArea = XrEXITPOPUP; returnEvent -> value2 = menuData -> menuItem = currentItem; return(TRUE); } if (newArea == XrPOPUPAREA) { returnEvent -> value1 = menuData -> menuArea = newArea; returnEvent -> value2 = menuData -> menuItem = currentItem; return(TRUE); } currentArea = newArea; break; case XrBOTHCHANGE: if (currentArea == XrPOPUPAREA) { returnEvent -> value1 = menuData -> menuArea = XrEXITPOPUP; returnEvent -> value2 = menuData -> menuItem = currentItem; return(TRUE); } if (currentItem != -1) highlightItem(menuEdit, currentItem, FALSE); if (newItem != -1) highlightItem(menuEdit, newItem, TRUE); currentItem = newItem; if (newArea == XrPOPUPAREA) { returnEvent -> value1 = menuData -> menuArea = newArea; returnEvent -> value2 = menuData -> menuItem = currentItem; return(TRUE); } currentArea = newArea; break; } }/* while end */ } \f /*************************************<->************************************* * * highLightItem() * * Description: * ----------- * This procedure highlights a particular item in a given menu. * *************************************<->***********************************/ static INT32 highlightItem(menuEdit, item, mode) register xrEditor * menuEdit; register INT32 item; register INT32 mode; { register xrMenuData * menuData; register INT32 foreGround, backGround; static char * popupMark = "->"; static char * kbdMark = "^ "; char * mark; menuData = (xrMenuData *) (menuEdit -> editorData); mark = NULL; if (menuData -> popupMenu[item] != NULL) mark = popupMark; if (menuData -> keybdEquiv[item] != NULL) { kbdMark[1] = (INT8) menuData -> keybdEquiv[item]; mark = kbdMark; } if ((menuData -> itemTypes[item]) == XrSTRING) { if (mode) { foreGround = menuData -> meBGColor; backGround = menuData -> meFGColor; } else { foreGround = menuData -> meFGColor; backGround = menuData -> meBGColor; } XPixSet(menuEdit -> editorWindowId, menuData -> highlightStart, menuData -> itemPosy[item], menuData -> highlightLength, menuData -> stringHeight, backGround); XText (menuEdit -> editorWindowId, menuData -> itemPosx, menuData -> itemPosy[item], menuData -> menuStrings[item], menuData -> stringLengths[item], menuData -> menuTextInfo.fontInfo -> id, foreGround, backGround ); if (mark) { XText(menuEdit -> editorWindowId, menuData -> kbdeqPosx, menuData -> itemPosy[item], mark, 2, menuData -> menuTextInfo.fontInfo -> id, foreGround, backGround); } } } \f /*************************************<->************************************* * * menuState() * * Description: * ----------- * This procedure gives the current state of the cursor in a menu. * *************************************<->***********************************/ static INT32 menuState(menuEdit, currentArea, currentItem, newArea, newItem, change) xrEditor * menuEdit; INT32 currentArea; INT32 currentItem; INT32 * newArea; register INT32 * newItem; register INT32 * change; { Window subw; INT32 cursorX, cursorY, menuItem; POINT cursorPt; register xrMenuData * menuData; register INT32 i; menuData = (xrMenuData *) (menuEdit -> editorData); menuItem = TRUE; XQueryMouse(menuEdit -> editorWindowId, &cursorX, &cursorY, &subw); XrSetPt(&cursorPt, cursorX, cursorY); if(!(XrPtInRect(&cursorPt, &menuEdit -> editorRect))) { menuItem = FALSE; * newArea = XrOUTSIDEMENU; * newItem = -1; } if (cursorY < menuData -> itemPosy[0]) { menuItem = FALSE; * newArea = XrNULLAREA; * newItem = -1; } /* The locator is over an item, determine which one, and */ /* then if it is in the popup area of an item. */ if (menuItem) { i = (menuData -> numItems) - 1; while ( cursorY < menuData -> itemPosy[i]) i--; * newItem = i; if ((menuData -> itemTypes[i]) == XrSTRING) { if (cursorX >= menuData -> popupPosx) * newArea = XrPOPUPAREA; else * newArea = XrITEMAREA; } else { * newArea = XrUITEMAREA; } } if ((*newArea != currentArea) && (*newItem != currentItem)) { *change = XrBOTHCHANGE; return(TRUE); } if (*newArea != currentArea) { *change = XrAREACHANGE; return(TRUE); } if (*newItem != currentItem) { *change = XrITEMCHANGE; return(TRUE); } *change = XrNOCHANGE; return(TRUE); }