home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / x / xtrapv33.zip / extensions / lib / xtrap / XETrapInit.c < prev    next >
C/C++ Source or Header  |  1992-09-14  |  8KB  |  241 lines

  1. /*****************************************************************************
  2. Copyright 1987, 1988, 1989, 1990, 1991, 1992 by Digital Equipment Corp., 
  3. Maynard, MA
  4.  
  5. Permission to use, copy, modify, and distribute this software and its 
  6. documentation for any purpose and without fee is hereby granted, 
  7. provided that the above copyright notice appear in all copies and that
  8. both that copyright notice and this permission notice appear in 
  9. supporting documentation, and that the name of Digital not be
  10. used in advertising or publicity pertaining to distribution of the
  11. software without specific, written prior permission.  
  12.  
  13. DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
  14. ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
  15. DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
  16. ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  17. WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
  18. ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  19. SOFTWARE.
  20.  
  21. *****************************************************************************/
  22. #define NEED_EVENTS
  23. #define NEED_REPLIES
  24.  
  25. #include <stdio.h>
  26. #include "xtraplib.h"
  27. #include "xtraplibp.h"
  28. #include "Xext.h"
  29. #include "extutil.h"
  30.  
  31. #ifdef UWS40
  32. #define _XSetLastRequestRead _SetLastRequestRead
  33. #endif
  34. #ifndef vms
  35. extern unsigned long _XSetLastRequestRead();
  36. #else
  37. static unsigned long _XSetLastRequestRead();
  38. #endif
  39.  
  40. static XExtensionInfo *xtrap_info = NULL;
  41. static /* const */ char *xtrap_extension_name = XTrapExtName;
  42.  
  43. #define XTrapCheckExtension(dpy,i,val) \
  44.     XextCheckExtension(dpy, i, xtrap_extension_name, val)
  45. #define XTrapSimpleCheckExtension(dpy,i) \
  46.     XextSimpleCheckExtension(dpy, i, xtrap_extension_name)
  47.  
  48. static int close_display();
  49. static Bool wire_to_event();
  50. static Status event_to_wire();
  51. #ifdef X11R3
  52. static int error_string();
  53. #else
  54. static char *error_string();
  55. #endif
  56. static /* const */ XExtensionHooks xtrap_extension_hooks = {
  57.     NULL,                               /* create_gc */
  58.     NULL,                               /* copy_gc */
  59.     NULL,                               /* flush_gc */
  60.     NULL,                               /* free_gc */
  61.     NULL,                               /* create_font */
  62.     NULL,                               /* free_font */
  63.     close_display,                      /* close_display */
  64.     wire_to_event,                      /* wire_to_event */
  65.     event_to_wire,                      /* event_to_wire */
  66.     NULL,                               /* error */
  67.     error_string                        /* error_string */
  68. };
  69.  
  70. static /* const */ char *xtrap_error_list[] = {
  71.     "BadTransport (I/O transport not available)",
  72.     "BadMailbox (Cannot connect/disconnect to mailbox)",
  73.     "BadIO (I/O error while reading/writing in extension)",
  74.     "BadHostname (Cannot locate requested host)",
  75.     "BadStatistics (Statistics not configured/available)",
  76.     "BadDevices (Devices not properly vectored)",
  77.     "BadSocket (Cannot connect to INTERNET socket)",
  78.     "BadScreen (Cannot send event to given screen)",
  79.     "BadSwapReq (Cannot trap extension requests for swapped client)",
  80. };
  81.  
  82. static XEXT_GENERATE_FIND_DISPLAY (find_display, xtrap_info,
  83.                                    xtrap_extension_name,
  84.                                    &xtrap_extension_hooks,
  85.                                    XETrapNumberEvents, NULL)
  86.  
  87. static XEXT_GENERATE_CLOSE_DISPLAY (close_display, xtrap_info)
  88.  
  89. static XEXT_GENERATE_ERROR_STRING (error_string, xtrap_extension_name,
  90.                                    XETrapNumErrors, xtrap_error_list)
  91.  
  92. #ifdef FUNCTION_PROTOS
  93. static Bool event_to_wire(Display *dpy, XEvent *libevent, xEvent *netevent)
  94. #else
  95. static Bool event_to_wire(dpy,libevent,netevent)
  96.     Display *dpy;
  97.     XEvent *libevent;
  98.     xEvent *netevent;
  99. #endif
  100. {
  101.     Bool status = False;
  102.     XExtDisplayInfo *info = find_display(dpy);
  103.  
  104.     XTrapCheckExtension(dpy,info,False);
  105.  
  106.     /* If we had more then one event */
  107. #if XETrapNumberErrors > 1
  108.     switch((netevent->u.u.type & 0x7f) - info->codes->first_event)
  109.     {   case XETrapData:
  110. #endif
  111.         {
  112.             XETrapDataEvent *ev    = (XETrapDataEvent *) libevent;
  113.             xETrapDataEvent *event = (xETrapDataEvent *) netevent;
  114.  
  115.             event->type           = ev->type;
  116.             event->detail         = ev->detail;
  117.             event->sequenceNumber = (ev->serial & 0xFFFF);
  118.             event->idx            = ev->idx;
  119.             (void)memcpy(event->data,ev->data,sizeof(event->data));
  120.             status = True;
  121.         }
  122. #if XETrapNumberErrors > 1
  123.     }
  124. #endif
  125.     return(status);
  126. }
  127.  
  128. #ifdef FUNCTION_PROTOS
  129. static Bool wire_to_event(Display *dpy, XEvent *libevent, xEvent *netevent)
  130. #else
  131. static Bool wire_to_event(dpy,libevent,netevent)
  132.     Display *dpy;
  133.     XEvent *libevent;
  134.     xEvent *netevent;
  135. #endif
  136. {
  137.     Bool status = False;
  138.     XExtDisplayInfo *info = find_display(dpy);
  139.  
  140.     XTrapCheckExtension(dpy,info,False);
  141.  
  142.     /* If we had more then one event */
  143. #if XETrapNumberErrors > 1
  144.     switch((netevent->u.u.type & 0x7f) - info->codes->first_event)
  145.     {   case XETrapData:
  146. #endif
  147.         {
  148.             XETrapDataEvent *ev    = (XETrapDataEvent *) libevent;
  149.             xETrapDataEvent *event = (xETrapDataEvent *) netevent;
  150.  
  151.             ev->type      = event->type & 0x7F;
  152.             ev->detail    = event->detail;
  153.             ev->serial    = _XSetLastRequestRead(dpy,(xGenericReply *)netevent);
  154.             ev->synthetic = ((event->type & 0x80) != 0);
  155.             ev->display   = dpy;
  156.             ev->idx       = event->idx;
  157.             (void)memcpy(ev->data,event->data,sizeof(ev->data));
  158.             status = True;
  159.         }
  160. #if XETrapNumberErrors > 1
  161.     }
  162. #endif
  163.     return(status);
  164. }
  165.  
  166. /*
  167.  * XETrapQueryExtension -
  168.  *      Returns True if the DEC-XTRAP extension is available
  169.  *      on the given display.  If the extension exists, the value of the
  170.  *      first event code is stored into event_base and the value of the first
  171.  *      error code is stored into error_base.
  172.  */
  173. #ifdef FUNCTION_PROTOS
  174. Bool XETrapQueryExtension(Display *dpy,INT32 *event_base_return,
  175.     INT32 *error_base_return, INT32 *opcode_return)
  176. #else
  177. Bool XETrapQueryExtension(dpy,event_base_return,error_base_return,opcode_return)
  178.     Display *dpy;
  179.     INT32 *event_base_return;
  180.     INT32 *error_base_return;
  181.     INT32 *opcode_return;
  182. #endif
  183. {
  184.     Bool status = True;
  185.     XExtDisplayInfo *info = find_display (dpy);
  186.  
  187.     if (XextHasExtension (info))
  188.     {
  189.         *event_base_return = (INT32)(info->codes->first_event);
  190.         *error_base_return = (INT32)(info->codes->first_error);
  191.     *opcode_return     = (INT32)(info->codes->major_opcode);
  192.     }
  193.     else
  194.     {
  195.         status = False;
  196.     }
  197.     return(status);
  198. }
  199.  
  200. #ifdef vms
  201. /* Hard-coded since this didn't make it into XLibShr's xfer vector */
  202. /* From [.XLIBEL.SRC]XLibInt.c in VMS Source Pool */
  203. #ifdef FUNCTION_PROTOS
  204. unsigned long _XSetLastRequestRead(Display *dpy, xGenericReply *rep)
  205. #else
  206. unsigned long _XSetLastRequestRead(dpy, rep)
  207.     register Display *dpy;
  208.     register xGenericReply *rep;
  209. #endif
  210. {
  211.     register unsigned long      newseq, lastseq;
  212.  
  213.     /*
  214.      * KeymapNotify has no sequence number, but is always guaranteed
  215.      * to immediately follow another event, except when generated via
  216.      * SendEvent (hmmm).
  217.      */
  218.     if ((rep->type & 0x7f) == KeymapNotify)
  219.         return(dpy->last_request_read);
  220.  
  221.     newseq = (dpy->last_request_read & ~((unsigned long)0xffff)) |
  222.              rep->sequenceNumber;
  223.     lastseq = dpy->last_request_read;
  224.     while (newseq < lastseq) {
  225.         newseq += 0x10000;
  226.         if (newseq > dpy->request) {
  227.             (void) fprintf (stderr,
  228.             "Xlib:  sequence lost (0x%lx > 0x%lx) in reply type 0x%x!\n",
  229.                                     newseq, dpy->request,
  230.                                    (unsigned int) rep->type);
  231.             newseq -= 0x10000;
  232.            break;
  233.         }
  234.     }
  235.  
  236.     dpy->last_request_read = newseq;
  237.     return(newseq);
  238. }
  239. #endif
  240.  
  241.