One reason to use open-source software is if you enjoy the ability to create or alter any of the tools you use. I use Linux and the Gnome desktop environment, and I'm confident that if there's something that I want to do -- a customization or an application -- I can probably do it in Perl. If I can't, I can probably do it in Ruby. If not Ruby, there might be command-line tools. And if none of those are available, I can do it in C.
Every couple of minutes, the background on my dad's laptop changes to a random picture. The picture is one of many in a directory of Eleuthera images, some of which are mine. This sort of behavior doesn't exist for Gnome, plus I'm not always online with the ability to search for a solution, so I was curious as to how much work would be needed to this happen.
I fired up gconf-editor
, the Gnome configuration editor, and searched for "background." Sure enough, there was a preference called /desktop/gnome/background/picture_filename
whose value was an absolute path to the current background image. There were also other options to set the layout and background color.
Having the Gnome2 packages installed, I tried using Gnome2::Config to set the path to the background image:
#!/usr/bin/env perl use strict; use warnings; use Gnome2; Gnome2::Program->init( 'random-background', 0.01 ); my $path = '/desktop/gnome/background/picture_filename'; Gnome2::Config->set_string( $path, '/home/ian/pictures/to_upload/IMG_3644.JPG' );
This, unfortunately, didn't work at all. Before set_string()
, the string returned by get_path()
was empty. Afterwards, tests using get_string()
claimed that the image had been set, but the background hadn't changed. Harumph.
Next I tried to use Ruby. Unfortunately, the Gnome libraries for Ruby weren't installed, so I looked for a command-line solution instead.
The gconftool-2
utility, which allows you set and get parameters on the command-line, worked perfectly. The following program takes one or more directories as arguments, finds all .jpg
files in those directories, and picks one randomly and sets it as the background:
#!/usr/bin/env perl use strict; use warnings; use IO::All; die "usage: $0...\n" unless @ARGV; my @pictures = grep /\.jpg$/i, map { io($_)->deep->all } @ARGV; my $picture = $pictures[ rand @pictures ]; my @options_to_set = ( [ 'picture_options', 'scaled' ], [ 'picture_filename', $picture->absolute->pathname ], [ 'primary_color', '#444444' ], ); foreach my $tuple (@options_to_set) { my ( $key, $value ) = @$tuple; system( 'gconftool-2', -t => 'string', -s => "/desktop/gnome/background/$key", $value ); }
This doesn't, however, perform the sexy fading transitions that Mac OS X does. I figure it's close enough for now.