My regular readers already knows that my favorite desktop environment on Linux is i3.
However, let's face it, the UI of the default theme of lockscreen tool (i3lock) is hawful.



Luckily, i3lock provides some command line options, such us the -i option, that allows the customization of lockscreen background.

Using a tiny bash script is possible to make a blurried/pixelate screenshot of the current desktop with a padlock in the center, and using it as i3lock background.

The script has only one pre-requisite: imagemagick need to be installed on the box.

$ sudo apt install imagemagick

So, with the import tool (from imagemagick) we can create a screenshot of the current screen:

import -window root screenshot.png 

Then, using the convert tool, we apply some modification on the image (in this example, a pixelation or a blurring):

convert  screenshot.png  -scale 10% -scale 1000%  screenshot.png 

or

convert  screenshot.png  -blur 2,5  screenshot.png 

I prefer the pixelation, due the speed of the process against the blurring process.

Finally, using again the convert tool, we apply a centered padlock image (like this) on the screenshot:

convert screenshot.png lock.png -gravity center -composite screenshot.png 

Here the result:

The generated image can therefore used as background for i3lock:

i3lock -u -i screenshot.png


Let's assemble the bash script

Let's collect all commands in a single script, that stores the screenshot in a temporary file:

#!/bin/bash
icon="$HOME/.config/i3/lock.png"
# create a temp file
img=$(mktemp /tmp/XXXXXXXXXX.png)
# Take a screenshot of current desktop
import -window root $img 
# Pixelate the screenshot
convert $img -scale 10% -scale 1000% $img
# Alternatively, blur the screenshot (slow!)
#convert $img -blur 2,5 $img
# Add the lock image
convert $img $icon -gravity center -composite $img
# Run i3lock with custom background
i3lock -u -i $img
# Remove the tmp file
rm $img

The script can be saved in the user local directory, and called automatically when screen goes to sleep using xss-lock, adding this line at the end of i3's config file:

 exec --no-startup-id xss-lock -l [path of your script]

(I prefer this solution to the use of systemd because it is more reliable and compatible also with systems that do not use systemd)