Fixed bug in setbg
[clearscm.git] / bin / setbg
index a09e5f0..ffcefda 100755 (executable)
--- a/bin/setbg
+++ b/bin/setbg
@@ -32,7 +32,7 @@ $Date: 2012/11/09 15:31:30 $
 
  Usage: setbg [-u|sage] [-h|elp] [-ve|rbose] [-d|ebug] [-s|leep <n>]
               [-bgdirs <bgdir> -bgdirs ...]
 
  Usage: setbg [-u|sage] [-h|elp] [-ve|rbose] [-d|ebug] [-s|leep <n>]
               [-bgdirs <bgdir> -bgdirs ...]
+
  Where:
 
  -u|sage:      Displays this usage
  Where:
 
  -u|sage:      Displays this usage
@@ -63,16 +63,17 @@ contents of the bgdirs incase it has changed and display a new image". This is
 useful for script to be able to alert setbg that something has changed. For
 example, a script named rmbg might look at ~/.setbg to get the name of the
 current background image file and remove it then signal setbg with SIGUSR1 to
 useful for script to be able to alert setbg that something has changed. For
 example, a script named rmbg might look at ~/.setbg to get the name of the
 current background image file and remove it then signal setbg with SIGUSR1 to
-have it re-evaluate the state of bgdirs. 
+have it re-evaluate the state of bgdirs.
 
 Finally setbg will perform the this re-evaluation at midnight everyday. This is
 
 Finally setbg will perform the this re-evaluation at midnight everyday. This is
-useful because we point setbg to look at -bgdirs from Dropbox where Camera 
+useful because we point setbg to look at -bgdirs from Dropbox where Camera
 Uploads is included and new pictures can arrive everyday.
 
 =cut
 
 use strict;
 use warnings;
 Uploads is included and new pictures can arrive everyday.
 
 =cut
 
 use strict;
 use warnings;
+use experimental qw(signatures);
 
 use FindBin;
 use Getopt::Long;
 
 use FindBin;
 use Getopt::Long;
@@ -104,7 +105,7 @@ my %opts = (
 
 my %totals;
 
 
 my %totals;
 
-sub displayStats () {
+sub displayStats() {
   my $statsFile = Logger->new(
     name      => ".$FindBin::Script.stats",
     path      => $ENV{HOME},
   my $statsFile = Logger->new(
     name      => ".$FindBin::Script.stats",
     path      => $ENV{HOME},
@@ -124,17 +125,20 @@ sub displayStats () {
   return;
 } # displayStats
 
   return;
 } # displayStats
 
-sub fillPictures () {
+sub fillPictures($signame = undef) {
   my @images;
 
   $totals{bgdirs} = 0;
 
   for (@{$opts{bgdirs}}) {
   my @images;
 
   $totals{bgdirs} = 0;
 
   for (@{$opts{bgdirs}}) {
-    my @pics = `find "$_" -type f -name "*.jpg"`;
+    my ($status, @pics) = Execute "find \"$_/\" -type f";
 
     chomp @pics;
 
 
     chomp @pics;
 
-    push @images, @pics;
+    push @images, grep(/jpg$|png$|gif$/i, @pics);
+
+    @pics = grep(/jpg$|png$|gif$/i, @pics);
+
     push @{$opts{bgdircnt}}, scalar @pics;
 
     $totals{bgdirs}++;
     push @{$opts{bgdircnt}}, scalar @pics;
 
     $totals{bgdirs}++;
@@ -142,33 +146,44 @@ sub fillPictures () {
 
   $totals{images} = scalar @images;
 
 
   $totals{images} = scalar @images;
 
+  displayStats;
+
   return @images;
 } # fillPictures
 
   return @images;
 } # fillPictures
 
-sub updateSetBG ($$) {
-  my ($bgimage, $lockimage) = @_;
+sub writeHistory($msg) {
+  open my $hist, '>>', "$ENV{HOME}/.$FindBin::Script.hist"
+    or error "Unable to open $ENV{HOME}/.$FindBin::Script.hist for append - $!", 1;
+
+  $msg = localtime() . $msg;
 
 
-  open my $setbg, '>', "$ENV{HOME}/.$FindBin::Script"
-    or error "Unable to open $ENV{HOME}/.$FindBin::Script for writing - $!", 1;
+  print $hist $msg;
 
 
-  display $bgimage, $setbg;
+  close $hist;
+} # writeHistory
 
 
-  close $setbg;
+sub writeSetBG($filename, $image) {
+  open my $file, '>', $filename
+    or error "Unable to open $filename for writing - $!", 1;
 
 
-  my $msg  = localtime() . ":$bgimage";
-     $msg .= " lock:$lockimage" if $opts{lockscreen};
+  print $file "$image\n";
 
 
-  open my $hist, '>>', "$ENV{HOME}/.$FindBin::Script.hist"
-    or error "Unable to open $ENV{HOME}/.$FindBin::Script.hist for append - $!", 1;
+  close $file;
+} # writeSetBG
 
 
-  display $msg, $hist;
+sub updateSetBG($bgimage, $lockimage) {
+  writeSetBG "$ENV{HOME}/.$FindBin::Script", $bgimage;
+  writeSetBG "$ENV{HOME}/.$FindBin::Script.lock", $lockimage;
 
 
-  close $hist;
+  my $msg  = ":$bgimage";
+     $msg .= " lock:$lockimage" if $opts{lockscreen};
+
+  writeHistory $msg;
 
   return;
 } # updateSetBG
 
 
   return;
 } # updateSetBG
 
-sub SwitchWallPaper {
+sub SwitchWallPaper($saigname) {
   # We don't need to do anything here, just handle the interrupt and
   # let the while loop continue.
   debug 'SwitchWallPaper: Interrupt received';
   # We don't need to do anything here, just handle the interrupt and
   # let the while loop continue.
   debug 'SwitchWallPaper: Interrupt received';
@@ -191,6 +206,7 @@ GetOptions (
   'sleep=i',
   'lockscreen',
   'bgdirs=s@',
   'sleep=i',
   'lockscreen',
   'bgdirs=s@',
+  'mate',
 ) || Usage;
 
 local $0 = "$FindBin::Script " . join ' ', @argvCopy;
 ) || Usage;
 
 local $0 = "$FindBin::Script " . join ' ', @argvCopy;
@@ -212,8 +228,16 @@ for (my $i = 0; $i < scalar @{$opts{bgdirs}}; $i++) {
 
 # Using gsettings
 my $setbg       = "gsettings";
 
 # Using gsettings
 my $setbg       = "gsettings";
-my $setbgOpts   = "set org.gnome.desktop.background picture-uri \"file://";
-my $setLockOpts = "set org.gnome.desktop.screensaver picture-uri \"file://";
+
+my ($setbgOpts, $setLockOpts);
+
+if ($opts{mate}) {
+  $setbgOpts   = 'set org.mate.background picture-filename ';
+  $setLockOpts = 'set org.mate.screensaver picture-filename ';
+} else {
+  $setbgOpts   = "set org.gnome.desktop.background picture-uri \"file://";
+  $setLockOpts = "set org.gnome.desktop.screensaver picture-uri \"file://";
+} # if
 
 my @images = fillPictures;
 
 
 my @images = fillPictures;
 
@@ -229,37 +253,56 @@ truncate "$ENV{HOME}/.$FindBin::Script.hist", 0;
 
 EnterDaemonMode unless defined $DB::OUT;
 
 
 EnterDaemonMode unless defined $DB::OUT;
 
+my $pickNewImages = 1;
+my ($bgimage, $lockimage);
+
 while () {
 while () {
-  my $bgimage   = escapeHTML ($images[int (rand $#images)]);
-  my $lockimage = escapeHTML ($images[int (rand $#images)]);
+  if ($pickNewImages) {
+    $bgimage   = escapeHTML ($images[int (rand $#images)]);
+    $lockimage = escapeHTML ($images[int (rand $#images)]);
+  } # if
+
+  my $monitorIsOn;
 
 
-  my $cmd = "$setbg $setbgOpts$bgimage\" 2> /dev/null";
+  my ($status, @output) = Execute("xset q | grep Monitor | awk '{print \$3}'");
 
 
-  my @output = `$cmd`;
+  if ($status or $output[0] eq 'Off') {
+    writeHistory ":Monitor off, not setting background to $bgimage - will keep trying";
 
 
-  if ($? != 0) {
-    error "Trying to set background - command used \"$cmd\"\n\nOutput\n\n" . 
-      join "\n", @output;
-    $totals{errors}++;
+    $pickNewImages = 0;
   } else {
   } else {
-    $totals{'Images displayed'}++;
-  } # if
+    $pickNewImages = 1;
 
 
-  if ($opts{lockscreen}) {
-    $cmd = "$setbg $setLockOpts$lockimage\" 2> /dev/null";
+    my $cmd = $opts{mate} ? "$setbg $setbgOpts\"$bgimage\" 2> /dev/null"
+                          : "$setbg $setbgOpts$bgimage\" 2> /dev/null";
 
 
-    @output = `$cmd`;
+    ($status, @output) = Execute $cmd;
 
 
-    if ($? != 0) {
-      error "Trying to set lock screen - command used \"$cmd\"\n\nOutput\n\n" .
+    if ($status) {
+      error "Trying to set background - command used \"$cmd\"\n\nOutput\n\n" . 
         join "\n", @output;
       $totals{errors}++;
     } else {
         join "\n", @output;
       $totals{errors}++;
     } else {
-      $totals{'Lock screens displayed'}++;
+      $totals{'Images displayed'}++;
     } # if
     } # if
-  } # if
 
 
-  updateSetBG $bgimage, $lockimage;
+    if ($opts{lockscreen}) {
+      $cmd = $opts{mate} ? "$setbg $setLockOpts\"$lockimage\" 2> /dev/null"
+                         : "$setbg $setLockOpts$lockimage\" 2> /dev/null";
+
+      ($status, @output) = Execute $cmd;
+
+      if ($status != 0) {
+        error "Trying to set lock screen - command used \"$cmd\"\n\nOutput\n\n" .
+          join "\n", @output;
+        $totals{errors}++;
+      } else {
+        $totals{'Lock screens displayed'}++;
+      } # if
+    } # if
+
+    updateSetBG $bgimage, $lockimage;
+  } # if
 
   displayStats;
 
 
   displayStats;