|
|
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: T i
Length: 39670 (0x9af6)
Types: TextFile
Names: »input.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/Intrinsic/input.c«
/*
* $Source: /u1/Xr/src/Xrlib/Intrinsic/RCS/input.c,v $
* $Header: input.c,v 1.1 86/12/17 09:08:34 swick Exp $
*/
#ifndef lint
static char *rcsid_input_c = "$Header: input.c,v 1.1 86/12/17 09:08:34 swick Exp $";
#endif lint
#include <Xr/xr-copyright.h>
/* $Header: input.c,v 1.1 86/12/17 09:08:34 swick Exp $ */
/* Copyright 1986, Hewlett-Packard Company */
/* Copyright 1986, Massachussetts Institute of Technology */
static char rcsid[] = "$Header: input.c,v 1.1 86/12/17 09:08:34 swick Exp $";
/*************************************<+>*************************************
*****************************************************************************
**
** File: input.c
**
** Project: X-ray Toolbox
**
** Description: Handle all of the input processing for X-ray.
**
**
** ------------------------ MODIFICATION RECORD ------------------------
*
* $Log: input.c,v $
* Revision 1.1 86/12/17 09:08:34 swick
* Initial revision
*
* Revision 7.0 86/11/13 08:20:13 08:20:13 rick ()
* Final QA release
*
* Revision 6.2 86/11/12 07:38:51 07:38:51 rick ()
* Fixed the NULL ptr reference in MSG_SETPROCESSFLAG.
*
* Revision 6.1 86/11/11 12:17:48 12:17:48 rick ()
* Changed the QLength() call to XPending() in MSG_PEEKEVENT.
*
* Revision 6.0 86/11/10 15:22:03 15:22:03 rick ()
* QA #2 release
*
* Revision 5.4 86/11/07 14:01:58 14:01:58 rick ()
* Added the copyright message.
*
* Revision 5.3 86/10/30 13:24:38 13:24:38 rick ()
* Added additional file descriptor verification for ADD and REMOVE INPUT.
*
* Revision 5.2 86/10/30 11:43:58 11:43:58 rick ()
* Changed the ADDINPUT handling of the X file descriptors to only allow
* one X file descriptor in the set of selected upon fds.
*
* Revision 5.0 86/10/28 08:22:46 08:22:46 rick ()
* QA #1.1 release
*
* Revision 4.1 86/10/27 13:33:29 13:33:29 rick ()
* Changed the mapping of Key input in ProcessInput.
*
* Revision 4.0 86/10/20 12:08:49 12:08:49 rick ()
* QA 1 release
*
* Revision 3.7 86/10/20 08:46:49 08:46:49 rick ()
* Removed the #include <sys/param.h> and put the define for MAX_ALARM
* in defs.h as XrMAX_ALARM.
*
* Revision 3.6 86/10/17 12:23:35 12:23:35 rick ()
* Linted
*
* Revision 3.5 86/10/16 11:20:42 11:20:42 rick ()
* Added register variables.
*
* Revision 3.4 86/10/13 13:54:32 13:54:32 rick ()
* Changed the XLookupMapping call to XrMapInput
*
* Revision 3.3 86/10/10 14:51:35 14:51:35 rick ()
* Fixed the button modifier checking in ProcessInput.
*
* Revision 3.2 86/10/10 13:13:17 13:13:17 rick ()
* Added the changes in ProcessInput to handle the button modifiers.
*
* Revision 3.1 86/10/06 09:57:59 09:57:59 rick ()
* Added the automatic editor, group, and function list removal
* from MSG_REMOVEWINDOW.
*
* Revision 3.0 86/10/02 15:58:45 15:58:45 rick ()
* Alpha release set to 3.0
*
* Revision 2.3 86/09/23 09:57:03 09:57:03 rick ()
* Added an initialization of the inputCode field of the windowEvent
* structure in ProcessKey.
*
* Revision 2.2 86/09/22 10:08:59 10:08:59 rick ()
* Added the check for a TRUE processFlag when comparing the window's
* function event list structure.
*
* Revision 2.1 86/09/19 10:42:18 10:42:18 rick ()
* Changed the initialization of the base editor group from
* the entire window to zero rect.
*
* Revision 2.0 86/09/16 08:01:06 08:01:06 rick ()
* Added new input scheme of no conversion of button or ascii input.
* Changed the event list structure for indirect function calling.
*
* Revision 1.5 86/09/11 08:01:13 08:01:13 rick ()
* Added an initialization for the default group in MSG_ADDWINDOW.
*
* Revision 1.4 86/09/05 14:43:15 14:43:15 rick ()
* Finished fixing MSG_REMOVEWINDOWFUNCT.
*
* Revision 1.3 86/09/05 06:43:53 06:43:53 rick ()
* Added a malloc and copy of the applications event list for
* the message to add a window function.
* Fixed the function removal in the message to remove a window funct.
*
* Revision 1.2 86/09/04 09:15:20 09:15:20 rick ()
* Fixed NONBLKHOTREAD handling of input events in _XrProcessInput().
*
* Revision 1.1 86/09/03 13:35:14 13:35:14 rick ()
* Initial revision
*
*
*****************************************************************************
*************************************<+>*************************************/
#ifdef BSD
#include <sys/time.h>
#else
#include <time.h>
#endif
#include <X/Xlib.h>
#include <Xr/defs.h>
#include <Xr/types.h>
#include <Xr/in_types.h>
/*
* Defines used locally for the file descriptor tables.
*/
#define XrTABLESIZE 64
#define XrMASKSIZE 4
/*
* Select input timeout values. ZeroTime is for unblocked reads (polling).
* userTime is for the user selected timeout and is initialize to max time.
* selectTime gets set to one of the above two times and is used by select.
*/
static struct timeval zeroTime = { 0, 0 };
static struct timeval usrTime = { XrMAX_ALARM, 0 };
static struct timeval * selectTime;
/*
* The following three tables contain the file descriptors
* used for reading, writing, and exceptions respectively.
*/
static int readFds [XrTABLESIZE],
writeFds [XrTABLESIZE],
exceptFds [XrTABLESIZE];
/*
* Counts of how many read, write, and except file descriptors.
*/
static int readCount = 0;
static int writeCount = 0;
static int exceptCount = 0;
static int xfdIndex = -1;
/*
* fdCount is the maximum of the file descriptor values defined
* in the Fds tables and is used for the select(2) call.
*/
static int fdCount;
/*
* The mask sets used for the select call and copies of the masks
* used to restore the masks after select.
*/
static unsigned int readMasks[XrMASKSIZE], readSaveMasks[XrMASKSIZE];
static unsigned int writeMasks[XrMASKSIZE], writeSaveMasks[XrMASKSIZE];
static unsigned int exceptMasks[XrMASKSIZE], exceptSaveMasks[XrMASKSIZE];
/*
* Resource info structure used access the registered windows in
* the resource manager.
*/
static xrResourceInfo resourceInfo =
{ XrTYPE_REGWINDOW, 0, 0, XrMEMORY, NULL };
\f
/*************************************<->*************************************
*
* XrInput (windowId, message, data)
* INT32 windowId;
* INT32 message;
* INT8 * data;
*
*
* Description:
* -----------
* The XrInput() routine handles all requests for input by an
* application from a window or windows. Within X-ray, all input
* is routed through a single entry point. This provies for a
* one routine interface to all of the types of input an application
* will need. The input routine also provides the mechanism for
* routines that handle the higher level X-ray functions to route the
* results of their actions through the same input stream. For a
* complete description of the resource manager, refer to XrInput(3Xr)
* and the X-ray toolbox manual.
*
*
* Inputs:
* ------
* windowId = Several of the messages operate upon a particular window.
* This parameter contains the id of that window.
*
* message = Contains the message which describes the capability
* to be executed.
*
* data = Contains a pointer to a structure mecessary for the
* completion of the message.
*
*
* For a complete description of the resource managers messages and
* data parameters, refer to XrInput(3XR) and the X-ray toolbox manual.
*
*
* Outputs:
* -------
* windowId = Returned as the value of the function if a message
* which requires a windowId succeeds.
*
* TRUE = Returned as the value of the function if a message
* which does not require a windowId succeeds.
*
* FALSE = Returned as the value of the function if the message fails.
*
* data = Several of the messages return information in the structure
* pointed at by data.
*
* xrError = The error variable is set to one several values upon
* failure of this routine.
*
* For a complete description of the values returned in data,
* refer to XrInput(3XR) and the X-ray toolbox manual.
*
*
* Procedures Called
* -----------------
* _XrProcessInput()
* _XrAddFd()
* _XrRemoveFd()
* _Xrmemcpy() - utilities.c
* XrResource() - resource.c
* XrCopyRect() - calc.c
* XPending() - Xlib
* XNextEvent() - Xlib
* XPutBackEvent() - Xlib
* XSync() - Xlib
* select()
*
*************************************<->***********************************/
Window
XrInput (windowId, message, data)
Window windowId;
INT32 message;
INT8 * data;
{
/*
* Set up a switch to handle each of the messages.
*/
switch (message)
{
/*
* Register a window with XrInput() by allocating an xrWindow
* structure initializing it, and adding into the resource manager.
*/
case MSG_ADDWINDOW:
{
register xrWindow * window;
register xrWindowData * windowData;
windowData = (xrWindowData *) data;
resourceInfo.resourceId = windowId;
if (data == NULL)
{
xrErrno = XrINVALIDPARM;
return ((Window) FALSE);
}
if (windowId == 0 || XrResource (MSG_FIND, &resourceInfo) == TRUE)
{
xrErrno = XrINVALIDID;
return ((Window) FALSE);
}
/*
* Allocate the xrWindow and default processing
* event structures neccessary for the window.
*/
if ((window = (xrWindow *) (*xrMalloc) (sizeof (xrWindow))) == NULL)
{
xrErrno = XrOUTOFMEM;
return ((Window) FALSE);
}
if ((window -> functList.eventList =
(xrWindowEvent *) (*xrMalloc) (sizeof (xrWindowEvent))) == NULL)
{
(*xrFree)(window);
xrErrno = XrOUTOFMEM;
return ((Window) FALSE);
}
/*
* Set the relevant members of the resource info structure
* and add the window resource into the resource manager.
*/
resourceInfo.resourceObject = (INT8 *) window;
if (XrResource (MSG_ADD, &resourceInfo) == FALSE)
{
(*xrFree)(*(window -> functList.eventList));
(*xrFree)(window);
return ((Window) FALSE);
}
/*
* Initialize the members of the windowData structure.
*/
XrCopyRect (&windowData -> windowRect, &window -> windowRect);
window -> foreTile = windowData -> foreTile;
window -> backTile = windowData -> backTile;
window -> activeGroup = &(window -> groupList);
/*
* Initialize the members of the group list structure.
*/
window -> groupList.groupWindowId = windowId;
XrCopyRect (&xrZeroRect, &(window -> groupList.groupRect));
window -> groupList.groupState = XrVISIBLE | XrSENSITIVE;
window -> groupList.editorList = NULL;
window -> groupList.graphicList = NULL;
window -> groupList.nextGroup = NULL;
/*
* Initialize the members of the function list structure.
*/
window -> functList.processFlag = TRUE;
window -> functList.funct = (xrPFI) XrEditor;
window -> functList.instance = windowId;
window -> functList.message = MSG_PROCESSKEY;
window -> functList.eventCount = 1;
window -> functList.nextFunct = NULL;
/*
* Initialize the members of the function list event list structure.
*/
XrGetWindowEvent (XrSELECT, window -> functList.eventList);
return (windowId);
}
break;
/*
* Remove (de-register) a window by removing it from the
* resource manager.
*/
case MSG_REMOVEWINDOW:
{
register xrWindow * window;
register xrWindowFunct * functPtr;
register xrWindowFunct * nextFunctPtr;
resourceInfo.resourceId = windowId;
if (XrResource (MSG_FIND, &resourceInfo) == FALSE)
{
xrErrno = XrINVALIDID;
return ((Window) FALSE);
}
window = (xrWindow *) resourceInfo.resourceObject;
functPtr = window -> functList.nextFunct;
/*
* Free the default event list and all of the funct
* structures.
*/
(*xrFree) (window -> functList.eventList);
while (functPtr != NULL)
{
nextFunctPtr = functPtr -> nextFunct;
(*xrFree) (functPtr -> eventList);
(*xrFree) (functPtr);
functPtr = nextFunctPtr;
}
window -> functList.eventList = NULL;
window -> functList.nextFunct = NULL;
/*
* Free all of the editors and editor groups.
*/
while (window -> groupList.nextGroup != NULL)
XrEditorGroup (window -> groupList.nextGroup, MSG_FREE, NULL);
XrEditorGroup (&(window -> groupList), MSG_FREE, NULL);
/*
* Remove the window from the resource manager and free
* the window structure.
*/
if (XrResource (MSG_REMOVE, &resourceInfo) == FALSE)
{
xrErrno = XrINVALIDID;
return ((Window) FALSE);
}
(*xrFree)(window);
return (windowId);
}
break;
/*
* Set some of the window specific data, i.e. the windowRect,
* foreTile, and backTile.
*/
case MSG_SETWINDOWDATA:
{
register xrWindowData * windowData;
register xrWindow * window;
if ((windowData = (xrWindowData *) data) == NULL)
{
xrErrno = XrINVALIDPARM;
return ((Window) FALSE);
}
resourceInfo.resourceId = windowId;
if (XrResource (MSG_FIND, &resourceInfo) == FALSE)
{
xrErrno = XrINVALIDID;
return ((Window) FALSE);
}
window = (xrWindow *) resourceInfo.resourceObject;
XrCopyRect (&windowData -> windowRect, &window -> windowRect);
window -> foreTile = windowData -> foreTile;
window -> backTile = windowData -> backTile;
return (windowId);
}
break;
/*
* Get some of the window specific data, i.e. the windowRect,
* foreTile, and backTile.
*/
case MSG_GETWINDOWDATA:
{
register xrWindowData * windowData;
register xrWindow * window;
if ((windowData = (xrWindowData *) data) == NULL)
{
xrErrno = XrINVALIDPARM;
return ((Window) FALSE);
}
resourceInfo.resourceId = windowId;
if (XrResource (MSG_FIND, &resourceInfo) == FALSE)
{
xrErrno = XrINVALIDID;
return ((Window) FALSE);
}
window = (xrWindow *) resourceInfo.resourceObject;
XrCopyRect (&window -> windowRect, &windowData -> windowRect);
windowData -> foreTile = window -> foreTile;
windowData -> backTile = window -> backTile;
return (windowId);
}
break;
/*
* Add an xrWindowFunct structure into the window specified.
* This will add another indirect window function.
*/
case MSG_ADDWINDOWFUNCT:
{
register xrWindowFunct * windowFunct;
register xrWindowFunct * newWindowFunct;
register xrWindowFunct * functPtr;
if ((windowFunct = (xrWindowFunct *) data) == NULL)
{
xrErrno = XrINVALIDPARM;
return ((Window) FALSE);
}
/*
* Find the resource which contain's the window's information.
*/
resourceInfo.resourceId = windowId;
if (XrResource (MSG_FIND, &resourceInfo) == FALSE)
{
xrErrno = XrINVALIDID;
return ((Window) FALSE);
}
/*
* Allocate an xrWindowFunct structure to hold the new
* function to be attached to the window and an xrEvent
* array to hold the event list.
*/
if ((newWindowFunct =
(xrWindowFunct *) (*xrMalloc) (sizeof (xrWindowFunct))) == NULL)
{
xrErrno = XrOUTOFMEM;
return ((Window) FALSE);
}
if ((newWindowFunct -> eventList = (xrWindowEvent *) (*xrMalloc)
(windowFunct -> eventCount * sizeof (xrWindowEvent))) == NULL)
{
(*xrFree)(newWindowFunct);
xrErrno = XrOUTOFMEM;
return ((Window) FALSE);
}
/*
* Go out to the end of the window's function list and
* attach the malloc'ed xrWindowFunct structure.
*/
functPtr = &(((xrWindow *)(resourceInfo.resourceObject))->functList);
while (functPtr -> nextFunct != NULL)
functPtr = functPtr -> nextFunct;
functPtr -> nextFunct = newWindowFunct;
/*
* Set the members of the malloc'ed xrWindowFunct structure
* to the values in the data parameter.
*/
_Xrmemcpy (newWindowFunct -> eventList, windowFunct -> eventList,
windowFunct -> eventCount * sizeof (xrWindowEvent));
newWindowFunct -> funct = windowFunct -> funct;
newWindowFunct -> instance = windowFunct -> instance;
newWindowFunct -> message = windowFunct -> message;
newWindowFunct -> processFlag = windowFunct -> processFlag;
newWindowFunct -> eventCount = windowFunct -> eventCount;
newWindowFunct -> nextFunct = NULL;
return (windowId);
}
break;
/*
* Remove an xrWindowFunct structure into the window specified.
* This will remove an indirect window function.
*/
case MSG_REMOVEWINDOWFUNCT:
{
register xrWindowFunct * functPtr;
register xrWindowFunct * removeFunctPtr;
register xrPFI funct;
xrWindow * window;
if ((funct = (xrPFI) data) == NULL)
{
xrErrno = XrINVALIDPARM;
return ((Window) FALSE);
}
/*
* Find the resource which contain's the window's information.
*/
resourceInfo.resourceId = windowId;
if (XrResource (MSG_FIND, &resourceInfo) == FALSE)
{
xrErrno = XrINVALIDID;
return ((Window) FALSE);
}
/*
* Go find the function structure which contains the
* function to be removed, and remove it and free it.
*/
window = (xrWindow *)(resourceInfo.resourceObject);
functPtr = window -> functList.nextFunct;
if (functPtr == NULL)
{
xrErrno = XrINVALIDPARM;
return ((Window) FALSE);
}
removeFunctPtr = NULL;
if (functPtr -> funct == funct)
{
removeFunctPtr = window -> functList.nextFunct;
window -> functList.nextFunct = removeFunctPtr -> nextFunct;
}
else
{
while (functPtr -> nextFunct != NULL)
{
if (functPtr -> nextFunct -> funct == funct)
{
removeFunctPtr = functPtr -> nextFunct;
functPtr -> nextFunct = functPtr -> nextFunct -> nextFunct;
break;
}
functPtr = functPtr -> nextFunct;
}
}
if (removeFunctPtr == NULL)
{
xrErrno = XrINVALIDPARM;
return ((Window) FALSE);
}
(*xrFree)(removeFunctPtr -> eventList);
(*xrFree)(removeFunctPtr);
return (windowId);
}
break;
/*
* Turn on or off a window's indirect processing functions by
* finding the window in the resource manager and then setting
* or clearing the processFlag according to the message.
*/
case MSG_SETPROCESSFLAG:
case MSG_CLEARPROCESSFLAG:
{
register xrPFI funct;
register xrWindowFunct * functPtr;
if ((funct = (xrPFI) data) == NULL)
{
xrErrno = XrINVALIDPARM;
return ((Window) FALSE);
}
/*
* Find the resource which contain's the window's information.
*/
resourceInfo.resourceId = windowId;
if (XrResource (MSG_FIND, &resourceInfo) == FALSE)
{
xrErrno = XrINVALIDID;
return ((Window) FALSE);
}
/*
* Find the function which matches the input data parameter
* and then set or clear its processflag as appropriate.
*/
functPtr = &(((xrWindow *)(resourceInfo.resourceObject))->functList);
while (functPtr -> funct != funct)
{
functPtr = functPtr -> nextFunct;
if (functPtr == NULL)
{
xrErrno = XrINVALIDPARM;
return ((Window) FALSE);
}
}
if (message == MSG_SETPROCESSFLAG)
functPtr -> processFlag = TRUE;
else
functPtr -> processFlag = FALSE;
return (windowId);
}
break;
/*
* The following set of messages handle the return of input
* to the application.
*/
case MSG_BLKREAD:
case MSG_NONBLKREAD:
case MSG_BLKHOTREAD:
case MSG_NONBLKHOTREAD:
{
register XEvent * xInput;
register xrEvent * xrInput;
register INT32 inputCount;
register INT32 i;
if ((xInput = (XEvent *) data) == NULL)
{
xrErrno = XrINVALIDPARM;
return ((Window) FALSE);
}
xrInput = (xrEvent *) data;
/*
* See if the X input queue has input pending. If
* it does, process the input and return it to the
* application.
*/
if (XPending ())
{
XNextEvent (xInput);
if (message == MSG_BLKREAD || message == MSG_NONBLKREAD)
return ((Window) TRUE);
else
return (_XrProcessInput (xInput));
}
/*
* Set up the masks and timeout for a select and execute
* the select to wait for blocked input.
*/
for (i = 0; i < XrMASKSIZE; i++)
{
readMasks [i] = readSaveMasks [i];
writeMasks [i] = writeSaveMasks [i];
exceptMasks [i] = exceptSaveMasks [i];
}
if (message == MSG_BLKREAD || message == MSG_BLKHOTREAD)
selectTime = &usrTime;
else
selectTime = &zeroTime;
if ((inputCount = select (fdCount, readMasks, writeMasks,
exceptMasks, selectTime)) <= 0)
return ((Window) FALSE);
/*
* Check for exception input.
*/
for (i = exceptCount - 1; i >= 0 && inputCount > 0; i--)
{
if (exceptMasks[(exceptFds[i] >> 5)] & (1 << (exceptFds[i] & 31)))
{
inputCount--;
xrInput -> type = XrXRAY;
xrInput -> source = (INT32) exceptFds[i];
xrInput -> inputType = XrFILE;
xrInput -> inputCode = XrEXCEPTION;
XPutBackEvent ((XEvent *) xrInput);
}
}
/*
* Check for write input pending.
*/
for (i = writeCount - 1; i >= 0 && inputCount > 0; i--)
{
if (writeMasks[(writeFds[i] >> 5)] & (1 << (writeFds[i] & 31)))
{
inputCount--;
xrInput -> type = XrXRAY;
xrInput -> source = (INT32) writeFds[i];
xrInput -> inputType = XrFILE;
xrInput -> inputCode = XrWRITE;
XPutBackEvent ((XEvent *) xrInput);
}
}
/*
* Check for read input pending.
*/
for (i = readCount - 1; i >= 0 && inputCount > 0; i--)
{
if (readMasks [(readFds[i] >> 5)] & (1 << (readFds[i] & 31)))
{
if (i == xfdIndex) /* input from an X server? */
{
inputCount--;
XNextEvent (xInput);
if (message == MSG_BLKHOTREAD ||
message == MSG_NONBLKHOTREAD)
_XrProcessInput (xInput);
XPutBackEvent ((XEvent *) xInput);
}
else
{
inputCount--;
xrInput -> type = XrXRAY;
xrInput -> source = (INT32) readFds[i];
xrInput -> inputType = XrFILE;
xrInput -> inputCode = XrREAD;
XPutBackEvent ((XEvent *) xrInput);
}
}
}
XNextEvent (xInput);
return ((Window) TRUE);
}
break;
/*
* The following set of messages allow the input queue to
* be played with.
*/
case MSG_PUSHEVENT:
if (data == NULL)
{
xrErrno = XrINVALIDPARM;
return ((Window) FALSE);
}
XPutBackEvent ((XEvent *) data);
return ((Window) TRUE);
break;
case MSG_PEEKEVENT:
if (data == NULL)
{
xrErrno = XrINVALIDPARM;
return ((Window) FALSE);
}
if (XPending())
{
XPeekEvent ((XEvent *) data);
return ((Window) TRUE);
}
return ((Window) FALSE);
break;
case MSG_CLEAR:
XSync (TRUE);
return ((Window) TRUE);
break;
/*
* The following set of messages set and change input sources.
*/
case MSG_ADDINPUT:
{
register xrFDInput * inputSource;
register INT32 i;
if (data == NULL)
{
xrErrno = XrINVALIDPARM;
return ((Window) FALSE);
}
inputSource = (xrFDInput *) data;
if (inputSource -> fd < 0 ||
!(inputSource -> type & (XrREAD | XrWRITE | XrEXCEPTION)))
{
xrErrno = XrINVALIDPARM;
return ((Window) FALSE);
}
if (inputSource -> fd == dpyno())
{
if (xfdIndex != -1)
_XrRemoveFd (XrREAD, readFds[xfdIndex]);
if (_XrAddFd (XrREAD, inputSource -> fd) == FALSE)
{
xrErrno = XrINVALIDID;
return ((Window) FALSE);
}
xfdIndex = readCount - 1;
}
else
if (_XrAddFd (inputSource -> type, inputSource -> fd) == FALSE)
{
xrErrno = XrINVALIDID;
return ((Window) FALSE);
}
return ((Window) TRUE);
}
break;
case MSG_REMOVEINPUT:
{
register xrFDInput * inputSource;
if (data == NULL)
{
xrErrno = XrINVALIDPARM;
return ((Window) FALSE);
}
inputSource = (xrFDInput *) data;
if (inputSource -> fd < 0 ||
!(inputSource -> type & (XrREAD | XrWRITE | XrEXCEPTION)))
{
xrErrno = XrINVALIDPARM;
return ((Window) FALSE);
}
_XrRemoveFd (((xrFDInput *) data) -> type,
((xrFDInput *) data) -> fd);
return ((Window) TRUE);
}
break;
case MSG_SETTIMEOUT:
if (data == NULL)
{
xrErrno = XrINVALIDPARM;
return ((Window) FALSE);
}
usrTime.tv_sec = ((struct timeval *) data) -> tv_sec;
usrTime.tv_usec = ((struct timeval *) data) -> tv_usec;
return ((Window) TRUE);
break;
case MSG_GETTIMEOUT:
{
struct timeval * time;
if (data == NULL)
{
xrErrno = XrINVALIDPARM;
return ((Window) FALSE);
}
time = (struct timeval *) data;
time -> tv_sec = usrTime.tv_sec;
time -> tv_usec = usrTime.tv_usec;
return ((Window) TRUE);
}
break;
default:
xrErrno = XrINVALIDMSG;
return ((Window) FALSE);
break;
}
return ((Window) FALSE);
}
\f
/*************************************<->*************************************
*
* _XrProcessInput (event)
* XEvent * event;
*
*
* Description:
* -----------
* _XrProcessInput() is called when there is X input pending and
* the read type was hot read. It processes the input by comparing
* it to the set of functions attached to the window and calling
* the function is a match is found.
*
*
* Inputs:
* ------
* event = The XEvent to be processed.
*
*
* Outputs:
* -------
* event = The XEvent that was read and processed is returned
* through the event parameter.
*
*
* Procedures Called
* -----------------
* XNextEvent - Xlib
* XrInputMap -
* XrResource - resource.c
*
*************************************<->***********************************/
_XrProcessInput (event)
XKeyOrButtonEvent * event;
{
register xrWindowFunct * listPtr;
register xrWindowEvent * eventPtr;
register INT32 i;
INT8 * inputString;
INT32 stringLen;
xrWindowEvent windowEvent;
resourceInfo.resourceId = event -> window;
if (XrResource (MSG_FIND, &resourceInfo) == FALSE)
return (TRUE);
windowEvent.inputType = event -> type;
windowEvent.inputCode = 0;
if (event -> type & (KeyPressed | KeyReleased))
{
inputString = XrInputMap (event, &stringLen);
if (stringLen > 2)
return (TRUE);
if (stringLen == 1)
windowEvent.inputCode = *inputString;
else
strncpy (&windowEvent.inputCode, inputString, stringLen);
}
else if (event -> type & (ButtonPressed | ButtonReleased))
windowEvent.inputCode =
event->detail & (ControlMask | MetaMask | ShiftMask | 0x00FF);
/*
* Process the input if it meets the following conditions. Compare
* the set of events within be function list attached to the window
* to the input. When a match is found, invoke the function which
* corresponds to the event.
*/
listPtr = &(((xrWindow *)(resourceInfo.resourceObject)) -> functList);
while (listPtr != NULL)
{
if (listPtr -> processFlag)
{
for (i = 0; i < listPtr -> eventCount; i++)
{
eventPtr = listPtr -> eventList + i;
if (windowEvent.inputType & eventPtr -> inputType)
{
if (windowEvent.inputType & (ButtonPressed | ButtonReleased))
{
if ((windowEvent.inputCode & 0x00FF) ==
(eventPtr -> inputCode & 0x00FF))
{
if ((((windowEvent.inputCode & 0xFF00) == 0) &&
((eventPtr -> inputCode & 0xFF00) == 0)) ||
((windowEvent.inputCode & 0xFF00) &
(eventPtr -> inputCode & 0xFF00)))
{
if (((*listPtr -> funct)
(listPtr->instance,listPtr->message,event))!=FALSE)
{
XNextEvent ((XEvent *) event);
return (TRUE);
}
}
}
}
else if (windowEvent.inputCode == eventPtr -> inputCode)
{
if (((*listPtr -> funct)
(listPtr -> instance, listPtr -> message, event)) != FALSE)
{
XNextEvent ((XEvent *) event);
return (TRUE);
}
}
}
}
}
listPtr = listPtr -> nextFunct;
}
return (TRUE);
}
\f
/*************************************<->*************************************
*
* _XrAddFd (type, fd)
* INT32 type;
* int fd;
*
*
* Description:
* -----------
* Add a file descriptor to the list of file descriptors to
* be selected upon.
*
*
* Inputs:
* ------
* type = Is set to a combination of XrREAD, XrWRITE, or XrEXCEPTION
* defines and denotes which fd tables and masks the fd
* is to be added to.
* fd = The file descriptor to be added.
*
*
* Outputs:
* -------
* TRUE = Returned if all of the adds succeed.
*
* FALSE = Returned if any of the adds fail.
*
*
* Procedures Called
* -----------------
* _XrAddFds()
*
*************************************<->***********************************/
static
_XrAddFd (type, fd)
INT32 type;
int fd;
{
if (type & XrREAD)
if (_XrAddFds (fd, &readCount, readSaveMasks, readFds) == FALSE)
return (FALSE);
if (type & XrWRITE)
if (_XrAddFds (fd, &writeCount, writeSaveMasks, writeFds) == FALSE)
return (FALSE);
if (type & XrEXCEPTION)
if (_XrAddFds (fd, &exceptCount, exceptSaveMasks, exceptFds) == FALSE)
return (FALSE);
return (TRUE);
}
\f
/*************************************<->*************************************
*
* _XrRemoveFd (type, fd)
* INT32 type;
* int fd;
*
*
* Description:
* -----------
* Remove a file descriptor from the list of file descriptors to
* be selected upon.
*
*
* Inputs:
* ------
* type = Is set to a combination of XrREAD, XrWRITE, or XrEXCEPTION
* defines and denotes which fd tables and masks the fd
* is to be removed from.
* fd = The file descriptor to be removed.
*
*
* Outputs:
* -------
* TRUE = Returned if all of the removes succeed.
*
* FALSE = Returned if any of the removes fail.
*
*
* Procedures Called
* -----------------
* _XrRemoveFds()
*
*************************************<->***********************************/
static
_XrRemoveFd (type, fd)
INT32 type;
int fd;
{
if (type & XrREAD)
if (_XrRemoveFds (fd, &readCount, readSaveMasks, readFds) == FALSE)
return (FALSE);
if (type & XrWRITE)
if (_XrRemoveFds (fd, &writeCount, writeSaveMasks, writeFds) == FALSE)
return (FALSE);
if (type & XrEXCEPTION)
if (_XrRemoveFds (fd,&exceptCount, exceptSaveMasks, exceptFds) == FALSE)
return (FALSE);
return (TRUE);
}
\f
/*************************************<->*************************************
*
* _XrAddFds (fd, count, masks, fds)
* INT32 fd;
* INT32 * count;
* INT32 masks[];
* INT32 fds[];
*
*
* Description:
* -----------
* _XrAddFds adds a file descriptor to the table which contains
* file descriptors of its type, it also sets the appropriate
* select mask to show that the file descriptor has been removed,
* and adjusts the global fdCount if needed.
*
*
* Inputs:
* ------
* fd = The file descriptor to be added.
* count = A pointer to an integer which contains the number
* of file descriptors of that type, i.e. read, write,
* or exception.
* masks = The integer array which contains the select mask for
* the file descriptor to be added.
* fds = The array which contains the file descriptor to be
* added.
*
*
* Outputs:
* -------
* TRUE = Is returned if the fd is successfully added.
*
* FALSE = Is returned if the fd cannot be added.
*
* fdCount = The static internal fdCount will be adjusted to
* the input fd if fd is larger than fdCount.
*
*
* Procedures Called
* -----------------
* None.
*
*************************************<->***********************************/
static
_XrAddFds (fd, count, masks, fds)
INT32 fd;
INT32 * count;
INT32 masks[];
INT32 fds[];
{
int i;
for (i = 0; i < *count; i++)
if (fd == fds[i])
return (FALSE);
fds[*count] = fd;
*count = *count + 1;
masks[fd >> 5] |= (1 << (fd & 31));
if (fdCount <= fd)
fdCount = fd + 1;
return (TRUE);
}
\f
/*************************************<->*************************************
*
* _XrRemoveFds (fd, count, masks, fds)
* INT32 fd;
* INT32 * count;
* INT32 masks[];
* INT32 fds[];
*
*
* Description:
* -----------
* _XrRemoveFds removes a file descriptor from the table which
* contains it, sets the appropriate select mask to show that
* the file descriptor has been removed, and calls a routine
* to adjust the global fdCount if needed.
*
*
* Inputs:
* ------
* fd = The file descriptor to be removed.
* count = A pointer to an integer which contains the number
* of file descriptors of that type, i.e. read, write,
* or exception.
* masks = The integer array which contains the select mask for
* the file descriptor to be removed.
* fds = The array which contains the file descriptor to be
* removed.
*
*
* Outputs:
* -------
* TRUE = Is returned if the fd is successfully removed.
*
* FALSE = Is returned if the fd cannot be removed.
*
*
* Procedures Called
* -----------------
* _XrSetFdCount()
*
*************************************<->***********************************/
static
_XrRemoveFds (fd, count, masks, fds)
INT32 fd;
INT32 * count;
INT32 masks[];
INT32 fds[];
{
int i;
for (i = 0; i < *count; i++)
if (fds[i] == fd)
{
fds[i] = 0;
break;
}
if (i == *count)
return (FALSE);
for (; i < *count - 1; i++)
fds[i] = fds[i+1];
*count = *count - 1;
masks[fd >> 5] &= ~(1 << (fd & 31));
if (fd == fdCount)
_XrSetFdCount ();
return (TRUE);
}
\f
/*************************************<->*************************************
*
* _XrSetFdCount()
*
*
* Description:
* -----------
* Set the global fdCount to the maximum valued file descriptor.
*
*
* Inputs:
* ------
* None
*
*
* Outputs:
* -------
* fdCount = This internal static is set to the maximum
* valued file descriptor contained in the three
* file descriptor tables.
*
*
* Procedures Called
* -----------------
* None
*
*************************************<->***********************************/
static
_XrSetFdCount ()
{
register int i;
fdCount = 0;
for (i = 0; i < readCount; i++)
if (fdCount <= readFds[i])
fdCount = readFds[i] + 1;
for (i = 0; i < writeCount; i++)
if (fdCount <= writeFds[i])
fdCount = writeFds[i] + 1;
for (i = 0; i < exceptCount; i++)
if (fdCount <= exceptFds[i])
fdCount = exceptFds[i] + 1;
}