-#print STDERR "[[[[\n$ppm\n]]]]";
-
- my $icon= pipeval($ppm,
-# "pnmscale -xysize 78 $h",
- 'pgmtopbm -threshold',
- 'pnminvert',
- 'pbmtoascii');
-
- return ("$ctx",$str,$entry, '',$w,$icon);
-}
-
-#---------- useful stuff ----------
-
-sub pipeval ($@) {
- my ($val, @cmds) = @_;
- my (@pids);
-
- my $lastpipe;
-
- foreach my $cmd ('',@cmds) {
- my $pipe= new IO::Pipe or die $!;
- my $pid= fork(); defined $pid or die $!;
-
- if (!$pid) {
- $pipe->writer();
- if (!$lastpipe) {
- print $pipe $val or die $!;
- exit 0;
- } else {
- open STDIN, '<&', $lastpipe or die $!;
- open STDOUT, '>&', $pipe or die $!;
- close $lastpipe or die $!;
- close $pipe or die $!;
- exec $cmd; die $!;
- }
- }
- $pipe->reader();
- if ($lastpipe) { close $lastpipe or die $!; }
- $lastpipe= $pipe;
- push @pids, $pid;
- }
-
- $!=0; { local ($/)=undef; $val= <$lastpipe>; }
- defined $val or die $!;
- $lastpipe->error and die $!; close $lastpipe or die $!;
-
- foreach my $cmd ('(paste)', @cmds) {
- my $pid= shift @pids;
- waitpid($pid,0) == $pid or die "$pid $? $!";
- $?==0 or $?==13 or die "$cmd $?";
- }
- return $val;