#include <stdio.h>
#include <X11/extensions/xtraplib.h>
#include <X11/extensions/xtraplibp.h>
#ifdef vms
#define IS_AT_OR_AFTER(t1, t2) (((t2).high > (t1).high) \
|| (((t2).high == (t1).high)&& ((t2).low >= (t1).low)))
typedef struct _vms_time {
unsigned long low;
unsigned long high;
}vms_time;
#ifdef VMSDW_V3
typedef struct _ModToKeysymTable {
Modifiers mask;
int count;
int index;
} ModToKeysymTable;
typedef struct _ConverterRec **ConverterTable;
#include "libdef.h"
typedef struct _CallbackRec *CallbackList;
typedef struct _XtGrabRec *XtGrabList;
#include <X11/PassivGraI.h>
#include <X11/InitialI.h>
#else
typedef struct _ModToKeysymTable {
Modifiers mask;
int count;
int index;
} ModToKeysymTable;
typedef struct _ConverterRec **ConverterTable;
#include "libdef.h"
#define NFDBITS (sizeof(fd_mask) * 8)
typedef long fd_mask;
#ifndef howmany
#define howmany(x, y) (((x)+((y)-1))/(y))
#endif
typedef struct Fd_set {
fd_mask fds_bits[howmany(256, NFDBITS)];
} Fd_set;
#include <X11/InitializeI.h>
#endif
#else
#include <X11/IntrinsicI.h>
#define IS_AT_OR_AFTER(t1, t2) (((t2).tv_sec > (t1).tv_sec) \
|| (((t2).tv_sec == (t1).tv_sec)&& ((t2).tv_usec >= (t1).tv_usec)))
#endif
#ifndef NEEDS_NTPD_FIXUP
# ifdef sun
# define NEEDS_NTPD_FIXUP 1
# else
# define NEEDS_NTPD_FIXUP 0
# endif
#endif
#if NEEDS_NTPD_FIXUP
#define FIXUP_TIMEVAL(t) { \
while ((t).tv_usec >= 1000000) { \
(t).tv_usec -= 1000000; \
(t).tv_sec++; \
} \
while ((t).tv_usec < 0) { \
if ((t).tv_sec > 0) { \
(t).tv_usec += 1000000; \
(t).tv_sec--; \
} else { \
(t).tv_usec = 0; \
break; \
} \
}}
#else
#define FIXUP_TIMEVAL(t)
#endif
Boolean (*XETrapGetEventHandler(XETC *tc, CARD32 id))(XETrapDataEvent *event, XETC *tc)
{
return((id < XETrapNumberEvents) ? tc->eventFunc[id] : NULL);
}
Boolean (*XETrapSetEventHandler(XETC *tc, CARD32 id,
Boolean (*pfunc)(XETrapDataEvent *event, XETC *tc)))(XETrapDataEvent *event, XETC *tc)
{
register Boolean (*rfunc)(XETrapDataEvent *event, XETC *tc) = NULL;
if (id < XETrapNumberEvents)
{
rfunc = XETrapGetEventHandler(tc,id);
tc->eventFunc[id] = pfunc;
}
return(rfunc);
}
Boolean XETrapDispatchEvent(XEvent *pevent, XETC *tc)
{
Boolean status = False;
register CARD32 id = pevent->type;
register CARD32 firstEvent = tc->eventBase;
register CARD32 lastEvent = tc->eventBase + XETrapNumberEvents - 1L;
if (firstEvent != 0 && id >= firstEvent && id <= lastEvent)
{
if (tc->eventFunc[id - firstEvent] != NULL)
{
status = (*tc->eventFunc[id - firstEvent])((XETrapDataEvent*)pevent,tc);
}
}
else
{
status = XtDispatchEvent(pevent);
}
return(status);
}
XtInputMask XETrapAppPending(XtAppContext app)
{
TimerEventRec *te_ptr;
#ifndef VMS
struct timeval cur_time;
#else
vms_time cur_time;
long efnMask = 0L;
int status;
#endif
XtInputMask retmask = XtAppPending(app);
retmask &= ~(XtIMTimer | XtIMAlternateInput);
te_ptr = app->timerQueue;
while (te_ptr != NULL)
{
#ifndef vms
(void)gettimeofday(&cur_time, NULL);
FIXUP_TIMEVAL(cur_time);
#else
sys$gettim(&cur_time);
#endif
if (IS_AT_OR_AFTER(te_ptr->te_timer_value, cur_time))
{
retmask |= XtIMTimer;
break;
}
te_ptr = te_ptr->te_next;
}
#ifndef vms
if (app->outstandingQueue != NULL)
{
retmask |= XtIMAlternateInput;
}
#else
if ((app->Input_EF_Mask != 0L) && ((status=SYS$READEF(1,&efnMask)) == 1))
{
efnMask &= app->Input_EF_Mask;
if (efnMask)
{
retmask |= XtIMAlternateInput;
}
}
#endif
return(retmask);
}
void XETrapAppMainLoop(XtAppContext app, XETC *tc)
{
XEvent event;
XtInputMask imask;
while (1)
{
imask = XETrapAppPending(app);
if (imask & XtIMXEvent)
{
(void)XtAppNextEvent(app,&event);
(void)XETrapDispatchEvent(&event,tc);
}
else if (imask & (XtIMTimer | XtIMAlternateInput))
{
XtAppProcessEvent(app, (XtIMTimer | XtIMAlternateInput));
}
else
{
(void)XETrapWaitForSomething(app);
}
}
}
int XETrapAppWhileLoop(XtAppContext app, XETC *tc, Bool *done)
{
XEvent event;
XtInputMask imask;
int status = True;
if(done)
{
while (!(*done))
{
imask = XETrapAppPending(app);
if (imask & XtIMXEvent)
{
(void)XtAppNextEvent(app, &event);
(void)XETrapDispatchEvent(&event,tc);
}
else if (imask & (XtIMTimer | XtIMAlternateInput))
{
XtAppProcessEvent(app, (XtIMTimer | XtIMAlternateInput));
}
else
{
(void)XETrapWaitForSomething(app);
}
}
}
else
{
status = False;
}
return(status);
}
int XETrapWaitForSomething(XtAppContext app)
{
#ifndef vms
return(_XtWaitForSomething(app, FALSE, FALSE, FALSE, FALSE, TRUE
#ifdef XTHREADS
, FALSE
#endif
, 0L));
#else
#define IS_AFTER(t1,t2) (((t2).high > (t1).high) \
||(((t2).high == (t1).high)&& ((t2).low > (t1).low)))
long retval = 0L;
TimerEventRec *te_ptr;
vms_time cur_time,result_time;
int status = 0;
long quotient, remainder = 0;
int d;
if (app->timerQueue!= NULL)
{
cur_time.low = cur_time.high = result_time.low = result_time.high = 0;
te_ptr = app->timerQueue;
sys$gettim(&cur_time);
if ((IS_AFTER(app->timerQueue->te_timer_value, cur_time)) &&
(app->timerQueue->te_proc != 0))
{
return(0);
}
status = lib$sub_times (&(te_ptr->te_timer_value.low), &cur_time,
&result_time);
if (status == LIB$_NEGTIM ||
(result_time.high == -1 && result_time.low > -10000))
{
return(0);
}
else if ((status & 1) == 1)
{
lib$ediv (&(10000), &result_time, "ient, &remainder);
quotient *= -1;
return(XMultiplexInput(app->count, &(app->list[0L]),
app->Input_EF_Mask, quotient, 0L, &retval));
}
else
{
status = -1;
}
}
return((status == -1 ? -1 : XMultiplexInput(app->count, &(app->list[0L]),
app->Input_EF_Mask, 0L, 0L, &retval)));
#endif
}