summaryrefslogtreecommitdiff
path: root/app/xtrap/xtrapin.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/xtrap/xtrapin.c')
-rw-r--r--app/xtrap/xtrapin.c276
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);
+}
+