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 >
Wrap
C/C++ Source or Header
|
1994-01-14
|
4KB
|
142 lines
/* $Id: dispatch.c 1.2 1994/01/15 02:14:48 ulrich Exp $ */
/*
* dispatch.c
*
* Event dispatch functions.
*/
#include "Xlibemu.h"
extern long _Xevent_to_mask[];
Window
_WFindEventWindow (Display *dpy, Window w, long event_mask)
{
int i = ConnectionNumber (dpy);
for (; w != None; w = w->parent) {
if (w->event_masks[i] & event_mask)
return w;
if (w->do_not_propagate_mask & event_mask)
break;
}
return None;
}
int
_WPropagateEvent (XEvent *ev, Window pointer_window)
{
int i, done;
Display *dpy;
Window event_window, root_window;
for (i = done = 0; i < MAX_CONN && done == 0; i++) {
/* note: i == ConnectionNumber(dpy) */
if ((dpy = _ConnTable[i]) == NULL) continue;
root_window = DefaultRootWindow (dpy);
switch (ev->type) {
case KeyPress:
event_window =
_WFindEventWindow (dpy, pointer_window, KeyPressMask);
if (event_window) {
ev->xkey.display = dpy;
ev->xkey.window = event_window;
ev->xkey.root = root_window;
ev->xkey.subwindow = (event_window != pointer_window) ? pointer_window : None;
ev->xkey.x = ev->xkey.x_root - event_window->window_port.x1;
ev->xkey.y = ev->xkey.y_root - event_window->window_port.y1;
_XEnq (dpy, ev);
}
break;
case KeyRelease:
break;
case ButtonPress:
event_window =
_WFindEventWindow (dpy, pointer_window, ButtonPressMask);
if (event_window) {
ev->xbutton.display = dpy;
ev->xbutton.window = event_window;
ev->xbutton.root = root_window;
ev->xbutton.subwindow = (event_window != pointer_window) ? pointer_window : None;
ev->xbutton.x = ev->xbutton.x_root - event_window->window_port.x1;
ev->xbutton.y = ev->xbutton.y_root - event_window->window_port.y1;
_XEnq (dpy, ev);
}
break;
case ButtonRelease:
event_window =
_WFindEventWindow (dpy, pointer_window, ButtonReleaseMask);
if (event_window) {
ev->xbutton.display = dpy;
ev->xbutton.window = event_window;
ev->xbutton.root = root_window;
ev->xbutton.subwindow = (event_window != pointer_window) ? pointer_window : None;
ev->xbutton.x = ev->xbutton.x_root - event_window->window_port.x1;
ev->xbutton.y = ev->xbutton.y_root - event_window->window_port.y1;
_XEnq (dpy, ev);
}
break;
case MotionNotify:
event_window =
_WFindEventWindow (dpy, pointer_window,
_Xevent_to_mask[MotionNotify]);
if (event_window) {
ev->xbutton.display = dpy;
ev->xbutton.window = event_window;
ev->xbutton.root = root_window;
ev->xbutton.subwindow = (event_window != pointer_window) ? pointer_window : None;
ev->xbutton.x = ev->xbutton.x_root - event_window->window_port.x1;
ev->xbutton.y = ev->xbutton.y_root - event_window->window_port.y1;
_XEnq (dpy, ev);
}
break;
}
}
return 0;
}
void
_WDispatchEvent (XEvent *ev)
{
int i, mask;
Window window;
mask = _Xevent_to_mask[ev->type];
window = ev->xany.window;
for (i = 0; i < MAX_CONN; i++) {
if (!(window->event_masks[i] & mask)) continue;
ev->xany.display = _ConnTable[i];
_XEnq (_ConnTable[i], ev);
}
}
int
_WRedirectEvent (Display *dpy, XEvent *ev)
{
int i, redirected, mask;
Window window;
Display *client;
mask = _Xevent_to_mask[ev->type];
window = ev->xany.window;
redirected = False;
for (i = 0; i < MAX_CONN; i++) {
if (!(window->event_masks[i] & mask)) continue;
client = _ConnTable[i];
if (dpy == client) continue;
redirected = True;
ev->xany.display = client;
_XEnq (client, ev);
}
return redirected;
}