bjaspan@athena.mit.edu (Barr3y Jaspan) (07/09/90)
I wrote a small program that takes a list of window ids and forwards all the
events it receives to each window on the list using XSendEvent. I know the
program works because if I run two copies, I can send events from one to the
other and everything happens correctly. However, I have been unable to get any
other program to recognize the resent events. This article is
specifically about
getting X Toolkit programs to accept the events.
I wrote a simple X Toolkit application that creates a single button, and then I
ran it under Saber-C tracing _XtwaitForSomething. Sure enough, the
program runs
until it hits the select() and waits for something to happen. If I move the
cursor into the button, select() returns and the program goes merrily on it's
way. When I send events to the window with my program, however, *select never
returns*. The events are simply not getting sent to the client. I have
run the
test under twm and uwm (to see if the reason had to do with reparenting).
I thought the only was to ignore artifical events was to check the send_event
field and ignore the event if it was set, but obivously this is not the case.
What am I missing? The source code for my event-duplicating program (which I
call xfork) is below.
Barr3y Jaspan
Student Information Processing Board (SIPB)
---- snip snip ----
#include <stdio.h>
#include <X11/Xlib.h>
main(argc, argv)
int argc;
char **argv;
{
Display *dpy;
Window window;
Window wins[100];
int num_wins, i;
XEvent event;
argc -= 1;
num_wins = 0;
while (argc > 0) {
wins[num_wins] = atoi(argv[num_wins+1]);
printf("wins[%d] = %d\n", num_wins, wins[num_wins]);
num_wins += 1;
argc -= 1;
}
dpy = XOpenDisplay(NULL);
window =
XCreateSimpleWindow(dpy,
RootWindow(dpy, DefaultScreen(dpy)),
0, 0,
100, 100,
2,
WhitePixel(dpy, DefaultScreen(dpy)),
BlackPixel(dpy, DefaultScreen(dpy)));
XSelectInput(dpy, window, 0xffffff);
XMapWindow(dpy, window);
while (1) {
XNextEvent(dpy, &event);
if (event.type == Expose) break;
}
printf("got expose\n");
while (1) {
XNextEvent(dpy, &event);
printf("got event\n");
printf("forwarding\n");
for (i=0; i < num_wins; i++)
printf("%d\n", XSendEvent(dpy, wins[i], False,
0xffffff, &event));
}
/* NOTREACHED */
return 0;
}