Portál AbcLinuxu, 12. listopadu 2025 19:32
Adresa tématu či pozadí: http://interfacelift.com/wallpaper/downloads/date/widescreen/
Pozadí je ve skutečnosti generováno dynamicky (Perl + ImageMagic) každých pět minut náhodným výběrem dvou širokoúhlých obrázků z databáze vytvořené z InterfaceLift.com.
Gnome Shell rozšíření:
Tiskni
Sdílej:
Je to starý kód, šlo by to napsat lépe, ale funguje to.
#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use File::Copy;
use File::Temp qw/ tempfile /;
binmode(STDIN, "utf8");
binmode(STDOUT, "utf8");
binmode(STDERR, "utf8");
use File::Spec;
# Výpis informací o použití programu.
sub print_help {
my $exit_code = shift @_;
$exit_code = 1 unless $exit_code;
print STDERR "Použití:\n";
print STDERR " $0 <adresář_s_obrázky> <cílový_soubor_s_tapetou>\n";
exit $exit_code;
}
sub get_full_path {
my $arg = shift @_;
return File::Spec->canonpath(File::Spec->rel2abs($arg));
}
#
# Main
#
my ($wdir, $wfilelink, $wfile, $wfileold) = (undef, undef, undef, undef);
unless (($#ARGV + 1) == 2 and -d $ARGV[0] and -l $ARGV[1]) {
print_help;
} else {
$wdir = get_full_path($ARGV[0]);
$wfilelink = get_full_path($ARGV[1]);
}
if (-f "$wfilelink.1") {
$wfileold = "$wfilelink.1";
$wfile = "$wfilelink.2";
} else {
$wfileold = "$wfilelink.2";
$wfile = "$wfilelink.1";
}
my $pid = `pgrep gnome-session`;
chomp $pid;
my $dbus = `grep -z "DBUS_SESSION_BUS_ADDRESS" "/proc/$pid/environ" 2>/dev/null`;
chomp $dbus;
$dbus =~ s/^DBUS_SESSION_BUS_ADDRESS=//g;
exit if ($dbus =~ /^\s*$/);
opendir(WDIR, $wdir)
|| die("Nezdrařilo se čtení obsahu adresáře $wdir: $!");
my @wdircontent = grep { $_ !~ /^(\.|\.\.)$/ && -f "$wdir/$_" } readdir(WDIR);
closedir(WDIR);
my $randomwfile1 = get_full_path(File::Spec->join($wdir, $wdircontent[int(rand($#wdircontent + 1))]));
my $randomwfile2 = get_full_path(File::Spec->join($wdir, $wdircontent[int(rand($#wdircontent + 1))]));
my ($tmpfile1, $tmpfilename1) = tempfile(UNLINK => 1, SUFFIX => '.png')
or die "$!";
my ($tmpfile2, $tmpfilename2) = tempfile(UNLINK => 1, SUFFIX => '.png')
or die "$!";
#system('convert', "$randomwfile1", '-quality', '100', '-resize', 'x1200', '-gravity', 'center', '-crop', '1920x1200+0+0', "$tmpfilename1") == 0
system('convert', "$randomwfile1", '-quality', '100', '-resize', 'x1600', '-gravity', 'center', '-crop', '2560x1440+0+0', "$tmpfilename1") == 0
or die "Convert 1 failed: $!";
system('convert', "$randomwfile2", '-quality', '100', '-resize', 'x1200', '-gravity', 'center', '-crop', '1600x1200+0+0', "$tmpfilename2") == 0
or die "Convert 2 failed: $!";
system('montage', "$tmpfilename1", "$tmpfilename2", '-quality', '100', '-background', 'black', '-mode', 'Concatenate', '-gravity', 'SouthWest', '-tile', 'x1', "$wfile") == 0
or die "Montage failed: $!";
open(INFO, ">:encoding(UTF-8)", "/tmp/wallpaper-info.txt")
or die("open() failed: $!");
print INFO "left picture: $randomwfile1\n"
."right picture: $randomwfile2\n";
close(INFO);
unlink "$wfileold" if (-f "$wfileold");
unlink "$wfilelink" if (-l "$wfilelink");
symlink("$wfile", "$wfilelink");
$wfile =~ s/'/'\\''/g; # Aby to prošlo v následujícím příkazu, pokud je ve jméně souboru apostrof.
#system('export DBUS_SESSION_BUS_ADDRESS='."'$dbus'".'; gsettings set org.gnome.desktop.background picture-uri '."'$wfile'");
system('export DBUS_SESSION_BUS_ADDRESS=$(grep -z "DBUS_SESSION_BUS_ADDRESS" "/proc/$(pgrep gnome-session)/environ" | cut -d= -f2-); gsettings set org.gnome.desktop.background picture-uri '."'$wfile'");
Je to nastaveno na dvoumonitorovou konfiguraci: vlevo 2560×1440 a vpravo 1600×1200 zarovnaný na spodní okraj levého monitoru.
V noci jsem si ještě vzpomněl, že vlastně ten skript nepůjde spustit na místě, kde to ještě není nachystaný ten symlink (kvůli prodlevě při generování nového obrázku, kdy by nebyl soubor s tapetou dobře vytvořený, se obrázek střídavě generuje do dvou souborů a po vygenerování se jen přesměruje symlink, aby se plynule bez prodlev zobrazila nová tapeta), takže před případným použitím doporučuji aplikovat tenhle patch:
--- a/wallpaper-random-change.pl 2016-01-14 09:37:20.597823140 +0100
+++ b/wallpaper-random-change.pl 2016-01-14 09:37:32.513515615 +0100
@@ -38,7 +38,7 @@
my ($wdir, $wfilelink, $wfile, $wfileold) = (undef, undef, undef, undef);
-unless (($#ARGV + 1) == 2 and -d $ARGV[0] and -l $ARGV[1]) {
+unless (($#ARGV + 1) == 2 and -d $ARGV[0] and (-l $ARGV[1] or not -e $ARGV[1])) {
print_help;
} else {
$wdir = get_full_path($ARGV[0]);
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.