#!/usr/bin/perl =pod =head1 NAME $RCSfile: setbg,v $ Set background =head1 VERSION =over =item Author Andrew DeFaria =item Revision: $Revision: 1.10 $ =item Created: Fri Mar 18 01:14:38 PST 2005 =item Modified: $Date: 2012/11/09 15:31:30 $ =back =head1 SYNOPSIS Usage: setbg [-u|sage] [-ve|rbose] [-d|ebug] [-s|leep ] [-bgdir ] Where: -u|sage: Displays this usage -ve|rbose: Be verbose -d|ebug: Output debug messages -s|leep: Number of minutes to sleep between setting the background (Default: 1 hour) -b|gdir: Directory to scan for images (Default: /web/Pictures) =head1 DESCRIPTION This script sets the background image randomly based on images $imgDir. Note if this script is run again it senses that it was previously run and sends the previous script a SIGUSR2 which the script intrprets as "Change the background now", then exits. =cut use strict; use warnings; use FindBin; use Getopt::Long; use Proc::ProcessTable; use File::Spec; use CGI qw/:standard/; use lib "$FindBin::Bin/../lib"; use DateUtils; use Display; use Logger; use Utils; my $VERSION = '$Revision: 1.10 $'; ($VERSION) = ($VERSION =~ /\$Revision: (.*) /); my $processes = new Proc::ProcessTable; my @imgDirs; my %totals; foreach my $process (@{$processes->table}) { if ($process->cmndline =~ /setbg/ and $process->pid != $$) { kill 12, $process->pid; exit 0; } # if } # foreach sub displayStats () { my $statsFile = Logger->new( name => ".$FindBin::Script.stats", path => $ENV{HOME}, extension => '', ); $statsFile->log('At ' . localtime()); Stats \%totals, $statsFile; return; } # displayStats sub fillPictures () { my @images; foreach (@imgDirs) { my @pics = `find "$_" -type f -name "*.jpg"`; chomp @pics; push @images, @pics; } # foreach $totals{images} = scalar @images; displayStats; return @images; } # fillPictures sub updateSetBG ($) { my ($image) = @_; open my $log, '>', "$ENV{HOME}/.$FindBin::Script" or error "Unable to open $ENV{HOME}/.$FindBin::Script for writing - $!", 1; display $image, $log; close $log; open $log, '>>', "$ENV{HOME}/.$FindBin::Script.hist" or error "Unable to open $ENV{HOME}/.$FindBin::Script.hist for append - $!", 1; my $msg = localtime() . ":$image"; display $msg, $log; close $log; return; } # updateSetBG $0 = "$FindBin::Script " . join ' ', @ARGV; verbose "$FindBin::Script v$VERSION"; my $sleep = 60 * 60; GetOptions ( 'usage' => sub { Usage }, 'verbose' => sub { set_verbose }, 'debug' => sub { set_debug }, 'sleep=i' => \$sleep, 'bgdir=s' => \@imgDirs, ) || Usage; for (my $i = 0; $i < scalar @imgDirs; $i++) { error "$imgDirs[$i] is not a directory", 1 unless -d $imgDirs[$i]; $imgDirs[$i] = File::Spec->rel2abs ($imgDirs[$i]); } # foreach # Using gsettings my $setbg = "gsettings"; my $setbgOpts= "set org.gnome.desktop.background picture-uri \"file://"; my @images = fillPictures; Usage "No images to display. Must specify -bgdir" unless @images; sub SwitchWallPaper { # We don't need to do anything here, just handle the interrupt and # let the while loop continue. debug 'SwitchWallPaper: Interrupt received'; displayStats; } # SwitchWallPaper $SIG{USR2} = \&SwitchWallPaper; $SIG{USR1} = \&fillPictures; my $debugger = $DB::OUT; my $today; truncate "$ENV{HOME}/.$FindBin::Script.hist", 0; EnterDaemonMode unless defined $DB::OUT; while () { my $image = escapeHTML ($images[int (rand $#images)]); my $cmd = "$setbg $setbgOpts$image\" 2> /dev/null"; my @output = `$cmd`; if ($? != 0) { error "Trying to set background - command used \"$cmd\"\n\nOutput\n\n" . join "\n", @output; $totals{errors}++; } else { $totals{'Images displayed'}++; updateSetBG $image; } # if $today = YMD; sleep $sleep; if ($today ne YMD){ @images = fillPictures; } # if } # while