Merge branch 'master' of /opt/git/clearscm
[clearscm.git] / bin / setbg
index 777f632..09311f5 100755 (executable)
--- a/bin/setbg
+++ b/bin/setbg
@@ -57,9 +57,12 @@ 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 Utils;
 
@@ -67,6 +70,7 @@ my $VERSION  = '$Revision: 1.10 $';
   ($VERSION) = ($VERSION =~ /\$Revision: (.*) /);
 
 my $processes = new Proc::ProcessTable;
+my @imgDirs;
 
 foreach my $process (@{$processes->table}) {
   if ($process->cmndline =~ /setbg/ and
@@ -77,29 +81,47 @@ foreach my $process (@{$processes->table}) {
   } # if
 } # foreach
 
+sub fillPictures () {
+  my @images;
+  
+  foreach (@imgDirs) {
+    my @pics = `find "$_" -type f -name "*.jpg"`;
+    
+    chomp @pics;
+    push @images, @pics;
+  } # foreach
+
+  return @images;  
+} # fillPictures
+
 $0 = "$FindBin::Script " . join ' ', @ARGV;
 
 verbose "$FindBin::Script v$VERSION";
 
 my $sleep  = 60 * 60;
-my $imgDir = $ENV{SETBG_DIR} ? $ENV{SETBG_DIR} : '/web/Pictures';
 
 GetOptions (
-  'usage'              => sub { Usage },
-  'verbose'            => sub { set_verbose },
-  'debug'              => sub { set_debug },
-  'sleep=i'            => \$sleep,
-  'bgdir=s'            => \$imgDir,
+  'usage'   => sub { Usage },
+  'verbose' => sub { set_verbose },
+  'debug'   => sub { set_debug },
+  'sleep=i' => \$sleep,
+  'bgdir=s' => \@imgDirs,
 ) || Usage;
 
-error "$imgDir is not a directory", 1 unless -d $imgDir;
+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 $setbg          = "gsettings";
 my $setbgOpts  = "set org.gnome.desktop.background picture-uri \"file://";
 
-chomp (my @images = `find $imgDir -type f -name "*.jpg"`);
+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.
@@ -107,24 +129,38 @@ sub SwitchWallPaper {
 } # SwitchWallPaper
 
 $SIG{USR2} = \&SwitchWallPaper;
+$SIG{USR1} = \&fillPictures;
 
 my $debugger = $DB::OUT;
+my $today;
 
 EnterDaemonMode unless defined $DB::OUT;
 
 while () {
-  my $image = $images[int (rand $#images)];
+  my $image = escapeHTML ($images[int (rand $#images)]);
 
   open my $log, '>', "$ENV{HOME}/.$FindBin::Script"
-    or error "Unable to open $ENV{HOME}/.setbg for writing - $!", 1;
+    or error "Unable to open $ENV{HOME}/.$FindBin::Script for writing - $!", 1;
 
-  display "Current background: $image", $log;
+  display $image, $log;
 
   my $cmd = "$setbg $setbgOpts$image\" 2> /dev/null";
 
-  `$cmd`;
+  my @output = `$cmd`;
 
+  if ($? != 0) {
+    display "ERROR Trying to set background - command used \"$cmd\"", $log;
+    display "Output:";
+    display join "\n", @output, $log;
+  } # if
+  
   close $log;
   
+  $today = YMD;  
+  
   sleep $sleep;
+  
+  if ($today ne YMD){
+    @images = fillPictures;
+  } # if
 } # while