--- /dev/null
+#!/usr/bin/perl -w
+use strict (qw(vars));
+
+use IO::File;
+
+our @pipes;
+
+sub reap_pipe () {
+ my ($child, $pipe) = @{ shift @pipes };
+ { local ($/) = undef; $_= <$pipe>; }
+ if (m/^WM_NAME: +not found/) {
+ } elsif (m/^WM_NAME\(STRING\) = $/) {
+ } elsif (m/^WM_NAME\(STRING\) = \"(.*)\"$/) {
+ print "$child $1\n" or die $!;
+ } else {
+ die "$child $_ ?";
+ }
+ $!=0; $pipe->close(); $? and die "$? $! ?";
+}
+
+open WI, "LC_ALL=C xwininfo -root -children |" or die $!;
+while (<WI>) {
+ next unless m/^\s+\d+ children:/..0;
+ next unless m/^\s+(0x[0-9a-f]+) /;
+ my $child= $1;
+
+ my $pipe= new IO::File "LC_ALL=C xprop -id $child WM_NAME |" or die $!;
+ push @pipes, [ $child, $pipe ];
+
+ while (@pipes > 40) { reap_pipe(); }
+}
+$!=0; close WI; $? and die "$? $! ?";
+
+while (@pipes) { reap_pipe(); }
+
+close STDOUT or die $!;