Home | History | Annotate | Line # | Download | only in dist
      1 /* $XFree86: xc/programs/xtrap/xtrapout.c,v 1.1 2001/11/02 23:29:34 dawes Exp $ */
      2 /*
      3  * @DEC_COPYRIGHT@
      4  */
      5 /*
      6  * HISTORY
      7  * Log: xtrapout.c,v $
      8  * Revision 1.1.4.2  1993/12/14  12:37:28  Kenneth_Miller
      9  * 	ANSI-standardize code and turn client build on
     10  * 	[1993/12/09  20:16:01  Kenneth_Miller]
     11  *
     12  * Revision 1.1.2.2  1992/04/27  13:51:57  Leela_Obilichetti
     13  * 	initial load of xtrap clients - from silver BL6 pool
     14  * 	[92/04/27  13:49:33  Leela_Obilichetti]
     15  *
     16  * EndLog$
     17  */
     18 /*****************************************************************************
     19 Copyright 1987, 1988, 1989, 1990, 1991, 1993 by Digital Equipment Corp.,
     20 Maynard, MA
     21 
     22 Permission to use, copy, modify, and distribute this software and its
     23 documentation for any purpose and without fee is hereby granted,
     24 provided that the above copyright notice appear in all copies and that
     25 both that copyright notice and this permission notice appear in
     26 supporting documentation, and that the name of Digital not be
     27 used in advertising or publicity pertaining to distribution of the
     28 software without specific, written prior permission.
     29 
     30 DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
     31 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
     32 DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
     33 ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
     34 WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
     35 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
     36 SOFTWARE.
     37 
     38 *****************************************************************************/
     39 /*
     40  *
     41  *  CONTRIBUTORS:
     42  *
     43  *      Dick Annicchiarico
     44  *      Robert Chesler
     45  *      Dan Coutu
     46  *      Gene Durso
     47  *      Marc Evans
     48  *      Alan Jamison
     49  *      Mark Henry
     50  *      Ken Miller
     51  *
     52  */
     53 #define ProgName "xtrapout"
     54 /*
     55 **++
     56 **  FACILITY:  xtrapout - Sample client to test output from XTrap extension
     57 **
     58 **  MODULE DESCRIPTION:
     59 **
     60 **      This is the main module for a sample/test client
     61 **      for the XTrap X11 Server Extension.  It accepts
     62 **      a script output file, a transport method,
     63 **      and an "events mode" flag (-e) as input,
     64 **      in addition to the standard X arguments (-d, etc.).
     65 **      If no script file is provided, stdout is the default
     66 **      and can be piped to the companion "xtrapin"
     67 **      client (normally used with the -e argument which
     68 **      sends all core input events to stdout).
     69 **
     70 **
     71 **  AUTHORS:
     72 **
     73 **      Kenneth B. Miller
     74 **
     75 **  CREATION DATE:  March 28, 1990
     76 **
     77 **  DESIGN ISSUES:
     78 **
     79 **      See the companion "xtrapin" client.
     80 **
     81 **      Also, getopt() is used to parse the command
     82 **      line arguments prior to calling XtAppInitialize().
     83 **      This is because DECwindows appears to remove the user-
     84 **      defined arguments from the argv[] vector without actually
     85 **      acting upon them.
     86 **
     87 **
     88 **--
     89 */
     90 
     91 #ifdef HAVE_CONFIG_H
     92 #include "config.h"
     93 #endif
     94 
     95 #include <inttypes.h>
     96 #include <stdio.h>
     97 #include <X11/extensions/xtraplib.h>
     98 #include <X11/extensions/xtraplibp.h>
     99 #include <signal.h>
    100 #include <X11/keysym.h>
    101 #include <unistd.h>
    102 #include <stdlib.h>
    103 
    104 #include "XEKeybCtrl.h"
    105 
    106 #ifndef vaxc
    107 #define globalref extern
    108 #endif
    109 #ifdef Lynx
    110 extern char *optarg;
    111 extern int optind;
    112 extern int opterr;
    113 #endif
    114 
    115 
    116 /* Forward declarations */
    117 static void SetGlobalDone (int unused );
    118 static void print_req_callback (XETC *tc , XETrapDatum *data ,
    119     BYTE *my_buf );
    120 static void print_evt_callback (XETC *tc , XETrapDatum *data ,
    121     BYTE *my_buf );
    122 
    123 
    124 static FILE *ofp;
    125 static Bool GlobalDone = False;
    126 static XrmOptionDescRec optionTable [] =
    127 {
    128     {"-f",     "*script",    XrmoptionSepArg,  (caddr_t) NULL},
    129     {"-e",     "*eventFlag", XrmoptionSkipArg, (caddr_t) NULL},
    130     {"-v",     "*verbose",   XrmoptionSkipArg, (caddr_t) NULL},
    131 };
    132 
    133 static void SetGlobalDone(int unused)
    134 {
    135     GlobalDone = 1L;
    136     fprintf(stderr,"Process Completed!\n");
    137     return;
    138 }
    139 
    140 static void print_req_callback(XETC *tc, XETrapDatum *data, BYTE *my_buf)
    141 {
    142     char *req_type;
    143     req_type = (data->u.req.reqType == XETrapGetExtOpcode(tc) ? "XTrap" :
    144         XERequestIDToString(data->u.req.reqType,tc));
    145     fprintf(ofp,"Request: %-19s (%d): length '%ld' client '%d' window=%ld\n",
    146         req_type, data->u.req.reqType, (long)data->hdr.count, data->hdr.client,
    147         (long)data->u.req.id);
    148 }
    149 
    150 static void print_evt_callback(XETC *tc, XETrapDatum *data, BYTE *my_buf)
    151 {
    152     static Time last_time = 0;
    153     int delta;
    154 
    155     delta = imaxabs((int)last_time ? (intmax_t)data->u.event.u.keyButtonPointer.time -
    156         (int)last_time  : (int)last_time);
    157     last_time = data->u.event.u.keyButtonPointer.time;
    158 
    159     /* The "screen" and "root" fields aren't valid until "event"
    160      * vectoring becomes a reality.  Currently, XTrap intercepts
    161      * the core events prior to when fields other than rootX, rootY,
    162      * type, detail, time, and state are filled in.  This will be
    163      * addressed in the next release of XTrap (3.2?).
    164      */
    165     fprintf(ofp,
    166         "Event: %-15s (%d):det=%d scr=%d (%d,%d) root=%d Msk=%d TS=%d\n",
    167         XEEventIDToString(data->u.event.u.u.type,tc), data->u.event.u.u.type,
    168         data->u.event.u.u.detail, data->hdr.screen, /* Not really valid yet */
    169         data->u.event.u.keyButtonPointer.rootX,
    170         data->u.event.u.keyButtonPointer.rootY,
    171         (int)data->u.event.u.keyButtonPointer.root, /* Not really valid yet */
    172         (int)data->u.event.u.keyButtonPointer.state,
    173         (int)delta);
    174     fflush(ofp);
    175 }
    176 static Boolean eventFlag = False;
    177 static Boolean verboseFlag = False;
    178 static Widget appW;
    179 static Display *dpy;
    180 
    181 int
    182 main(int argc, char *argv[])
    183 {
    184     XETrapGetAvailRep ret_avail;
    185     XETrapGetCurRep   ret_cur;
    186     XETC    *tc;
    187     ReqFlags     requests;
    188     EventFlags   events;
    189     XtAppContext app;
    190     char *tmp = NULL;
    191     INT16 ch;
    192     int *popterr;
    193     char **poptarg;
    194 #ifndef vms
    195     popterr = &opterr;
    196     poptarg = &optarg;
    197 #else
    198     popterr = XEgetopterr();
    199     poptarg = XEgetoptarg();
    200 #endif
    201 
    202     eventFlag = False;
    203     ofp = NULL;
    204     *popterr = 0; /* don't complain about -d (display) */
    205     while ((ch = getopt(argc, argv, "d:evf:")) != EOF)
    206     {
    207         switch(ch)
    208         {
    209             case 'e':
    210                 eventFlag = True;
    211                 break;
    212             case 'v':
    213                 verboseFlag = True;
    214                 break;
    215             case 'f':
    216                 if ((ofp = fopen(*poptarg,"wb")) == NULL)
    217                 {   /* can't open it */
    218                     fprintf(stderr,"%s: could not open output file '%s'!\n",
    219                         ProgName, *poptarg);
    220                 }
    221                 break;
    222             case 'd':   /* -display, let's let the toolkit parse it */
    223                 break;
    224             default:
    225                 break;
    226         }
    227     }
    228     ofp = (ofp ? ofp : stdout);
    229 
    230     appW = XtAppInitialize(&app,"XTrap",optionTable,(Cardinal)2L,
    231         (int *)&argc, (String *)argv, (String *)NULL,(ArgList)&tmp,
    232         0);
    233 
    234     dpy = XtDisplay(appW);
    235 #ifdef DEBUG
    236     XSynchronize(dpy, True);
    237 #endif
    238     fprintf(stderr,"Display:  %s \n", DisplayString(dpy));
    239     if ((tc = XECreateTC(dpy,0L, NULL)) == NULL)
    240     {
    241         fprintf(stderr,"%s: could not initialize XTrap extension\n",ProgName);
    242         exit (1L);
    243     }
    244     XETrapSetTimestamps(tc,True, False);
    245     (void)XEGetAvailableRequest(tc,&ret_avail);
    246     XEPrintAvail(stderr,&ret_avail);
    247     XEPrintTkFlags(stderr,tc);
    248 
    249     /* Need to prime events/requests initially turning all off  */
    250     (void)memset(requests,0L,sizeof(requests));
    251     (void)memset(events,0L,sizeof(events));
    252     /* Now turn on the ones you really want */
    253     (void)memset(events,0xFFL,XETrapMaxEvent);
    254     if (eventFlag == False)
    255     {   /* doesn't want just events */
    256         (void)memset(requests,0xFFL,XETrapMaxRequest);
    257         /* Turn off XTrap Requests for multi-client regression tests & XLib */
    258         BitFalse(requests, XETrapGetExtOpcode(tc));
    259         /* Turn off noisy events */
    260         BitFalse(events, MotionNotify);
    261     }
    262     if (verboseFlag == True)
    263     {   /* want's *all* requests/events */
    264         (void)memset(requests,0xFFL,XETrapMaxRequest);
    265         (void)memset(events,0xFFL,XETrapMaxEvent);
    266     }
    267     /* Tell the TC about it */
    268     XETrapSetRequests(tc, True, requests);
    269     XETrapSetEvents(tc, True, events);
    270     XETrapSetMaxPacket(tc, True, XETrapMinPktSize); /* just get the minimum */
    271 
    272     /* Set up callbacks for data */
    273     XEAddRequestCBs(tc, requests, print_req_callback, NULL);
    274     XEAddEventCBs(tc, events, print_evt_callback, NULL);
    275 
    276     (void)XEStartTrapRequest(tc);
    277     (void)XEGetCurrentRequest(tc,&ret_cur);
    278     XEPrintCurrent(stderr,&ret_cur);
    279 
    280     /* Add signal handlers so that we clean up properly */
    281     _InitExceptionHandling(SetGlobalDone);
    282     (void)XEEnableCtrlKeys(SetGlobalDone);
    283 
    284     XETrapAppWhileLoop(app,tc,&GlobalDone);
    285 
    286     /* Make sure <CTRL> key is released */
    287     XESimulateXEventRequest(tc, KeyRelease,
    288         XKeysymToKeycode(dpy, XK_Control_L), 0L, 0L, 0L);
    289 
    290     /* close down everything nicely */
    291     XEFreeTC(tc);
    292     (void)XCloseDisplay(dpy);
    293     (void)XEClearCtrlKeys();
    294     _ClearExceptionHandling();
    295     exit(0L);
    296 }
    297 
    298