summaryrefslogtreecommitdiff
path: root/xc/lib/PEX5/pl_pick.c
diff options
context:
space:
mode:
Diffstat (limited to 'xc/lib/PEX5/pl_pick.c')
-rw-r--r--xc/lib/PEX5/pl_pick.c1213
1 files changed, 0 insertions, 1213 deletions
diff --git a/xc/lib/PEX5/pl_pick.c b/xc/lib/PEX5/pl_pick.c
deleted file mode 100644
index b827a49d5..000000000
--- a/xc/lib/PEX5/pl_pick.c
+++ /dev/null
@@ -1,1213 +0,0 @@
-/* $TOG: pl_pick.c /main/14 1998/02/06 16:11:48 kaleb $ */
-/*
-
-Copyright 1992, 1998 The Open Group
-
-All Rights Reserved.
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall
-not be used in advertising or otherwise to promote the sale, use or
-other dealings in this Software without prior written authorization
-from The Open Group.
-
-*/
-
-/******************************************************************************
-Copyright 1987,1991 by Digital Equipment Corporation, Maynard, Massachusetts
-Copyright 1992 by ShoGraphics, Inc., Mountain View, California
-
- All Rights Reserved
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting documentation, and that
-the name of Digital or ShowGraphics not be used in advertising or
-publicity pertaining to distribution of the software without specific, written
-prior permission. Digital and ShowGraphics make no representations
-about the suitability of this software for any purpose. It is provided "as is"
-without express or implied warranty.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-SHOGRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-SHOGRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-*************************************************************************/
-
-/*
- * NEED EVENTS needs to be defined when including Xproto.h so xEvent
- * can be sucked in.
- */
-
-#define NEED_EVENTS
-
-#include "PEXlib.h"
-#include "PEXlibint.h"
-
-#define GetPickRecordSize(_pickType) \
- (_pickType == PEXPickDeviceNPCHitVolume ? SIZEOF (pexPD_NPC_HitVolume) : \
- (_pickType == PEXPickDeviceDCHitBox ? SIZEOF (pexPD_DC_HitBox) : 0))
-
-
-
-PEXPickMeasure
-PEXCreatePickMeasure (display, wks, devType)
-
-INPUT Display *display;
-INPUT PEXWorkstation wks;
-INPUT int devType;
-
-{
- register pexCreatePickMeasureReq *req;
- char *pBuf;
- PEXPickMeasure pm;
-
-
- /*
- * Get a Pick Measure resource id from X.
- */
-
- pm = XAllocID (display);
-
-
- /*
- * Lock around the critical section, for multithreading.
- */
-
- LockDisplay (display);
-
-
- /*
- * Put the request in the X request buffer.
- */
-
- PEXGetReq (CreatePickMeasure, pBuf);
-
- BEGIN_REQUEST_HEADER (CreatePickMeasure, pBuf, req);
-
- PEXStoreReqHead (CreatePickMeasure, req);
- req->wks = wks;
- req->pm = pm;
- req->devType = devType;
-
- END_REQUEST_HEADER (CreatePickMeasure, pBuf, req);
-
-
- /*
- * Done, so unlock and check for synchronous-ness.
- */
-
- UnlockDisplay (display);
- PEXSyncHandle (display);
-
- return (pm);
-}
-
-
-void
-PEXFreePickMeasure (display, pm)
-
-INPUT Display *display;
-INPUT PEXPickMeasure pm;
-
-{
- register pexFreePickMeasureReq *req;
- char *pBuf;
-
-
- /*
- * Lock around the critical section, for multithreading.
- */
-
- LockDisplay (display);
-
-
- /*
- * Put the request in the X request buffer.
- */
-
- PEXGetReq (FreePickMeasure, pBuf);
-
- BEGIN_REQUEST_HEADER (FreePickMeasure, pBuf, req);
-
- PEXStoreReqHead (FreePickMeasure, req);
- req->id = pm;
-
- END_REQUEST_HEADER (FreePickMeasure, pBuf, req);
-
-
- /*
- * Done, so unlock and check for synchronous-ness.
- */
-
- UnlockDisplay (display);
- PEXSyncHandle (display);
-}
-
-
-PEXPMAttributes *
-PEXGetPickMeasure (display, pm, valueMask)
-
-INPUT Display *display;
-INPUT PEXPickMeasure pm;
-INPUT unsigned long valueMask;
-
-{
- register pexGetPickMeasureReq *req;
- char *pBuf, *pBufSave;
- pexGetPickMeasureReply rep;
- PEXPMAttributes *ppmi;
- unsigned long f;
- int i;
- unsigned count;
-
-
- /*
- * Lock around the critical section, for multithreading.
- */
-
- LockDisplay (display);
-
-
- /*
- * Put the request in the X request buffer and get a reply.
- */
-
- PEXGetReq (GetPickMeasure, pBuf);
-
- BEGIN_REQUEST_HEADER (GetPickMeasure, pBuf, req);
-
- PEXStoreReqHead (GetPickMeasure, req);
- req->pm = pm;
- req->itemMask = valueMask;
-
- END_REQUEST_HEADER (GetPickMeasure, pBuf, req);
-
- if (_XReply (display, (xReply *)&rep, 0, xFalse) == 0)
- {
- UnlockDisplay (display);
- PEXSyncHandle (display);
- return (NULL); /* return an error */
- }
-
-
- /*
- * Read the reply data into a scratch buffer.
- */
-
- XREAD_INTO_SCRATCH (display, pBufSave, rep.length << 2);
- pBuf = pBufSave;
-
- /*
- * Allocate a buffer for the replies to pass back to the client.
- */
-
- ppmi = (PEXPMAttributes *) Xmalloc (sizeof (PEXPMAttributes));
-
- ppmi->pick_path.count = 0;
- ppmi->pick_path.elements = NULL;
-
- for (i = 0; i < (PEXPMMaxShift + 1); i++)
- {
- f = (1L << i);
- if (valueMask & f)
- {
- switch (f)
- {
- case PEXPMStatus:
-
- EXTRACT_LOV_CARD16 (pBuf, ppmi->status);
- break;
-
- case PEXPMPath:
-
- EXTRACT_CARD32 (pBuf, count);
- ppmi->pick_path.count = count;
-
- ppmi->pick_path.elements = (PEXPickElementRef *)
- Xmalloc (count * sizeof (PEXPickElementRef));
-
- EXTRACT_LISTOF_PICKELEMREF (count,
- pBuf, ppmi->pick_path.elements);
- break;
- }
- }
- }
-
- FINISH_WITH_SCRATCH (display, pBufSave, rep.length << 2);
-
- /*
- * Done, so unlock and check for synchronous-ness.
- */
-
- UnlockDisplay (display);
- PEXSyncHandle (display);
-
- return (ppmi);
-}
-
-
-void
-PEXUpdatePickMeasure (display, pick_measure, pick_device_type, pick_record)
-
-INPUT Display *display;
-INPUT PEXPickMeasure pick_measure;
-INPUT int pick_device_type;
-INPUT PEXPickRecord *pick_record;
-
-{
- register pexUpdatePickMeasureReq *req;
- char *pBuf;
- int numBytes;
- int fpConvert;
- int fpFormat;
-
-
- /*
- * Lock around the critical section, for multithreading.
- */
-
- LockDisplay (display);
-
-
- /*
- * Put the request in the X request buffer.
- */
-
- numBytes = GetPickRecordSize (pick_device_type);
-
- PEXGetReqExtra (UpdatePickMeasure, numBytes, pBuf);
-
- BEGIN_REQUEST_HEADER (UpdatePickMeasure, pBuf, req);
- CHECK_FP (fpConvert, fpFormat);
-
- PEXStoreReqHead (UpdatePickMeasure, req);
- req->pm = pick_measure;
- req->numBytes = numBytes;
-
- END_REQUEST_HEADER (UpdatePickMeasure, pBuf, req);
-
- STORE_PICK_RECORD (pick_device_type, numBytes, pick_record, pBuf,
- fpConvert, fpFormat);
-
-
- /*
- * Done, so unlock and check for synchronous-ness.
- */
-
- UnlockDisplay (display);
- PEXSyncHandle (display);
-}
-
-
-PEXPDAttributes *
-PEXGetPickDevice (display, wks, devType, valueMask)
-
-INPUT Display *display;
-INPUT PEXWorkstation wks;
-INPUT int devType;
-INPUT unsigned long valueMask;
-
-{
- register pexGetPickDeviceReq *req;
- char *pBuf, *pBufSave;
- pexGetPickDeviceReply rep;
- PEXPDAttributes *ppdi;
- unsigned long f;
- int i;
- unsigned count;
- int size;
- int fpConvert;
- int fpFormat;
-
-
- /*
- * Lock around the critical section, for multithreading.
- */
-
- LockDisplay (display);
-
-
- /*
- * Put the request in the X request buffer and get a reply.
- */
-
- PEXGetReq (GetPickDevice, pBuf);
-
- BEGIN_REQUEST_HEADER (GetPickDevice, pBuf, req);
- CHECK_FP (fpConvert, fpFormat);
-
- PEXStoreFPReqHead (GetPickDevice, fpFormat, req);
- req->wks = wks;
- req->itemMask = valueMask;
- req->devType = devType;
-
- END_REQUEST_HEADER (GetPickDevice, pBuf, req);
-
- if (_XReply (display, (xReply *)&rep, 0, xFalse) == 0)
- {
- UnlockDisplay (display);
- PEXSyncHandle (display);
- return (NULL); /* return an error */
- }
-
-
- /*
- * Read the reply data into a scratch buffer.
- */
-
- XREAD_INTO_SCRATCH (display, pBufSave, rep.length << 2);
- pBuf = pBufSave;
-
- /*
- * Allocate a buffer for the replies to pass back to the client.
- */
-
- ppdi = (PEXPDAttributes *) Xmalloc (sizeof (PEXPDAttributes));
-
- ppdi->path.count = 0;
- ppdi->path.elements = NULL;
-
- for (i = 0; i < (PEXPDMaxShift + 1); i++)
- {
- f = (1L << i);
- if (valueMask & f)
- {
- switch (f)
- {
- case PEXPDPickStatus:
-
- EXTRACT_LOV_CARD16 (pBuf, ppdi->status);
- break;
-
- case PEXPDPickPath:
-
- EXTRACT_CARD32 (pBuf, count);
- ppdi->path.count = count;
-
- ppdi->path.elements = (PEXPickElementRef *)
- Xmalloc (count * sizeof (PEXPickElementRef));
-
- EXTRACT_LISTOF_PICKELEMREF (count, pBuf, ppdi->path.elements);
- break;
-
- case PEXPDPickPathOrder:
-
- EXTRACT_LOV_CARD16 (pBuf, ppdi->path_order);
- break;
-
- case PEXPDPickIncl:
-
- EXTRACT_CARD32 (pBuf, ppdi->inclusion);
- break;
-
- case PEXPDPickExcl:
-
- EXTRACT_CARD32 (pBuf, ppdi->exclusion);
- break;
-
- case PEXPDPickDataRec:
-
- EXTRACT_CARD32 (pBuf, size);
- EXTRACT_PICK_RECORD (pBuf, devType, size, ppdi->pick_record,
- fpConvert, fpFormat);
- break;
-
- case PEXPDPromptEchoType:
-
- EXTRACT_LOV_INT16 (pBuf, ppdi->prompt_echo_type);
- break;
-
- case PEXPDEchoVolume:
-
- EXTRACT_VIEWPORT (pBuf, ppdi->echo_volume,
- fpConvert, fpFormat);
- break;
-
- case PEXPDEchoSwitch:
-
- EXTRACT_LOV_CARD16 (pBuf, ppdi->echo_switch);
- break;
- }
- }
- }
-
- FINISH_WITH_SCRATCH (display, pBufSave, rep.length << 2);
-
- /*
- * Done, so unlock and check for synchronous-ness.
- */
-
- UnlockDisplay (display);
- PEXSyncHandle (display);
-
- return (ppdi);
-}
-
-
-void
-PEXChangePickDevice (display, wks, devType, valueMask, values)
-
-INPUT Display *display;
-INPUT PEXWorkstation wks;
-INPUT int devType;
-INPUT unsigned long valueMask;
-INPUT PEXPDAttributes *values;
-
-{
- register pexChangePickDeviceReq *req;
- char *pBuf;
- char *pSend;
- unsigned long f;
- unsigned long size;
- PEXPickRecord *pick_record;
- int i;
- int fpConvert;
- int fpFormat;
-
-
- /*
- * Lock around the critical section, for multithreading.
- */
-
- LockDisplay (display);
-
-
- /*
- * Put the request in the X request buffer.
- */
-
- PEXGetReq (ChangePickDevice, pBuf);
-
- BEGIN_REQUEST_HEADER (ChangePickDevice, pBuf, req);
- CHECK_FP (fpConvert, fpFormat);
-
- PEXStoreFPReqHead (ChangePickDevice, fpFormat, req);
- req->wks = wks;
- req->itemMask = valueMask;
- req->devType = devType;
-
-
- /*
- * Allocate a scratch buffer used to pack the attributes. It's not
- * worth computing the exact amount of memory needed, so assume the
- * worse case.
- */
-
- size = 8 * SIZEOF (CARD32) +
- (SIZEOF (pexPickElementRef) * ((valueMask & PEXPDPickPath) ?
- values->path.count : 0)) +
- sizeof (PEXPickRecord) +
- SIZEOF (pexViewport);
-
- pBuf = pSend = (char *) _XAllocScratch (display, size);
-
- for (i = 0; i < (PEXPDMaxShift + 1); i++)
- {
- f = (1L << i);
- if (valueMask & f)
- {
- switch (f)
- {
- case PEXPDPickStatus:
-
- STORE_CARD32 (values->status, pBuf);
- break;
-
- case PEXPDPickPath:
-
- STORE_CARD32 (values->path.count, pBuf);
- STORE_LISTOF_PICKELEMREF (values->path.count,
- values->path.elements, pBuf);
- break;
-
- case PEXPDPickPathOrder:
-
- STORE_CARD32 (values->path_order, pBuf);
- break;
-
- case PEXPDPickIncl:
-
- STORE_CARD32 (values->inclusion, pBuf);
- break;
-
- case PEXPDPickExcl:
-
- STORE_CARD32 (values->exclusion, pBuf);
- break;
-
- case PEXPDPickDataRec:
-
- size = GetPickRecordSize (devType);
- STORE_CARD32 (size, pBuf);
-
- pick_record = (PEXPickRecord *) &(values->pick_record);
- STORE_PICK_RECORD (devType, size, pick_record, pBuf,
- fpConvert, fpFormat);
- break;
-
- case PEXPDPromptEchoType:
-
- STORE_CARD32 (values->prompt_echo_type, pBuf);
- break;
-
- case PEXPDEchoVolume:
-
- STORE_VIEWPORT (values->echo_volume, pBuf,
- fpConvert, fpFormat);
- break;
-
- case PEXPDEchoSwitch:
-
- STORE_CARD32 (values->echo_switch, pBuf);
- break;
- }
- }
- }
-
- size = pBuf - pSend;
- req->length += NUMWORDS (size);
-
- END_REQUEST_HEADER (ChangePickDevice, pBuf, req);
-
- if (size > 0)
- Data (display, pSend, size);
-
-
- /*
- * Done, so unlock and check for synchronous-ness.
- */
-
- UnlockDisplay (display);
- PEXSyncHandle (display);
-}
-
-
-
-
-/*
- * Routine to convert a protocol-format event (wire) to a client event
- * structure (client) for a PEXMaxHitsReachedEvent. XESetWireToEvent is
- * called in PEXInitialize to set this up with Xlib.
- */
-
-Status
-_PEXConvertMaxHitsEvent (display, client, wire)
-
-INPUT Display *display;
-INPUT XEvent *client;
-INPUT xEvent *wire;
-
-{
- pexMaxHitsReachedEvent *wireevent;
- PEXMaxHitsReachedEvent *clientevent;
-
-
- /*
- * Set up the pointers.
- */
-
- wireevent = (pexMaxHitsReachedEvent *) wire;
- clientevent = (PEXMaxHitsReachedEvent *) client;
-
-
- /*
- * Now fill in the client structure.
- */
-
- clientevent->type = wireevent->type & 0x7f;
- clientevent->serial = wireevent->sequenceNumber;
- clientevent->send_event = (wireevent->type & 0x80) != 0;
-
-
- /*
- * MSB set if event came from SendEvent request.
- */
-
- clientevent->display = display;
- clientevent->renderer = wireevent->rdr;
-
-
- /*
- * Tell Xlib to add this to the event queue.
- */
-
- return (True);
-}
-
-
-void
-PEXBeginPickOne (display, drawable, renderer, structure_id,
- method, pick_device_type, pick_record)
-
-INPUT Display *display;
-INPUT Drawable drawable;
-INPUT PEXRenderer renderer;
-INPUT long structure_id;
-INPUT int method;
-INPUT int pick_device_type;
-INPUT PEXPickRecord *pick_record;
-{
- register pexBeginPickOneReq *req;
- char *pBuf;
- unsigned int rec_size;
- int fpConvert;
- int fpFormat;
-
-
- /*
- * Lock around the critical section, for multithreading.
- */
-
- LockDisplay (display);
-
-
- /*
- * Put the request in the X request buffer.
- */
-
- rec_size = GetPickRecordSize (pick_device_type);
-
- PEXGetReqExtra (BeginPickOne, (4 + rec_size), pBuf);
-
- BEGIN_REQUEST_HEADER (BeginPickOne, pBuf, req);
- CHECK_FP (fpConvert, fpFormat);
-
- PEXStoreFPReqExtraHead (BeginPickOne, fpFormat, (4 + rec_size), req);
-
- req->method = method;
- req->rdr = renderer;
- req->drawable = drawable;
- req->sid = structure_id;
-
- END_REQUEST_HEADER (BeginPickOne, pBuf, req);
-
- STORE_INT16 (pick_device_type, pBuf);
- pBuf += 2; /* pad */
-
- STORE_PICK_RECORD (pick_device_type, rec_size,
- pick_record, pBuf, fpConvert, fpFormat);
-
-
- /*
- * Done, so unlock and check for synchronous-ness.
- */
-
- UnlockDisplay (display);
- PEXSyncHandle (display);
-}
-
-
-PEXPickPath *
-PEXEndPickOne (display, renderer, status_return, undetectable_return)
-
-INPUT Display *display;
-INPUT PEXRenderer renderer;
-OUTPUT int *status_return;
-OUTPUT int *undetectable_return;
-
-{
- register pexEndPickOneReq *req;
- char *pBuf;
- pexEndPickOneReply rep;
- PEXPickPath *pathRet;
- unsigned int size;
-
-
- /*
- * Lock around the critical section, for multithreading.
- */
-
- LockDisplay (display);
-
-
- /*
- * Put the request in the X request buffer and get a reply.
- */
-
- PEXGetReq (EndPickOne, pBuf);
-
- BEGIN_REQUEST_HEADER (EndPickOne, pBuf, req);
-
- PEXStoreReqHead (EndPickOne, req);
- req->rdr = renderer;
-
- END_REQUEST_HEADER (EndPickOne, pBuf, req);
-
- if (_XReply (display, (xReply *)&rep, 0, xFalse) == 0)
- {
- UnlockDisplay (display);
- PEXSyncHandle (display);
- return (NULL); /* return an error */
- }
-
- *status_return = rep.pickStatus;
- *undetectable_return = rep.betterPick;
-
-
- /*
- * Allocate a buffer for the path to pass back to the client.
- * If possible, use the pick path cache.
- */
-
- size = sizeof (PEXPickPath) +
- rep.numPickElRefs * sizeof (PEXPickElementRef);
-
- if (!PEXPickCacheInUse && size <= PEXPickCacheSize)
- {
- pathRet = PEXPickCache;
- PEXPickCacheInUse = 1;
- }
- else
- pathRet = (PEXPickPath *) Xmalloc (size);
-
- pathRet->elements = (PEXPickElementRef *) (pathRet + 1);
- pathRet->count = rep.numPickElRefs;
-
- XREAD_LISTOF_PICKELEMREF (display, rep.numPickElRefs, pathRet->elements);
-
-
- /*
- * Done, so unlock and check for synchronous-ness.
- */
-
- UnlockDisplay (display);
- PEXSyncHandle (display);
-
- return (pathRet);
-}
-
-
-PEXPickPath *
-PEXPickOne (display, drawable, renderer, structure, method,
- pick_device_type, pick_record, status_return, undetectable_return)
-
-INPUT Display *display;
-INPUT Drawable drawable;
-INPUT PEXRenderer renderer;
-INPUT PEXStructure structure;
-INPUT int method;
-INPUT int pick_device_type;
-INPUT PEXPickRecord *pick_record;
-OUTPUT int *status_return;
-OUTPUT int *undetectable_return;
-
-{
- register pexPickOneReq *req;
- char *pBuf;
- pexPickOneReply rep;
- unsigned int rec_size;
- unsigned int size;
- int fpConvert;
- int fpFormat;
- PEXPickPath *pathRet;
-
-
- /*
- * Lock around the critical section, for multithreading.
- */
-
- LockDisplay (display);
-
-
- /*
- * Put the request in the X request buffer and get a reply.
- */
-
- rec_size = GetPickRecordSize (pick_device_type);
-
- PEXGetReqExtra (PickOne, (4 + rec_size), pBuf);
-
- BEGIN_REQUEST_HEADER (PickOne, pBuf, req);
- CHECK_FP (fpConvert, fpFormat);
-
- PEXStoreFPReqExtraHead (PickOne, fpFormat, (4 + rec_size), req);
-
- req->method = method;
- req->rdr = renderer;
- req->drawable = drawable;
- req->sid = structure;
-
- END_REQUEST_HEADER (PickOne, pBuf, req);
-
- STORE_INT16 (pick_device_type, pBuf);
- pBuf += 2; /* pad */
-
- STORE_PICK_RECORD (pick_device_type, rec_size,
- pick_record, pBuf, fpConvert, fpFormat);
-
- if (_XReply (display, (xReply *)&rep, 0, xFalse) == 0)
- {
- UnlockDisplay (display);
- PEXSyncHandle (display);
- return (NULL); /* return an error */
- }
-
- *status_return = rep.pickStatus;
- *undetectable_return = rep.betterPick;
-
-
- /*
- * Allocate a buffer for the path to pass back to the client.
- * If possible, use the pick path cache.
- */
-
- size = sizeof (PEXPickPath) +
- rep.numPickElRefs * sizeof (PEXPickElementRef);
-
- if (!PEXPickCacheInUse && size <= PEXPickCacheSize)
- {
- pathRet = PEXPickCache;
- PEXPickCacheInUse = 1;
- }
- else
- pathRet = (PEXPickPath *) Xmalloc (size);
-
- pathRet->elements = (PEXPickElementRef *) (pathRet + 1);
- pathRet->count = rep.numPickElRefs;
-
- XREAD_LISTOF_PICKELEMREF (display, rep.numPickElRefs, pathRet->elements);
-
-
- /*
- * Done, so unlock and check for synchronous-ness.
- */
-
- UnlockDisplay (display);
- PEXSyncHandle (display);
-
- return (pathRet);
-}
-
-
-void
-PEXBeginPickAll (display, drawable, renderer, structure_id, method,
- send_event, max_hits, pick_device_type, pick_record)
-
-INPUT Display *display;
-INPUT Drawable drawable;
-INPUT PEXRenderer renderer;
-INPUT long structure_id;
-INPUT int method;
-INPUT int send_event;
-INPUT int max_hits;
-INPUT int pick_device_type;
-INPUT PEXPickRecord *pick_record;
-{
- register pexBeginPickAllReq *req;
- char *pBuf;
- unsigned int rec_size;
- int fpConvert;
- int fpFormat;
-
-
- /*
- * Lock around the critical section, for multithreading.
- */
-
- LockDisplay (display);
-
-
- /*
- * Put the request in the X request buffer.
- */
-
- rec_size = GetPickRecordSize (pick_device_type);
-
- PEXGetReqExtra (BeginPickAll, (4 + rec_size), pBuf);
-
- BEGIN_REQUEST_HEADER (BeginPickAll, pBuf, req);
- CHECK_FP (fpConvert, fpFormat);
-
- PEXStoreFPReqExtraHead (BeginPickAll, fpFormat, (4 + rec_size), req);
-
- req->method = method;
- req->rdr = renderer;
- req->drawable = drawable;
- req->sid = structure_id;
- req->sendEvent = send_event;
- req->pickMaxHits = max_hits;
-
- END_REQUEST_HEADER (BeginPickAll, pBuf, req);
-
- STORE_INT16 (pick_device_type, pBuf);
- pBuf += 2; /* pad */
-
- STORE_PICK_RECORD (pick_device_type, rec_size,
- pick_record, pBuf, fpConvert, fpFormat);
-
-
- /*
- * Done, so unlock and check for synchronous-ness.
- */
-
- UnlockDisplay (display);
- PEXSyncHandle (display);
-}
-
-
-PEXPickPath *
-PEXEndPickAll (display, renderer, status_return, more_return, count_return)
-
-INPUT Display *display;
-INPUT PEXRenderer renderer;
-OUTPUT int *status_return;
-OUTPUT int *more_return;
-OUTPUT unsigned long *count_return;
-
-{
- register pexEndPickAllReq *req;
- char *pBuf, *pBufSave;
- pexEndPickAllReply rep;
- PEXPickPath *pPath;
- PEXPickPath *pPathRet;
- PEXPickElementRef *pElemRef;
- int numElements, i;
- unsigned int total_size;
-
-
- /*
- * Lock around the critical section, for multithreading.
- */
-
- LockDisplay (display);
-
-
- /*
- * Put the request in the X request buffer and get a reply.
- */
-
- PEXGetReq (EndPickAll, pBuf);
-
- BEGIN_REQUEST_HEADER (EndPickAll, pBuf, req);
-
- PEXStoreReqHead (EndPickAll, req);
- req->rdr = renderer;
-
- END_REQUEST_HEADER (EndPickAll, pBuf, req);
-
- if (_XReply (display, (xReply *)&rep, 0, xFalse) == 0)
- {
- UnlockDisplay (display);
- PEXSyncHandle (display);
- *count_return = 0;
- return (NULL); /* return an error */
- }
-
- *status_return = rep.pickStatus;
- *more_return = rep.morePicks;
- *count_return = rep.numPicked;
-
-
- /*
- * Read the reply data into a scratch buffer.
- */
-
- XREAD_INTO_SCRATCH (display, pBufSave, rep.length << 2);
- pBuf = pBufSave;
-
- /*
- * Allocate a buffer for the replies to pass back to the client.
- * If possible, use the pick path cache.
- */
-
- total_size = rep.numPicked * sizeof (PEXPickPath);
-
- for (i = 0; i < rep.numPicked; i++)
- {
- EXTRACT_CARD32 (pBuf, numElements);
- total_size += (numElements * sizeof (PEXPickElementRef));
- pBuf += (numElements * SIZEOF (pexPickElementRef));
- }
-
- if (!PEXPickCacheInUse && total_size <= PEXPickCacheSize)
- {
- pPathRet = PEXPickCache;
- PEXPickCacheInUse = 1;
- }
- else
- pPathRet = (PEXPickPath *) Xmalloc (total_size);
-
- pPath = pPathRet;
- pBuf = pBufSave;
- pElemRef = (PEXPickElementRef *) ((char *) pPath +
- rep.numPicked * sizeof (PEXPickPath));
-
- for (i = 0; i < rep.numPicked; i++)
- {
- EXTRACT_CARD32 (pBuf, numElements);
- EXTRACT_LISTOF_PICKELEMREF (numElements, pBuf, pElemRef);
-
- pPath->count = numElements;
- pPath->elements = pElemRef;
- pPath++;
- pElemRef += numElements;
- }
-
- FINISH_WITH_SCRATCH (display, pBufSave, rep.length << 2);
-
- /*
- * Done, so unlock and check for synchronous-ness.
- */
-
- UnlockDisplay (display);
- PEXSyncHandle (display);
-
- return (pPathRet);
-}
-
-
-PEXPickPath *
-PEXPickAll (display, drawable, renderer, method, max_hits, pick_device_type,
- pick_record, status_return, more_return, count_return)
-
-INPUT Display *display;
-INPUT Drawable drawable;
-INPUT PEXRenderer renderer;
-INPUT int method;
-INPUT int max_hits;
-INPUT int pick_device_type;
-INPUT PEXPickRecord *pick_record;
-OUTPUT int *status_return;
-OUTPUT int *more_return;
-OUTPUT unsigned long *count_return;
-
-
-{
- register pexPickAllReq *req;
- char *pBuf, *pBufSave;
- pexPickAllReply rep;
- PEXPickPath *pPath;
- PEXPickPath *pPathRet;
- PEXPickElementRef *pElemRef;
- int numElements, i;
- unsigned int rec_size;
- unsigned int total_size;
- int fpConvert;
- int fpFormat;
-
-
- /*
- * Lock around the critical section, for multithreading.
- */
-
- LockDisplay (display);
-
-
- /*
- * Put the request in the X request buffer and get a reply.
- */
-
- rec_size = GetPickRecordSize (pick_device_type);
-
- PEXGetReqExtra (PickAll, (4 + rec_size), pBuf);
-
- BEGIN_REQUEST_HEADER (PickAll, pBuf, req);
- CHECK_FP (fpConvert, fpFormat);
-
- PEXStoreFPReqExtraHead (PickAll, fpFormat, (4 + rec_size), req);
-
- req->method = method;
- req->rdr = renderer;
- req->drawable = drawable;
- req->pickMaxHits = max_hits;
-
- END_REQUEST_HEADER (PickAll, pBuf, req);
-
- STORE_INT16 (pick_device_type, pBuf);
- pBuf += 2; /* pad */
-
- STORE_PICK_RECORD (pick_device_type, rec_size,
- pick_record, pBuf, fpConvert, fpFormat);
-
- if (_XReply (display, (xReply *)&rep, 0, xFalse) == 0)
- {
- UnlockDisplay (display);
- PEXSyncHandle (display);
- *count_return = 0;
- return (NULL); /* return an error */
- }
-
- *status_return = rep.pickStatus;
- *more_return = rep.morePicks;
- *count_return = rep.numPicked;
-
-
- /*
- * Read the reply data into a scratch buffer.
- */
-
- XREAD_INTO_SCRATCH (display, pBufSave, rep.length << 2);
- pBuf = pBufSave;
-
- /*
- * Allocate a buffer for the replies to pass back to the client.
- * If possible, use the pick path cache.
- */
-
- total_size = rep.numPicked * sizeof (PEXPickPath);
-
- for (i = 0; i < rep.numPicked; i++)
- {
- EXTRACT_CARD32 (pBuf, numElements);
- total_size += (numElements * sizeof (PEXPickElementRef));
- pBuf += (numElements * SIZEOF (pexPickElementRef));
- }
-
- if (!PEXPickCacheInUse && total_size <= PEXPickCacheSize)
- {
- pPathRet = PEXPickCache;
- PEXPickCacheInUse = 1;
- }
- else
- pPathRet = (PEXPickPath *) Xmalloc (total_size);
-
- pPath = pPathRet;
- pBuf = pBufSave;
- pElemRef = (PEXPickElementRef *) ((char *) pPath +
- rep.numPicked * sizeof (PEXPickPath));
-
- for (i = 0; i < rep.numPicked; i++)
- {
- EXTRACT_CARD32 (pBuf, numElements);
- EXTRACT_LISTOF_PICKELEMREF (numElements, pBuf, pElemRef);
-
- pPath->count = numElements;
- pPath->elements = pElemRef;
- pPath++;
- pElemRef += numElements;
- }
-
- FINISH_WITH_SCRATCH (display, pBufSave, rep.length << 2);
-
- /*
- * Done, so unlock and check for synchronous-ness.
- */
-
- UnlockDisplay (display);
- PEXSyncHandle (display);
-
- return (pPathRet);
-}