X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fvidwhacker;h=bf6186e5ea3afe751b61f23eba5ff110c8c61a97;hb=e4fa2ac140f7bc56571373a7b7eb585fa4500e38;hp=dbe6e327348fa027d5565d681997737571afa6b7;hpb=a1d41b2aa6e18bf9a49b914a99dda8232c5d7762;p=xscreensaver diff --git a/hacks/vidwhacker b/hacks/vidwhacker index dbe6e327..bf6186e5 100755 --- a/hacks/vidwhacker +++ b/hacks/vidwhacker @@ -1,5 +1,5 @@ #!/usr/bin/perl -w -# vidwhacker, for xscreensaver. Copyright (c) 1998-2001 Jamie Zawinski. +# vidwhacker, for xscreensaver. Copyright (c) 1998-2003 Jamie Zawinski. # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that @@ -21,7 +21,7 @@ use diagnostics; use strict; my $progname = $0; $progname =~ s@.*/@@g; -my $version = q{ $Revision: 1.18 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/; +my $version = q{ $Revision: 1.24 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/; my $verbose = 0; my $use_stdin = 0; @@ -44,16 +44,21 @@ my $screen_width = -1; # If you add other programs to this list, please let me know! # my @displayer_programs = ( - "xv -root -quit -viewonly -maxpect -noresetroot -quick24 -rmode 5" . - " -rfg black -rbg black", - "xli -quiet -fullscreen -onroot -center -border black", - "xloadimage -quiet -fullscreen -onroot -center -border black", - "chbg -once -xscreensaver -max_grow 4", + "xscreensaver-getimage -root -file", +# "xv -root -quit -viewonly -maxpect -noresetroot -quick24 -rmode 5" . +# " -rfg black -rbg black", +# "xli -quiet -fullscreen -onroot -center -border black", +# "xloadimage -quiet -fullscreen -onroot -center -border black", +# "chbg -once -xscreensaver -max_grow 4", # this lame program wasn't built with vroot.h: # "xsri -scale -keep-aspect -center-horizontal -center-vertical", ); +# apparently some versions of netpbm call it "pamoil" instead of "pgmoil"... +# +my $pgmoil = (which("pamoil") ? "pamoil" : "pgmoil"); + # List of interesting PPM filter pipelines. # In this list, the following magic words may be used: @@ -68,7 +73,7 @@ my @displayer_programs = ( my @filters = ( "ppmtopgm FILE1 | pgmedge | pgmtoppm COLORS | ppmnorm", "ppmtopgm FILE1 | pgmenhance | pgmtoppm COLORS", - "ppmtopgm FILE1 | pgmoil | pgmtoppm COLORS", + "ppmtopgm FILE1 | $pgmoil | pgmtoppm COLORS", "ppmtopgm FILE1 | pgmbentley | pgmtoppm COLORS", "ppmrelief FILE1 | ppmtopgm | pgmedge | ppmrelief | ppmtopgm |" . @@ -110,7 +115,7 @@ my @filters = ( " pnmflip -tb FILE3 | ppmnorm > FILE2 ; " . " pnmarith -multiply FILE1 FILE2", - "ppmshift 30 FILE1 | ppmtopgm | pgmoil | pgmedge | " . + "ppmshift 30 FILE1 | ppmtopgm | $pgmoil | pgmedge | " . " pgmtoppm COLORS > FILE2 ; " . " pnmarith -difference FILE1 FILE2", @@ -134,6 +139,32 @@ sub error { exit 1; } +# Any files on this list will be deleted at exit. +# +my @all_tmpfiles = (); + +sub signal_cleanup { + unlink @all_tmpfiles; +} + +sub init_signals { + + $SIG{HUP} = \&signal_cleanup; + $SIG{INT} = \&signal_cleanup; + $SIG{QUIT} = \&signal_cleanup; + $SIG{ABRT} = \&signal_cleanup; + $SIG{KILL} = \&signal_cleanup; + $SIG{TERM} = \&signal_cleanup; + + # Need this so that if giftopnm dies, we don't die. + $SIG{PIPE} = 'IGNORE'; +} + +END { signal_cleanup(); } + + + + # #### Lifted from driver/xscreensaver-getimage-file # sub pick_displayer { @@ -157,6 +188,19 @@ sub pick_displayer { } +# returns the full path of the named program, or undef. +# +sub which { + my ($prog) = @_; + foreach (split (/:/, $ENV{PATH})) { + if (-x "$_/$prog") { + return $prog; + } + } + return undef; +} + + # Choose random foreground and background colors # sub randcolors { @@ -170,6 +214,7 @@ sub randcolors { } + sub filter_subst { my ($filter, $width, $height, @tmpfiles) = @_; my $colors = randcolors(); @@ -201,8 +246,12 @@ sub frob_ppm { my $tmpdir = $ENV{TMPDIR}; $tmpdir = "/tmp" unless $tmpdir; - my $fn = sprintf("$tmpdir/vw.%04x", $$); - my @files = ( "$fn", "$fn.1", "$fn.2", "$fn.3" ); + my $fn = sprintf ("%s/vidwhacker-0-%08x", $tmpdir, rand(0xFFFFFFFF)); + my $fn1 = sprintf ("%s/vidwhacker-1-%08x", $tmpdir, rand(0xFFFFFFFF)); + my $fn2 = sprintf ("%s/vidwhacker-2-%08x", $tmpdir, rand(0xFFFFFFFF)); + my $fn3 = sprintf ("%s/vidwhacker-3-%08x", $tmpdir, rand(0xFFFFFFFF)); + my @files = ( "$fn", "$fn1", "$fn2", "$fn3" ); + push @all_tmpfiles, @files; my $n = int(rand($#filters+1)); my $filter = $filters[$n]; @@ -315,7 +364,7 @@ sub get_ppm { if ($do_file_p) { - print STDERR "$progname: running \"$cmd\"\n" if ($verbose > 1); + print STDERR "$progname: running: $cmd\n" if ($verbose > 1); my $fn = `$cmd`; $fn =~ s/\n$//s; error "didn't get a file?" if ($fn eq ""); @@ -324,17 +373,22 @@ sub get_ppm { if ($fn =~ m/\.gif/i) { $cmd = "giftopnm < \"$fn\""; } elsif ($fn =~ m/\.jpe?g/i) { $cmd = "djpeg < \"$fn\""; } + elsif ($fn =~ m/\.png/i) { $cmd = "pngtopnm < \"$fn\""; } + elsif ($fn =~ m/\.xpm/i) { $cmd = "xpmtoppm < \"$fn\""; } + elsif ($fn =~ m/\.bmp/i) { $cmd = "bmptoppm < \"$fn\""; } + elsif ($fn =~ m/\.tiff?/i) { $cmd = "tifftopnm < \"$fn\""; } + elsif ($fn =~ m/\.p[bgp]m/i) { return `cat \"$fn\"`; } else { error "unrecognized file extension on $fn"; } - print STDERR "$progname: converting with \"$cmd\"\n" if ($verbose > 1); + print STDERR "$progname: converting with: $cmd\n" if ($verbose > 1); $cmd .= " 2>/dev/null" unless ($verbose > 1); $ppm = `$cmd`; } else { - print STDERR "$progname: running \"$cmd\"\n" if ($verbose > 1); + print STDERR "$progname: running: $cmd\n" if ($verbose > 1); $ppm = `$cmd`; error "no data?" if ($ppm eq ""); error "not a PPM file" unless ($ppm =~ m/^P\d\n/s); @@ -366,9 +420,10 @@ sub dispose_ppm { my $tmpdir = $ENV{TMPDIR}; $tmpdir = "/tmp" unless $tmpdir; - my $fn = sprintf("$tmpdir/vw.%04x", $$); + my $fn = sprintf ("%s/vidwhacker-%08x", $tmpdir, rand(0xFFFFFFFF)); local *OUT; unlink $fn; + push @all_tmpfiles, $fn; open (OUT, ">$fn") || error "writing $fn: $!"; print OUT $ppm; close OUT; @@ -394,7 +449,14 @@ sub vidwhack { } $ppm = $stdin_ppm; } else { - $ppm = get_ppm(); + my $max_err_count = 20; + my $err_count = 0; + while (!defined($ppm)) { + $ppm = get_ppm(); + $err_count++ if (!defined ($ppm)); + error ("too many errors, too few images!") + if ($err_count > $max_err_count); + } } $ppm = frob_ppm ($ppm); @@ -433,6 +495,8 @@ sub main { else { usage; } } + init_signals(); + read_config; if (!$use_stdout) {