This patch seems to do the job. Firstly we listen for destroy events.
However, since window destruction is asynchronous with other clients, we
may receive a BadWindow (or BadMatch, due to id reuse) error while
reporting a property change. So secondly we catch these errors.
Possibly we should print a new-line before exiting in this case, since
the error received when we have generated partial output for a property
change.
Ben.
diff -Nru x11-utils.orig/xprop/xprop.c x11-utils/xprop/xprop.c
--- x11-utils.orig/xprop/xprop.c
+++ x11-utils/xprop/xprop.c
@@ -1596,6 +1596,18 @@
static int spy = 0;
+static int (*old_error_handler)(Display *dpy, XErrorEvent *ev);
+
+static int spy_error_handler(Display *dpy, XErrorEvent *ev)
+{
+ if (ev->error_code == BadWindow || ev->error_code == BadMatch) {
+ /* Window was destroyed */
+ exit(0);
+ }
+
+ return old_error_handler(dpy, ev);
+}
+
int
main (int argc, char **argv)
{
@@ -1738,9 +1750,14 @@
XEvent event;
const char *format, *dformat;
- XSelectInput(dpy, target_win, PropertyChangeMask);
+ XSelectInput(dpy, target_win, PropertyChangeMask | StructureNotifyMask);
+ old_error_handler = XSetErrorHandler(spy_error_handler);
for (;;) {
XNextEvent(dpy, &event);
+ if (event.type == DestroyNotify)
+ break;
+ if (event.type != PropertyNotify)
+ continue;
format = dformat = NULL;
if (props) {
int i;
--- END ---
--
Ben Hutchings
All the simple programs have been written, and all the good names taken.
Attachment:
signature.asc
Description: This is a digitally signed message part