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; }