|
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 - downloadIndex: ┃ M T ┃
Length: 19963 (0x4dfb) Types: TextFile Names: »MsgCommon.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/Editor/MsgCommon.c«
/* * $Source: /u1/Xr/src/Xrlib/Editor/RCS/MsgCommon.c,v $ * $Header: MsgCommon.c,v 1.1 86/12/17 08:59:38 swick Exp $ */ #ifndef lint static char *rcsid_MsgCommon_c = "$Header: MsgCommon.c,v 1.1 86/12/17 08:59:38 swick Exp $"; #endif lint #include <Xr/xr-copyright.h> /* $Header: MsgCommon.c,v 1.1 86/12/17 08:59:38 swick Exp $ */ /* Copyright 1986, Hewlett-Packard Company */ /* Copyright 1986, Massachussetts Institute of Technology */ static char rcsid[] = "$Header: MsgCommon.c,v 1.1 86/12/17 08:59:38 swick Exp $"; /*************************************<+>************************************* ***************************************************************************** ** ** File: MsgCommon.c ** ** Project: X-ray Toolbox ** ** Description: ** This file contains the source code for some utility routines ** used by most field editors. It includes common message ** handlers for the following messages: ** ** MSG_NEW, MSG_FREE, MSG_GETSTATE, MSG_SETSTATE, MSG_REDRAW ** MSG_EDIT ** ** ** ------------------------ MODIFICATION RECORD ------------------------ * * $Log: MsgCommon.c,v $ * Revision 1.1 86/12/17 08:59:38 swick * Initial revision * * Revision 7.0 86/11/13 08:21:25 08:21:25 fred () * Final QA Release * * Revision 6.0 86/11/10 15:27:05 15:27:05 fred () * QA #2 release * * Revision 5.1 86/11/07 14:18:31 14:18:31 fred () * Added new copyright message. * * Revision 5.0 86/10/28 08:25:48 08:25:48 fred () * QA #1.1 release * * Revision 4.0 86/10/20 12:07:46 12:07:46 fred () * QA #1 release * * Revision 3.2 86/10/16 09:13:35 09:13:35 fred () * Performance enhanced: added use of register variables. * * Revision 3.1 86/10/07 16:49:31 16:49:31 fred () * Upgraded to use new XrMapButton() calling sequence. * * Revision 3.0 86/10/02 15:57:55 15:57:55 fred () * Alpha release set to 3.0 * * Revision 2.2 86/09/19 07:09:00 07:09:00 fred () * Added a check for XrVISIBLE before doing any drawing. * * Revision 2.1 86/09/16 10:19:34 10:19:34 fred () * Fixed a bug in _MsgEdit(), where it was still using an xrEvent * structure to check for a SELECT UP, instead of XrMapButton(). * * Revision 2.0 86/09/16 08:03:23 08:03:23 fred () * Updated _MsgEdit() to match new SELECT strategy. * * Revision 1.3 86/09/16 05:45:02 05:45:02 fred () * Modified _MsgEdit() to swallow a select up event. * * Revision 1.2 86/09/15 07:59:32 07:59:32 fred () * Filled in procedure headers * * Revision 1.1 86/09/03 13:56:06 13:56:06 fred () * Initial revision * * ***************************************************************************** *************************************<+>*************************************/ #include <X/Xlib.h> #include <Xr/defs.h> #include <Xr/types.h> #include <Xr/in_types.h> \f /*************************************<->************************************* * * xrEditor * * _MsgNew (instance, infoPtr, dataStructSize, createFunct, * drawFunct, freeFunct, editorHandler, drawOption) * * Description: * ----------- * This routine is capable of creating a new editor instance for * most field editors. It relies upon the fact that the steps for * creating a new instance are identical, regardless of which editor * is being created. The only differences are how the editor's * internal structures are initialized (by the createFunct()), how * the instance is drawn (by the drawFunct()), and how the editor * cleans up when a fatal error occurs (by the freeFunct()). This * modules allows for this, by allowing the editor to specify it's * own create, draw and free functions. * * The steps for creating a new editor instance are as follows: * * - Validate parameters. * - Allocate space for the editor's internal data structure. * - Allocate space for the editor instance structure. * - Call the editor's create function, which fills the internal struct. * - Initialize the editor instance structure. * - Attach the editor instance to the specified window. * - Draw the editor instance. * * * Inputs: * ------ * instance = This is not really used by this call. * * infoPtr = This points to an 'info' structure describing the * new instance; this structure differs between editors. * * dataStructSize = This describes the size of the editor's internal * data structure. It is needed, so that we can * allocate the structure here, without having to * know what the structure looks like. * * createFunct = This is a pointer to the editor's create function. * This function should validate all parameters, and * then fill in the editor's internal structure. It * should return TRUE if all goes well, otherwise FALSE. * * drawFunct = This is a pointer to the editor's draw function. This * function will be invoked, and passed the 'drawOption' * value. This should force the editor to draw the complete * instance, if the XrVISIBLE state flag is set. * * freeFunct = This is a pointer to the editor's error recovery routine. * If an error occurs after the createFunct was called, then * this routine will be called, to allow the editor to free * up any memory the createFunct might have allocated. * * editorHandler = A pointer to the editor's main handler routine. * * drawOption = The option passed to the drawFunct. * * Outputs: * ------- * Upon successful completion, the instance pointer for the new * instance is returned. If the request fails, then 'NULL' is * returned, and xrErrno is set. * * Procedures Called * ----------------- * * _XrInitEditorStruct() [editorUtil.c] * XrEditor() [editor.c] * *************************************<->***********************************/ xrEditor * _MsgNew (instance, infoPtr, dataStructSize, createFunct, drawFunct, freeFunct, editorHandler, drawOption) register xrEditor * instance; register xrEditorTemplate * infoPtr; INT32 dataStructSize; INT32 (*createFunct)(); INT32 (*drawFunct)(); INT32 (*freeFunct)(); INT32 (*editorHandler)(); INT32 drawOption; { /* Create a new instance of an editor */ INT8 * dataPtr; /* Validate the pointer to the info for the new editor instance */ if (infoPtr == NULL) { xrErrno = XrINVALIDPTR; return ((xrEditor *) NULL); } else if (infoPtr->editorWindowId == 0) { xrErrno = XrINVALIDID; return ((xrEditor *) NULL); } /* Allocate some data area, to hold the instance specific data */ if ((dataPtr = (*xrMalloc) (dataStructSize)) == NULL) { xrErrno = XrOUTOFMEM; return ((xrEditor *) NULL); } /* Allocate some space for the editor structure */ if ((instance = (xrEditor *)(*xrMalloc)(sizeof(xrEditor))) == NULL) { (*xrFree) (dataPtr); xrErrno = XrOUTOFMEM; return ((xrEditor *) NULL); } /* Call the routine responsible for creating the instance */ if ((*createFunct) (dataPtr, infoPtr, MSG_NEW) == FALSE) { /* Create failed; xrErrno is set by the create function */ (*xrFree) (dataPtr); (*xrFree) (instance); return ((xrEditor *)NULL); } /* Initialize the instance's data structures */ _XrInitEditorStruct (instance, infoPtr, dataPtr, editorHandler); /* Attach this editor instance to the specified window */ if (XrEditor (infoPtr->editorWindowId, MSG_ADD, instance)==FALSE) { /* Draw request failed; xrErrno is set by XrEditor() */ /* freeFunct() frees any memory allocated by createFunct() */ if (freeFunct) (*freeFunct) (dataPtr); (*xrFree) (dataPtr); (*xrFree) (instance); return ((xrEditor *)NULL); } /* Lastly, draw the editor instance */ if (instance->editorState & XrVISIBLE) (*drawFunct) (instance, drawOption); /* Create request was successful */ return (instance); } \f /*************************************<->************************************* * * _MsgFree (instance, freeFunct) * * xrEditor * instance; * INT32 (*freeFunct)(); * * Description: * ----------- * This is the common MSG_FREE handler. It performs the following * tasks: * * - Make the instance invisible. * - Call freeFunct(), to allow the editor to free up any * memory it might have allocated during MSG_NEW. * - Free up the editor's internal data structures. * - Unattach the editor instance from the window to which * it's attached. * - Free up the editor instance structure. * * * Inputs: * ------ * instance = This points to the editor instance structure for the * instance which is to be destroyed. * * freeFunct = A pointer to a function, which will deallocate any * memory previously allocated by the editor's createFunct * at the time the instance was created. * * Outputs: * ------- * Upon successful completion, the editor instance pointer is returned; * if the request fails, then NULL is returned and xrErrno is set. * * Procedures Called * ----------------- * _XrMakeInvisible() [editorUtil.c] * XrEditor() [editor.c] * *************************************<->***********************************/ xrEditor * _MsgFree (instance, freeFunct) register xrEditor * instance; INT32 (*freeFunct)(); { /* Destroy the specified editor instance */ if (instance == NULL) { xrErrno = XrINVALIDID; return ((xrEditor *)NULL); } /* Remove the instance from the window, if visible */ if (instance->editorState & XrVISIBLE) { _XrMakeInvisible (instance->editorWindowId, &instance->editorRect, TRUE); } /* Free up any space allocated by the field editor */ if (freeFunct) (*freeFunct) (instance->editorData); /* Unattach the editor from the window */ (*xrFree) (instance->editorData); XrEditor (instance->editorWindowId, MSG_REMOVE, instance); (*xrFree) (instance); return (instance); } \f /*************************************<->************************************* * * _MsgGetState (instance, stateFlags) * * xrEditor * instance; * INT8 * stateFlags * * Description: * ----------- * Returns the current state flags for the specified editor instance. * * * Inputs: * ------ * instance = This is a pointer to the editor instance structure, * and indicates which editor instance is to be queried. * * stateFlags = A pointer to an 8 bit integer value, into which the * current state flag values will be placed. * * Outputs: * ------- * Upon successful completion, the editor instance pointer is returned, * and the current state flags will be returned in the value * pointed to by the 'stateFlags' parameter; if the request fails, * then NULL is returned, and xrErrno is set * * Procedures Called * ----------------- * *************************************<->***********************************/ xrEditor * _MsgGetState (instance, stateFlags) xrEditor * instance; INT8 * stateFlags; { /* Return some info describing current state of editor */ if (instance == NULL) { xrErrno = XrINVALIDID; return ((xrEditor *)NULL); } else if (stateFlags == NULL) { xrErrno = XrINVALIDPTR; return ((xrEditor *)NULL); } *stateFlags = instance->editorState; return (instance); } \f /*************************************<->************************************* * * _MsgSetState (instance, stateFlags, drawFunct, drawOption) * * xrEditor * instance; * INT8 stateFlags; * INT32 (*drawFunct)(); * INT32 drawOption; * * Description: * ----------- * This routine sets the state flags for the specified editor isntance * to the value specified in the 'stateFlags' parameter. After setting * the new state flags, the editor's drawing function will be called, * and passed the redraw option specified by the 'drawOption' parameter. * If the instance is visible, then the draw function should redraw * the specified instance, to match the new state flags. * * * Inputs: * ------ * instance = This is the editor instance pointer, and indicates which * editor instance is to have its state flags modified. * * stateFlags = This contains the new editor state flags. * * drawFunct = This points to the editors drawing function. * * drawOption = This specifies the option which should be passed to * the editor's draw function, such that the whole * editor instance will be redraw. * * Outputs: * ------- * Upon successful completion, the editor instance pointer will be * returned; if the call fails, then NULL will be returned and * xrErrno set. * * Procedures Called * ----------------- * *************************************<->***********************************/ xrEditor * _MsgSetState (instance, stateFlags, drawFunct, drawOption) register xrEditor * instance; INT8 stateFlags; INT32 (*drawFunct)(); INT32 drawOption; { /* Change the state of this editor instance */ INT8 oldState; if (instance == NULL) { xrErrno = XrINVALIDID; return ((xrEditor *)NULL); } oldState = instance->editorState; instance->editorState = stateFlags; /* * Redraw the instance if either the XrVISIBLE flag has changed, * or if the instance is visible and the XrSENSITIVE flag has * changed. */ if (((oldState & XrVISIBLE) != (stateFlags & XrVISIBLE)) || ((stateFlags & XrVISIBLE) && ((oldState & XrSENSITIVE) != (stateFlags & XrSENSITIVE)))) { (*drawFunct) (instance, drawOption); } return (instance); } \f /*************************************<->************************************* * * _MsgRedraw (instance, redrawMode, drawFunct, drawOption) * * Description: * ----------- * This routine is capable of handling a MSG_REDRAW request for those * field editors which understand only the XrREDRAW_ALL option. After * verifying the parameters, the editor's drawing function will be * invoked, and passed the specified 'drawOption'; this option should * tell the drawing routine to draw the complete editor instance. * * * Inputs: * ------ * instance = This is the editor instance pointer, and indicates which * instance is to be redrawn. * * redrawMode = This is the redraw mode specified with the MSG_REDRAW * request; any redraw mode other than XrREDRAW_ALL will * cause this request to fail. * * drawFunct = This is a pointer to the editor's drawing function. * * drawOption = This value is passed to the editor's drawing function, * and should instruct the drawing routine to draw the * complete editor instance. * * Outputs: * ------- * Upon successful completion, the editor instance pointer will be * returned; if the request fails, then NULL is returned and * xrErrno is set. * * Procedures Called * ----------------- * *************************************<->***********************************/ xrEditor * _MsgRedraw (instance, redrawMode, drawFunct, drawOption) register xrEditor * instance; INT32 redrawMode; INT32 (*drawFunct)(); INT32 drawOption; { /* Redraw the editor, to match new value */ /* Validate the instance pointer & the redraw mode */ if (instance == NULL) { xrErrno = XrINVALIDID; return ((xrEditor *) NULL); } else if (redrawMode != XrREDRAW_ALL) { xrErrno = XrINVALIDOPTION; return ((xrEditor *) NULL); } if (instance->editorState & XrVISIBLE) (*drawFunct) (instance, drawOption); return (instance); } \f /*************************************<->************************************* * * _MsgEdit (instance, event, processFunct, inputCode) * * Description: * ----------- * This routine handles all MSG_EDIT requests for those field editors * which accept only an XrSELECT event. If the event pointed to by * the 'event' parameter is an XrSELECT event, then the editor's * input processing function will be invoked to handle it; in return * the input processing function should fill out whatever fields in * the returnEvent structure is wants to. After the processing routine * has complete, the return event will be pushed onto the front of * the application's input queue. * * * Inputs: * ------ * instance = This is the editor instance pointer. * * event = This is a pointer to an XEvent structure, containing the * event information; this must be a button event. * * processFunct = A pointer to the editor's event processing function. * * inputCode = This contains the editor's unique input code, which * is stored in the 'inputCode' field of the returned * event. * * Outputs: * ------- * If the event is processed by the editor, then the editor instance * pointer is returned, and an event is pushed on the front of the * application's input queue; if the event is not processed, then * NULL is returned. * * Procedures Called * ----------------- * _XrCatchableKey() [editorUtil.c] * XrInput() [input.c] * *************************************<->***********************************/ xrEditor * _MsgEdit (instance, event, processFunct, inputCode) xrEditor * instance; XEvent * event; INT8 (*processFunct)(); INT16 inputCode; { /* * Process the incoming keystroke, and generate a return * keystroke, to indicate to the application program * how the editor instance was modified. */ xrEvent returnEvent; xrEvent exitEvent; XButtonEvent * buttonEvent = (XButtonEvent *)event; if ((XrMapButton (XrSELECT, event) == FALSE) || (!_XrCatchableKey (instance, event))) { /* xrErrno is not set; this is not an error condition */ return ((xrEditor *)NULL); } /* * Fill out the return keystroke. * The editor itself must fill out the value1 field. */ returnEvent.type = XrXRAY; returnEvent.source = buttonEvent->window; returnEvent.inputType = XrEDITOR; returnEvent.inputCode = inputCode; returnEvent.valuePtr = (INT32) instance; XrSetPt (&returnEvent.valuePt, buttonEvent->x, buttonEvent->y); /* Process the keystroke */ (*processFunct) (instance, buttonEvent, &returnEvent); /* Swallow the select up event */ while (XrInput (NULL, MSG_BLKREAD, &exitEvent) == FALSE); if (XrMapButton (XrSELECTUP, &exitEvent) == FALSE) { /* Not a select up event, so push back onto the input queue */ XrInput (NULL, MSG_PUSHEVENT, &exitEvent); } /* Push the xrEvent structure onto the input queue */ XrInput (NULL, MSG_PUSHEVENT, &returnEvent); return (instance); }