|
|
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: S T
Length: 16617 (0x40e9)
Types: TextFile
Names: »SRaster.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/SRaster.c«
/*
* $Source: /u1/Xr/src/Xrlib/Editor/RCS/SRaster.c,v $
* $Header: SRaster.c,v 1.1 86/12/17 09:04:33 swick Exp $
*/
#ifndef lint
static char *rcsid_SRaster_c = "$Header: SRaster.c,v 1.1 86/12/17 09:04:33 swick Exp $";
#endif lint
#include <Xr/xr-copyright.h>
/* $Header: SRaster.c,v 1.1 86/12/17 09:04:33 swick Exp $ */
/* Copyright 1986, Hewlett-Packard Company */
/* Copyright 1986, Massachussetts Institute of Technology */
static char rcsid[] = "$Header: SRaster.c,v 1.1 86/12/17 09:04:33 swick Exp $";
/*************************************<+>*************************************
*****************************************************************************
**
** File: SRaster.c
**
** Project: X-ray Toolbox
**
** Description:
** This file contains the source code for the static raster
** field editor. This editor is capable of displaying an
** uneditable raster image.
**
**
** ------------------------ MODIFICATION RECORD ------------------------
*
* $Log: SRaster.c,v $
* Revision 1.1 86/12/17 09:04:33 swick
* Initial revision
*
* Revision 7.0 86/11/13 08:26:55 08:26:55 fred ()
* Final QA Release
*
* Revision 6.0 86/11/10 15:35:24 15:35:24 fred ()
* QA #2 release
*
* Revision 5.1 86/11/07 14:22:30 14:22:30 fred ()
* Added new copyright message.
*
* Revision 5.0 86/10/28 08:32:36 08:32:36 fred ()
* QA #1.1 release
*
* Revision 4.0 86/10/20 12:13:13 12:13:13 fred ()
* QA #1 release
*
* Revision 3.1 86/10/09 07:53:08 07:53:08 fred ()
* Added default color check to create routine.
*
* Revision 3.0 86/10/02 16:01:00 16:01:00 fred ()
* Alpha release set to 3.0
*
* Revision 2.3 86/09/26 08:15:06 08:15:06 fred ()
* Filled in the procedure headers.
*
* Revision 2.2 86/09/22 13:11:44 13:11:44 fred ()
* Added calls to XrEditorGroup().
*
* Revision 2.1 86/09/19 12:17:45 12:17:45 fred ()
* Modified names of the info and data structures.
*
* Revision 2.0 86/09/16 08:09:38 08:09:38 fred ()
* Updated input processing routine to use new SELECT strategy.
*
* Revision 1.3 86/09/16 05:49:25 05:49:25 fred ()
* Modified to swallow a select up event.
*
* Revision 1.2 86/09/10 11:49:03 11:49:03 fred ()
* Fixed bug in createSRaster(), where an invalid pixmap id
* caused xrErrno to be set to the wrong value.
*
* Revision 1.1 86/09/04 06:43:22 06:43:22 fred ()
* Initial revision
*
*
*
*****************************************************************************
*************************************<+>*************************************/
#include <X/Xlib.h>
#include <Xr/defs.h>
#include <Xr/types.h>
#include <Xr/in_types.h>
extern INT32 createSRaster();
extern INT32 drawSRaster();
extern INT32 processSRaster();
\f
/*************************************<->*************************************
*
* xrEditor *
* XrStaticRaster (staticRaster, message, data)
*
* xrEditor * staticRaster;
* INT32 message;
* INT8 * data;
*
* Description:
* -----------
* This routine is the message handler routine for the static raster
* field editor. It will verify that the 'message' parameter
* specifies an action understood by this editor, and will then
* call the appropriate message handling routine, passing the 'data'
* parameter along.
*
*
* Inputs:
* ------
* staticRaster = For all messages issued to this editor, with the
* exception of MSG_NEW and MSG_SIZE, this parameter
* contains the instance pointer for the instance
* which is to be operated upon.
*
* message = This indicates which operation is to be performed by
* this editor handler.
*
* data = This is interpreted as either a scalar value or a pointer,
* and its form is dependent upon the 'message' parameter.
*
* Outputs:
* -------
* Upon successful completion of handling any message, the instance
* pointer will be returned. In addition, any given message
* may return additionaly information, by means of a structure
* pointed to by the 'data' parameter.
*
* Upon failure, NULL is returned, and xrErrno is set.
*
* Procedures Called
* -----------------
* _MsgNew() [MsgCommon.c]
* _MsgFree() [MsgCommon.c]
* _MsgSetState() [MsgCommon.c]
* _MsgRedraw() [MsgCommon.c]
* _MsgEdit() [MsgCommon.c]
* XrCopyRect() [calc.c]
* _XrMakeInvisible() [editorUtil.c]
* sizeSRaster()
* createSRaster()
* drawSRaster()
*
*************************************<->***********************************/
xrEditor *
XrStaticRaster (staticRaster, message, data)
register xrEditor * staticRaster;
INT32 message;
INT8 * data;
{
/* Determine the action being requested */
switch (message)
{
case MSG_NEW:
{
/* Create a new instance of this editor */
return ((xrEditor *) _MsgNew (staticRaster, data,
sizeof(xrStaticRasterData),
createSRaster, drawSRaster,
NULL, XrStaticRaster, NULL));
}
case MSG_FREE:
{
/* Destroy the specified editor instance */
return ((xrEditor *) _MsgFree (staticRaster, NULL));
}
case MSG_GETSTATE:
{
/*
* Return the current state flag settings for the
* specified static raster editor instance.
*/
return ((xrEditor *) _MsgGetState (staticRaster, data));
}
case MSG_SETSTATE:
{
/*
* Change the state flags associated with the specified
* static raster editor instance.
*/
return ((xrEditor *) _MsgSetState (staticRaster, data,
drawSRaster, NULL));
}
case MSG_SIZE:
{
/*
* Return the size of the rectangle needed to enclose
* an instance of this editor, using the specifications
* passed in by the application program.
*/
xrStaticRasterInfo *srInfoPtr;
srInfoPtr = (xrStaticRasterInfo *)data;
if (srInfoPtr == NULL)
{
xrErrno = XrINVALIDPTR;
return ((xrEditor *)NULL);
}
else if (sizeSRaster (srInfoPtr, &srInfoPtr->editorRect) == FALSE)
{
/* Size request failed; xrErrno set by sizeSRaster() */
return ((xrEditor *)NULL);
}
return ((xrEditor *) TRUE);
}
case MSG_REDRAW:
{
/* Redraw a particular static raster instance */
return ((xrEditor *) _MsgRedraw (staticRaster, data,
drawSRaster, NULL));
}
case MSG_MOVE:
{
/*
* Reposition the origin of the editorRect to the absolute
* position specified by the passed in point.
*/
POINT * ptPtr = (POINT *) data;
RECTANGLE workRect;
if (staticRaster == NULL)
{
xrErrno = XrINVALIDID;
return ((xrEditor *) NULL);
}
else if (data == NULL)
{
xrErrno = XrINVALIDPTR;
return ((xrEditor *) NULL);
}
/* Reset the origin for the editorRect */
XrCopyRect (&staticRaster->editorRect, &workRect);
staticRaster->editorRect.x = ptPtr->x;
staticRaster->editorRect.y = ptPtr->y;
if (staticRaster->editorState & XrVISIBLE)
{
/* Remove the instance from the window */
_XrMakeInvisible (staticRaster->editorWindowId, &workRect, TRUE);
/* Redisplay the instance */
drawSRaster (staticRaster, NULL);
}
/* Force the editor group rectangle to be recalculated */
XrEditorGroup (NULL, MSG_ADJUSTGROUPRECT, staticRaster);
return (staticRaster);
}
case MSG_EDIT:
{
/*
* Process the incoming event, and generate a return event,
* indicating how the editor instance was modified.
*/
return ((xrEditor *) _MsgEdit (staticRaster, data,
processSRaster, XrSTATICRASTER));
}
default:
/* All other commands are invalid */
xrErrno = XrINVALIDMSG;
return ((xrEditor *)NULL);
} /* end of switch */
} /* end of XrStaticRaster() */
\f
/*************************************<->*************************************
*
* INT32
* sizeSRaster (srInfoPtr, rectPtr)
*
* xrStaticRasterInfo * srInfoPtr;
* RECTANGLE * rectPtr;
*
* Description:
* -----------
* Given the dimensions of the static raster image, this routine
* will fill in the RECTANGLE structure pointed to by the 'rectPtr'
* parameter, with the definition of the 0-based rectangle large
* enough to completely contain the raster image.
*
*
* Inputs:
* ------
* srInfoPtr = This points to an instance of the static raster 'info'
* structure; it must contain the height and width of the
* raster image being sized.
*
* rectPtr = This points to a RECTANGLE structure, into which the 0-based
* rectangle definition is returned.
*
* Outputs:
* -------
* Upon successful completion, TRUE is returned, and the 0-based
* rectangle is returned, as described above.
*
* Upon failure, FALSE is returned, and xrErrno is set.
*
* Procedures Called
* -----------------
*
*************************************<->***********************************/
static
INT32
sizeSRaster (srInfoPtr, rectPtr)
register xrStaticRasterInfo * srInfoPtr;
register RECTANGLE * rectPtr;
{
INT16 width = srInfoPtr->rasterWidth;
INT16 height = srInfoPtr->rasterHeight;
/* Validate parameters */
if (width <= 0 || height <= 0)
{
xrErrno = XrINVALIDPARM;
return (FALSE);
}
/* Set the rectangle coordinates */
rectPtr->x = 0;
rectPtr->y = 0;
rectPtr->height = height;
rectPtr->width = width;
return (TRUE);
}
\f
/*************************************<->*************************************
*
* INT32
* createSRaster (srDataPtr, srInfoPtr, message)
*
* xrStaticRasterData * srDataPtr;
* xrStaticRasterInfo * srInfoPtr;
* INT32 message;
*
* Description:
* -----------
* This routine takes the definition of a static raster instance,
* contained in the structure pointed to by 'srInfoPtr', and attempts
* to create a new static raster instance. This involves verifying
* several parameters, and then filling in several fields of the
* structure pointed to by the 'srDataPtr' parameter.
*
*
* Inputs:
* ------
* srDataPtr = This points to the internal 'data' structure which is
* to contain all of the information describing the new
* instance, once it is created.
*
* srInfoPtr = This points to the 'info' structure, containing the
* definition of the new static raster instance.
*
* message = This parameter is unused, but is provided so that _MsgNew()
* can invoke this routine.
*
* Outputs:
* -------
* Upon successful completion, TRUE is returned.
*
* Upon failure, FALSE is returned, and xrErrno is set.
*
* Procedures Called
* -----------------
* sizeSRaster()
*
*************************************<->***********************************/
static
INT32
createSRaster (srDataPtr, srInfoPtr, message)
xrStaticRasterData * srDataPtr;
register xrStaticRasterInfo * srInfoPtr;
INT32 message;
{
register RECTANGLE * editorRect = &(srInfoPtr->editorRect);
RECTANGLE workRect;
/* Make sure the editorRect is large enough to hold the instance */
if (sizeSRaster (srInfoPtr, &workRect) == FALSE)
/* xrErrno is set by sizeSRaster */
return (FALSE);
if ((editorRect->width != workRect.width) ||
(editorRect->height != workRect.height))
{
xrErrno = XrINVALIDRECT;
return (FALSE);
}
else if (srInfoPtr->rasterId == 0)
{
xrErrno = XrINVALIDID;
return (FALSE);
}
/*
* Now that we know all of the parameters are valid, we can start
* filling in the structure pointed to by 'srDataPtr'.
*/
srDataPtr->srRasterId = srInfoPtr->rasterId;
return (TRUE);
}
\f
/*************************************<->*************************************
*
* INT32
* drawSRaster (staticRaster, drawOption)
*
* xrEditor * staticRaster;
* INT32 drawOption;
*
* Description:
* -----------
* This routine will display the static raster image, if the instance
* is visible, or it will fill the area occupied by the instance using
* the window's background tile, if the instance is not visible.
*
*
* Inputs:
* ------
* staticRaster = This points to the instance structure describing the
* instance to be drawn.
*
* drawOption = Not used; this parameter is included so that this
* routine may be called by _MsgRedraw(), _MsgNew(),
* _MsgFree() and _MsgSetState().
*
* Outputs:
* -------
*
* Procedures Called
* -----------------
* _XrMakeInvisible() [editorUtil.c]
* XPixmapPut() [libX.a]
*
*************************************<->***********************************/
static
INT32
drawSRaster (staticRaster, drawOption)
register xrEditor * staticRaster;
INT32 drawOption;
{
xrStaticRasterData * srDataPtr;
Window windowId;
register RECTANGLE * editorRect;
/* Initialize variables we will be using */
srDataPtr = (xrStaticRasterData *) staticRaster->editorData;
windowId = staticRaster->editorWindowId;
editorRect = &staticRaster->editorRect;
/*
* If the instance is not visible, then fill its area with the
* background tile for the port, thus making the instance invisible.
*/
if (!(staticRaster->editorState & XrVISIBLE))
{
_XrMakeInvisible (windowId, editorRect, TRUE);
return;
}
/* Tell the server to display the appropriate pixmap */
XPixmapPut (windowId, 0, 0, editorRect->x, editorRect->y,
editorRect->width, editorRect->height,
srDataPtr->srRasterId, GXcopy, AllPlanes);
}
\f
/*************************************<->*************************************
*
* INT32
* processSRaster (staticRaster, event, returnEvent)
*
* xrEditor * staticRaster;
* XButtonEvent * event;
* xrEvent * returnEvent;
*
* Description:
* -----------
* This routine handles all SELECT events which occur with a visible
* and sensitive static raster instance. By the time this routine is
* called, we already know that the instance is visible and sensitive,
* and we also know that the SELECT occurred within the bounds of the
* instance's editor rectangle. The static raster editor will simply
* set up a return event which indicates that the instance was selected.
*
*
* Inputs:
* ------
* staticRaster = This points to the instance structure describing the
* editor instance which was selected.
*
* event = This points to a copy of the SELECT input event.
*
* returnEvent = This points to an event structure, which, upon
* completion of this call, will be pushed onto the
* front of the application's input queue; it will be
* the means by which the editor tells the application
* that an editor instance was processed.
*
* Outputs:
* -------
* The 'value1' field in the event structure pointed to by the
* 'returnEvent' parameter will be filled in.
*
* Procedures Called
* -----------------
*
*************************************<->***********************************/
static
INT32
processSRaster (staticRaster, event, returnEvent)
xrEditor * staticRaster;
XButtonEvent * event;
xrEvent * returnEvent;
{
returnEvent->value1 = XrSELECT;
}