mirror of
https://github.com/Stichting-MINIX-Research-Foundation/xsrc.git
synced 2025-09-13 22:57:40 -04:00
112 lines
3.7 KiB
C
112 lines
3.7 KiB
C
/* $XFree86: xc/lib/XTrap/XEDsptch.c,v 1.1 2001/11/02 23:29:27 dawes Exp $ */
|
||
/*****************************************************************************
|
||
Copyright 1987, 1988, 1989, 1990, 1991 by Digital Equipment Corp., Maynard, MA
|
||
|
||
Permission to use, copy, modify, and distribute this software and its
|
||
documentation for any purpose and without fee is hereby granted,
|
||
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 not be
|
||
used in advertising or publicity pertaining to distribution of the
|
||
software without specific, written prior permission.
|
||
|
||
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.
|
||
|
||
*****************************************************************************/
|
||
/*
|
||
*
|
||
* CONTRIBUTORS:
|
||
*
|
||
* Dick Annicchiarico
|
||
* Robert Chesler
|
||
* Dan Coutu
|
||
* Gene Durso
|
||
* Marc Evans
|
||
* Alan Jamison
|
||
* Mark Henry
|
||
* Ken Miller
|
||
*
|
||
*/
|
||
|
||
#include <stdio.h>
|
||
#include <errno.h>
|
||
#include <X11/extensions/xtraplib.h>
|
||
#include <X11/extensions/xtraplibp.h>
|
||
|
||
static void XETrapDispatchCB(XETC *tc, XETrapDatum *pdatum)
|
||
{
|
||
void_function pfunc = NULL;
|
||
BYTE *userp = NULL;
|
||
|
||
/* Need to deal with Delta Timestamps here before calling client CB */
|
||
if (XETrapGetTCFlagDeltaTimes(tc))
|
||
{
|
||
CARD32 last_time = XETrapGetTCTime(tc);
|
||
if (XETrapHeaderIsEvent(&pdatum->hdr))
|
||
{ /* then we can play with the timestamps */
|
||
pdatum->hdr.timestamp =
|
||
pdatum->u.event.u.keyButtonPointer.time;
|
||
}
|
||
else
|
||
{ /*
|
||
* the current one from GetTimeInMillis is worthless
|
||
* as it's only updated during event instances (e.g. not
|
||
* wall clock).
|
||
*/
|
||
pdatum->hdr.timestamp = last_time;
|
||
}
|
||
if (!pdatum->hdr.timestamp)
|
||
{ /* for dual monitor bug */
|
||
pdatum->hdr.timestamp = last_time;
|
||
}
|
||
if (!last_time)
|
||
{ /* first one! Prime it! */
|
||
last_time = pdatum->hdr.timestamp;
|
||
}
|
||
tc->values.last_time = pdatum->hdr.timestamp; /* no macro! */
|
||
if (pdatum->hdr.timestamp < last_time)
|
||
{ /* for clock rollover */
|
||
pdatum->hdr.timestamp = 0;
|
||
}
|
||
else
|
||
{ /* the real delta */
|
||
pdatum->hdr.timestamp = pdatum->hdr.timestamp - last_time;
|
||
}
|
||
}
|
||
/* Get the user supplied callback function */
|
||
if (XETrapHeaderIsEvent(&pdatum->hdr))
|
||
{
|
||
pfunc = tc->values.evt_cb[pdatum->u.event.u.u.type].func;
|
||
userp = tc->values.evt_cb[pdatum->u.event.u.u.type].data;
|
||
}
|
||
else if (XETrapHeaderIsRequest(&pdatum->hdr) ||
|
||
XETrapHeaderIsReply(&pdatum->hdr))
|
||
{
|
||
pfunc = tc->values.req_cb[pdatum->u.req.reqType].func;
|
||
userp = tc->values.req_cb[pdatum->u.req.reqType].data;
|
||
}
|
||
|
||
/* If there is a callback then call it with the data */
|
||
if (pfunc != NULL)
|
||
{
|
||
(*pfunc)(tc,pdatum,userp);
|
||
}
|
||
}
|
||
|
||
Boolean XETrapDispatchXLib(XETrapDataEvent *event, XETC *tc)
|
||
{
|
||
memcpy(&tc->xbuff[event->idx*sz_EventData], event->data, sz_EventData);
|
||
|
||
if (event->detail == XETrapDataLast)
|
||
{
|
||
XETrapDispatchCB(tc, (XETrapDatum *)tc->xbuff);
|
||
}
|
||
return True;
|
||
}
|