Usage: setbg [-u|sage] [-h|elp] [-ve|rbose] [-d|ebug] [-s|leep <n>]
[-bgdirs <bgdir> -bgdirs ...]
-
+
Where:
- -u|sage: Displays this usage
- -h|elp: Display full help
- -ve|rbose: Be verbose
- -d|ebug: Output debug messages
+ -u|sage: Displays this usage
+ -h|elp: Display full help
+ -ve|rbose: Be verbose
+ -d|ebug: Output debug messages
- -s|leep: Number of minutes to sleep between setting the background
- (Default: 1 hour)
- -b|gdirs: Directories to scan for images
+ -s|leep: Number of minutes to sleep between setting the background
+ (Default: 1 hour)
+ -l|ockscreen: Change lockscreen backround (Default: False)
+ -b|gdirs: Directories to scan for images
=head1 DESCRIPTION
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
-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;
+use experimental qw(signatures);
use FindBin;
use Getopt::Long;
use Logger;
use Utils;
-my $VERSION = '$Revision: 1.11 $';
+my $VERSION = '$Revision: 1.12 $';
($VERSION) = ($VERSION =~ /\$Revision: (.*) /);
my $processes = Proc::ProcessTable->new;
my %opts = (
- sleep => 60,
- usage => sub { pod2usage },
- help => sub { pod2usage (-verbose => 2)},
- verbose => sub { set_verbose },
- debug => sub { set_debug },
+ sleep => 60,
+ lockscreen => 0,
+ usage => sub { pod2usage },
+ help => sub { pod2usage (-verbose => 2)},
+ verbose => sub { set_verbose },
+ debug => sub { set_debug },
);
my %totals;
-sub displayStats () {
+sub displayStats() {
my $statsFile = Logger->new(
name => ".$FindBin::Script.stats",
path => $ENV{HOME},
return;
} # displayStats
-sub fillPictures () {
+sub fillPictures($signame = undef) {
my @images;
$totals{bgdirs} = 0;
for (@{$opts{bgdirs}}) {
- my @pics = `find "$_" -type f -name "*.jpg"`;
+ my ($status, @pics) = Execute "find \"$_/\" -type f";
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}++;
$totals{images} = scalar @images;
+ displayStats;
+
return @images;
} # fillPictures
-sub updateSetBG ($) {
- my ($image) = @_;
+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\n";
- display $image, $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() . ":$image";
+ 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
-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';
'verbose',
'debug',
'sleep=i',
+ 'lockscreen',
'bgdirs=s@',
+ 'mate',
) || Usage;
local $0 = "$FindBin::Script " . join ' ', @argvCopy;
} # for
# Using gsettings
-my $setbg = "gsettings";
-my $setbgOpts= "set org.gnome.desktop.background picture-uri \"file://";
+my $setbg = "gsettings";
+
+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;
EnterDaemonMode unless defined $DB::OUT;
+my $pickNewImages = 1;
+my ($bgimage, $lockimage);
+
while () {
- my $image = 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$image\" 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 {
- $totals{'Images displayed'}++;
+ $pickNewImages = 1;
+
+ my $cmd = $opts{mate} ? "$setbg $setbgOpts\"$bgimage\" 2> /dev/null"
+ : "$setbg $setbgOpts$bgimage\" 2> /dev/null";
+
+ ($status, @output) = Execute $cmd;
+
+ if ($status) {
+ error "Trying to set background - command used \"$cmd\"\n\nOutput\n\n" .
+ join "\n", @output;
+ $totals{errors}++;
+ } else {
+ $totals{'Images displayed'}++;
+ } # if
+
+ 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 $image;
+ updateSetBG $bgimage, $lockimage;
} # if
displayStats;