home *** CD-ROM | disk | FTP | other *** search
/ PC Shareware 1999 March / PCShareware-3-99.iso / IMPLE / DJGPP.RAR / DJGPP2 / XLIB-SR0.ZIP / SRC / XLIBEMU / DISPATCH.C < prev    next >
C/C++ Source or Header  |  1994-01-14  |  4KB  |  142 lines

  1. /* $Id: dispatch.c 1.2 1994/01/15 02:14:48 ulrich Exp $ */
  2. /*
  3.  * dispatch.c
  4.  *
  5.  * Event dispatch functions.
  6.  */
  7.  
  8. #include "Xlibemu.h"
  9.  
  10. extern long _Xevent_to_mask[];
  11.  
  12. Window
  13. _WFindEventWindow (Display *dpy, Window w, long event_mask)
  14. {
  15.   int i = ConnectionNumber (dpy);
  16.  
  17.   for (; w != None; w = w->parent) {
  18.     if (w->event_masks[i] & event_mask)
  19.       return w;
  20.     if (w->do_not_propagate_mask & event_mask) 
  21.       break;
  22.   }
  23.   return None;
  24. }
  25.  
  26.  
  27. int
  28. _WPropagateEvent (XEvent *ev, Window pointer_window)
  29. {
  30.   int i, done;
  31.   Display *dpy;
  32.   Window event_window, root_window;
  33.  
  34.   for (i = done = 0; i < MAX_CONN && done == 0; i++) {
  35.  
  36.     /* note: i == ConnectionNumber(dpy) */
  37.     if ((dpy = _ConnTable[i]) == NULL) continue;
  38.  
  39.     root_window = DefaultRootWindow (dpy);
  40.  
  41.     switch (ev->type) {
  42.     case KeyPress:
  43.       event_window =
  44.     _WFindEventWindow (dpy, pointer_window, KeyPressMask);
  45.       if (event_window) {
  46.     ev->xkey.display = dpy;
  47.     ev->xkey.window = event_window;
  48.     ev->xkey.root = root_window;
  49.     ev->xkey.subwindow = (event_window != pointer_window) ? pointer_window : None;
  50.     ev->xkey.x = ev->xkey.x_root - event_window->window_port.x1;
  51.     ev->xkey.y = ev->xkey.y_root - event_window->window_port.y1;
  52.     _XEnq (dpy, ev);
  53.       }
  54.       break;
  55.     case KeyRelease:
  56.       break;
  57.     case ButtonPress:
  58.       event_window = 
  59.     _WFindEventWindow (dpy, pointer_window, ButtonPressMask);
  60.       if (event_window) {
  61.     ev->xbutton.display = dpy;
  62.     ev->xbutton.window = event_window;
  63.     ev->xbutton.root = root_window;
  64.     ev->xbutton.subwindow = (event_window != pointer_window) ? pointer_window : None;
  65.     ev->xbutton.x = ev->xbutton.x_root - event_window->window_port.x1;
  66.     ev->xbutton.y = ev->xbutton.y_root - event_window->window_port.y1;
  67.     _XEnq (dpy, ev);
  68.       }
  69.       break;
  70.     case ButtonRelease:
  71.       event_window =
  72.     _WFindEventWindow (dpy, pointer_window, ButtonReleaseMask);
  73.       if (event_window) {
  74.     ev->xbutton.display = dpy;
  75.     ev->xbutton.window = event_window;
  76.     ev->xbutton.root = root_window;
  77.            ev->xbutton.subwindow = (event_window != pointer_window) ? pointer_window : None;
  78.     ev->xbutton.x = ev->xbutton.x_root - event_window->window_port.x1;
  79.     ev->xbutton.y = ev->xbutton.y_root - event_window->window_port.y1;
  80.     _XEnq (dpy, ev);
  81.       }
  82.       break;
  83.     case MotionNotify:
  84.       event_window =
  85.     _WFindEventWindow (dpy, pointer_window,
  86.                _Xevent_to_mask[MotionNotify]);
  87.       if (event_window) {
  88.     ev->xbutton.display = dpy;
  89.     ev->xbutton.window = event_window;
  90.     ev->xbutton.root = root_window;
  91.            ev->xbutton.subwindow = (event_window != pointer_window) ? pointer_window : None;
  92.     ev->xbutton.x = ev->xbutton.x_root - event_window->window_port.x1;
  93.     ev->xbutton.y = ev->xbutton.y_root - event_window->window_port.y1;
  94.     _XEnq (dpy, ev);
  95.       }
  96.       break;
  97.     }
  98.   }
  99.   return 0;
  100. }
  101.  
  102. void
  103. _WDispatchEvent (XEvent *ev)
  104. {
  105.   int i, mask;
  106.   Window window;
  107.  
  108.   mask = _Xevent_to_mask[ev->type];
  109.   window = ev->xany.window;
  110.  
  111.   for (i = 0; i < MAX_CONN; i++) {
  112.     if (!(window->event_masks[i] & mask)) continue;
  113.  
  114.     ev->xany.display = _ConnTable[i];
  115.     _XEnq (_ConnTable[i], ev);
  116.   }
  117. }
  118.  
  119. int
  120. _WRedirectEvent (Display *dpy, XEvent *ev)
  121. {
  122.   int i, redirected, mask;
  123.   Window window;
  124.   Display *client;
  125.  
  126.   mask = _Xevent_to_mask[ev->type];
  127.   window = ev->xany.window;
  128.   redirected = False;
  129.  
  130.   for (i = 0; i < MAX_CONN; i++) {
  131.     if (!(window->event_masks[i] & mask)) continue;
  132.  
  133.     client = _ConnTable[i];
  134.     if (dpy == client) continue;
  135.  
  136.     redirected = True;
  137.     ev->xany.display = client;
  138.     _XEnq (client, ev);
  139.   }
  140.   return redirected;
  141. }
  142.