diff options
Diffstat (limited to 'app/xtrap/xtrapin.c')
-rw-r--r-- | app/xtrap/xtrapin.c | 276 |
1 files changed, 276 insertions, 0 deletions
diff --git a/app/xtrap/xtrapin.c b/app/xtrap/xtrapin.c new file mode 100644 index 000000000..face0c42e --- /dev/null +++ b/app/xtrap/xtrapin.c @@ -0,0 +1,276 @@ +/* $XFree86: xc/programs/xtrap/xtrapin.c,v 1.2tsi Exp $ */ +/* + * @DEC_COPYRIGHT@ + */ +/* + * HISTORY + * Log: xtrapin.c,v $ + * Revision 1.1.4.2 1993/12/14 12:37:20 Kenneth_Miller + * ANSI-standardize code and turn client build on + * [1993/12/09 20:15:45 Kenneth_Miller] + * + * Revision 1.1.2.2 1992/04/27 13:51:39 Leela_Obilichetti + * Initial load of xtrap clients - from silver BL6 + * [92/04/27 13:49:16 Leela_Obilichetti] + * + * EndLog$ + */ +/***************************************************************************** +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 + * + */ +#define ProgName "xtrapin" +/* +**++ +** FACILITY: xtrapin - Sample client to test input to XTrap extension +** +** MODULE DESCRIPTION: +** +** This is the main module for a sample/test client +** for the XTrap X11 Server Extension. It accepts +** a script file and a transport method as input +** in addition to the standard X arguments (-d, etc.). +** If no script file is provided, stdin is the default +** and can be piped from the companion "xtrapout" +** client (normally used with the -e argument which +** sends all core input events to stdout). +** +** +** AUTHORS: +** +** Kenneth B. Miller +** +** CREATION DATE: December 15, 1990 +** +** DESIGN ISSUES: +** +** See the companion "xtrapout" client. +** +** Also, getopt() is used to parse the command +** line arguments prior to calling XtAppInitialize(). +** This is because DECwindows appears to remove the user- +** defined arguments from the argv[] vector without actually +** acting upon them. +** +** +**-- +*/ +#include <stdio.h> +#include <X11/extensions/xtraplib.h> +#include <X11/extensions/xtraplibp.h> +#include <unistd.h> +#include <stdlib.h> + +#ifndef vaxc +#define globalref extern +#endif +#ifdef Lynx +extern char *optarg; +extern int optind; +extern int opterr; +#endif + +static Boolean grabFlag = False; + +FILE *ifp; +XrmOptionDescRec optionTable [] = +{ + {"-f", "*script", XrmoptionSepArg, (caddr_t) NULL}, + {"-g", "*grabServer",XrmoptionSkipArg, (caddr_t) NULL}, +}; + +typedef struct +{ /* longword-align fields for arg passing */ + Time ts; + int type; + int detail; + int x; + int y; + int screen; /* this will always be 0 till vectored events! */ +} file_rec; + +/* Forward declarations */ +static Bool found_input_rec (FILE *ifp , file_rec *rec ); + +static Widget appW; +static Display *dpy; + + +int +main(int argc, char *argv[]) +{ + XETrapGetAvailRep ret_avail; + XETrapGetCurRep ret_cur; + XETC *tc; + XtAppContext app; + char *tmp = NULL; + INT16 ch; + file_rec rec; + Time last_time = 0L; + int *popterr; + char **poptarg; +#ifndef vms + popterr = &opterr; + poptarg = &optarg; +#else + popterr = XEgetopterr(); + poptarg = XEgetoptarg(); +#endif + + ifp = NULL; + *popterr = 0; /* don't complain about -d for display */ + grabFlag = False; + while ((ch = getopt(argc, argv, "d:f:g")) != EOF) + { + switch(ch) + { + case 'f': + if ((ifp = fopen(*poptarg,"rb")) == NULL) + { /* can't open it */ + fprintf(stderr,"%s: could not open output file '%s'!\n", + ProgName, *poptarg); + } + break; + case 'd': /* -display, let's let the toolkit parse it */ + break; + case 'g': + grabFlag = True; + default: + break; + } + } + ifp = (ifp ? ifp : stdin); + + appW = XtAppInitialize(&app,"XTrap",optionTable,(Cardinal)1L, + (int *)&argc, (String *)argv, (String *)NULL,(ArgList)&tmp, + (Cardinal)NULL); + + dpy = XtDisplay(appW); +#ifdef DEBUG + XSynchronize(dpy, True); +#endif + printf("Display: %s \n", DisplayString(dpy)); + + if ((tc = XECreateTC(dpy,0L, NULL)) == False) + { + fprintf(stderr,"%s: could not initialize XTrap extension\n", ProgName); + exit (1L); + } + (void)XEGetAvailableRequest(tc,&ret_avail); + XEPrintAvail(stderr,&ret_avail); + XEPrintTkFlags(stderr,tc); + + if (grabFlag == True) + { /* + * In order to ignore GrabServer's we must configure at least one + * trap. Let's make it X_GrabServer. We don't have to receive + * a callback, though. + */ + ReqFlags requests; + (void)memset(requests,0L,sizeof(requests)); + BitTrue(requests, X_GrabServer); + XETrapSetRequests(tc, True, requests); + (void)XETrapSetGrabServer(tc, True); + } + + (void)XEStartTrapRequest(tc); + (void)XEGetCurrentRequest(tc,&ret_cur); + XEPrintCurrent(stderr,&ret_cur); + + /* Open up script file */ + while (found_input_rec(ifp,&rec) == True) + { + /* if not pipe'd, delay time delta time recorded */ + if (ifp != stdin) + { + register INT32 delta, t1, t2; + last_time = (last_time ? last_time : rec.ts); /* first rec */ + rec.ts = (rec.ts ? rec.ts : last_time); /* dual monitor bug! */ + t1 = rec.ts; t2 = last_time; /* move to signed variables */ + delta = abs(t1 - t2); /* protect from clock roll-over */ + msleep(delta); + last_time = rec.ts; + } + XESimulateXEventRequest(tc, rec.type, rec.detail, rec.x, rec.y, + rec.screen); + } + + (void)XCloseDisplay(dpy); + exit(0L); +} + +static Bool found_input_rec(FILE *ifp, file_rec *rec) +{ + int found = False; + char buff[BUFSIZ]; + char junk[16L]; + int tmp[8L]; + + while ((found != True) && (fgets(buff,BUFSIZ,ifp) != NULL)) + { + if (!strncmp(buff, "Event:", strlen("Event:"))) + { /* we want this record */ + if (sscanf(buff, + "Event: %s (%d):det=%d scr=%d (%d,%d) root=%d Msk=%d TS=%d\n", + junk, &(tmp[0L]), &(tmp[1L]), &(tmp[2L]), &(tmp[3L]), + &(tmp[4L]), &(tmp[5L]), &(tmp[6L]), &(tmp[7L])) != 9L) + { + fprintf(stderr, "%s: Error parsing script input!\n\t'%s'\n", + ProgName, buff); + } + else + { + found = True; + /* Sun's have problems with "byte" fields passed to scanf */ + rec->type = tmp[0L]; + rec->detail = tmp[1L]; + rec->screen = tmp[2L]; + rec->x = tmp[3L]; + rec->y = tmp[4L]; + rec->ts = tmp[7L]; + } + } + else if (!strncmp(buff, "Request:", strlen("Request:"))) + { /* a valid thing to see */ + continue; + } + else + { /* this stuff doesn't look like what we'd expect */ + fprintf(stderr, "%s: Not a valid script record!\n\t'%s'\n", + ProgName, buff); + } + } + + return(found); +} + |