X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?p=xscreensaver;a=blobdiff_plain;f=hacks%2Fvidwhacker;h=d958c5623c7eddfbf533cbc6f0339360ce4aa0db;hp=f243156256e1a7c59bfbe91e22070db219164f59;hb=ffd8c0873576a9e3065696a624dce6b766b77062;hpb=bbd0773f2adde4927a6196361d4061e70bf48cd9 diff --git a/hacks/vidwhacker b/hacks/vidwhacker index f2431562..d958c562 100755 --- a/hacks/vidwhacker +++ b/hacks/vidwhacker @@ -1,5 +1,5 @@ #!/usr/bin/perl -w -# vidwhacker, for xscreensaver. Copyright (c) 1998-2003 Jamie Zawinski. +# vidwhacker, for xscreensaver. Copyright (c) 1998-2004 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.22 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/; +my $version = q{ $Revision: 1.25 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/; my $verbose = 0; my $use_stdin = 0; @@ -33,28 +33,9 @@ my $imagedir; my $screen_width = -1; +my $displayer = "xscreensaver-getimage -root -file"; -# #### This list was lifted from driver/xscreensaver-getimage-file -# -# These are programs that can be used to put an image file on the root -# window (including virtual root windows.) The first one of these programs -# that exists on $PATH will be used (with the file name as the last arg.) -# -# If you add other programs to this list, please let me know! -# -my @displayer_programs = ( - "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"); @@ -139,28 +120,38 @@ sub error { exit 1; } -# #### Lifted from driver/xscreensaver-getimage-file +# Any files on this list will be deleted at exit. # -sub pick_displayer { - my @names = (); - - foreach my $cmd (@displayer_programs) { - $_ = $cmd; - my ($name) = m/^([^ ]+)/; - push @names, "\"$name\""; - print STDERR "$progname: looking for $name...\n" if ($verbose > 2); - foreach my $dir (split (/:/, $ENV{PATH})) { - print STDERR "$progname: checking $dir/$name\n" if ($verbose > 3); - return $cmd if (-x "$dir/$name"); - } - } +my @all_tmpfiles = (); + +sub exit_cleanup { + print STDERR "$progname: delete tmp files\n" if ($verbose); + unlink @all_tmpfiles; +} - $names[$#names] = "or " . $names[$#names]; - printf STDERR "$progname: none of: " . join (", ", @names) . - " were found on \$PATH.\n"; +sub signal_cleanup { + my ($sig) = @_; + print STDERR "$progname: caught SIG$sig\n" if ($verbose); exit 1; } +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 { exit_cleanup(); } + + + # returns the full path of the named program, or undef. # @@ -188,6 +179,7 @@ sub randcolors { } + sub filter_subst { my ($filter, $width, $height, @tmpfiles) = @_; my $colors = randcolors(); @@ -219,8 +211,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]; @@ -385,13 +381,12 @@ sub dispose_ppm { print $ppm; } else { - my $displayer = pick_displayer(); - 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; @@ -402,7 +397,15 @@ sub dispose_ppm { if ($verbose); system (@cmd); + my $exit_value = $? >> 8; + my $signal_num = $? & 127; + my $dumped_core = $? & 128; + unlink $fn; + + error ("$cmd[0]: core dumped!") if ($dumped_core); + error ("$cmd[0]: signal $signal_num!") if ($signal_num); + error ("$cmd[0]: exited with $exit_value!") if ($exit_value); } } @@ -437,9 +440,10 @@ sub usage { print STDERR "VidWhacker, Copyright (c) 2001 Jamie Zawinski \n"; print STDERR " http://www.jwz.org/xscreensaver/"; print STDERR "\n"; - print STDERR "usage: $0 [-display dpy] [-verbose] [-root | -window]\n"; - print STDERR " [-stdin] [-stdout] [-delay secs]\n"; - print STDERR " [-directory image_directory]\n"; + print STDERR "usage: $0 [-display dpy] [-verbose]\n"; + print STDERR "\t\t[-root | -window | -window-id 0xXXXXX ]\n"; + print STDERR "\t\t[-stdin] [-stdout] [-delay secs]\n"; + print STDERR "\t\t[-directory image_directory]\n"; exit 1; } @@ -454,6 +458,13 @@ sub main { elsif (m/^--?delay$/) { $delay = shift @ARGV; } elsif (m/^--?dir(ectory)?$/) { $imagedir = shift @ARGV; } elsif (m/^--?root$/) { } + elsif (m/^--?window-id$/) { + my $id = shift @ARGV; + error ("unparsable window id: $id") + unless ($id =~ m/^\d+$|^0x[\da-f]+$/i); + $displayer =~ s/--?root\b/$id/ || + error ("unable to munge displayer: $displayer"); + } elsif (m/^--?window$/) { print STDERR "$progname: sorry, \"-window\" is unimplemented.\n"; print STDERR "$progname: use \"-stdout\" and pipe to a displayer.\n"; @@ -463,6 +474,8 @@ sub main { else { usage; } } + init_signals(); + read_config; if (!$use_stdout) {