#!/usr/bin/env bash # Author : Pavan Jadhaw # Github Profile : https://github.com/pavanjadhaw # Project Repository : https://github.com/pavanjadhaw/betterlockscreen # find your resolution so images can be resized to match your screen resolution res=$(xdpyinfo | grep dimensions | sed -r 's/^[^0-9]*([0-9]+x[0-9]+).*$/\1/') default_timeout="$(cut -d ' ' -f4 <<< "$(xset q | sed -n '25p')")" default_dpms=$(xset q | awk '/^[[:blank:]]*DPMS is/ {print $(NF)}') init_filenames() { #$1 resolution # copy this block to ~/.config/betterlockscreenrc" to customize insidecolor=00000000 ringcolor=ffffffff keyhlcolor=d23c3dff bshlcolor=d23c3dff separatorcolor=00000000 insidevercolor=00000000 insidewrongcolor=d23c3dff ringvercolor=ffffffff ringwrongcolor=ffffffff verifcolor=ffffffff timecolor=ffffffff datecolor=ffffffff loginbox=00000066 font="sans-serif" locktext='Type password to unlock...' wallpaper_cmd='feh --bg-fill --no-fehbg' time_format='%H:%M:%S' # override defaults with config theme_rc="$HOME/.config/betterlockscreenrc" if [ -e "$theme_rc" ]; then # shellcheck disable=SC1090 source "$theme_rc" fi # create folder in ~/.cache/i3lock directory res_folder="$HOME/.cache/i3lock/$1" folder="$HOME/.cache/i3lock/current" echo "Got" "$@" "$res_folder" if [ ! -d "$folder" ] || [ -n "$2" ]; then rm -rf "$folder" mkdir -p "$res_folder" ln -s "$res_folder" "$folder" fi # ratio for rectangle to be drawn for time background on lockscreen # Original Image orig_wall="$folder/wall.png" # Versions (from here) # You can use these images to set different versions as wallpaper # lockscreen background. resized="$folder/resized.png" # resized image for your resolution # images to be used as wallpaper dim="$folder/dim.png" # image with subtle overlay of black blur="$folder/blur.png" # blurred version dimblur="$folder/dimblur.png" pixel="$folder/pixel.png" # pixelated image # lockscreen images (images to be used as lockscreen background) l_resized="$folder/l_resized.png" l_dim="$folder/l_dim.png" l_blur="$folder/l_blur.png" l_dimblur="$folder/l_dimblur.png" l_pixel="$folder/l_pixel.png" } init_filenames "$res" prelock() { if [ -n "$lock_timeout" ]; then xset dpms "$lock_timeout" fi if [ -n "$(pidof dunst)" ]; then pkill -u "$USER" -USR1 dunst fi if [[ "$runsuspend" = "true" ]]; then lockargs="$lockargs -n" fi } lock() { #$1 image path i3lock \ -c 00000000 \ -t -i "$1" \ --time-pos='x+110:h-70' \ --date-pos='x+43:h-45' \ --clock --date-align 1 --date-str "$locktext" --time-str "$time_format" \ --inside-color=$insidecolor --ring-color=$ringcolor --line-uses-inside \ --keyhl-color=$keyhlcolor --bshl-color=$bshlcolor --separator-color=$separatorcolor \ --insidever-color=$insidevercolor --insidewrong-color=$insidewrongcolor \ --ringver-color=$ringvercolor --ringwrong-color=$ringwrongcolor --ind-pos='x+280:h-70' \ --radius=20 --ring-width=4 --verif-text='' --wrong-text='' \ --verif-color="$verifcolor" --time-color="$timecolor" --date-color="$datecolor" \ --time-font="$font" --date-font="$font" --layout-font="$font" --verif-font="$font" --wrong-font="$font" \ --noinput-text='' --force-clock --pass-media-keys "$lockargs" } postlock() { if [ -n "$lock_timeout" ]; then xset dpms "$default_timeout" if [ "$default_dpms" = "Disabled" ]; then xset -dpms fi fi if [ -n "$(pidof dunst)" ] ; then pkill -u "$USER" -USR2 dunst fi } rec_get_random() { dir="$1" if [ ! -d "$dir" ]; then user_input="$dir" return fi dirs=("$dir"/*) random_dir="${dirs[RANDOM % ${#dirs[@]}]}" rec_get_random "$random_dir" } lockselect() { prelock case "$1" in dim) # lockscreen with dimmed background lock "$l_dim" ;; blur) # set lockscreen with blurred background lock "$l_blur" ;; dimblur) # set lockscreen with dimmed + blurred background lock "$l_dimblur" ;; pixel) # set lockscreen with pixelated background lock "$l_pixel" ;; *) # default lockscreen lock "$l_resized" ;; esac postlock } # $1: number of pixels to convert # $2: 1 for width. 2 for height logical_px() { # get dpi value from xrdb local DPI DPI=$(grep -oP 'Xft.dpi:\s*\K\d+' ~/.Xresources | bc) if [ -z "$DPI" ]; then DPI=$(xdpyinfo | sed -En "s/\s*resolution:\s*([0-9]*)x([0-9]*)\s.*/\\$2/p" | head -n1) fi # return the default value if no DPI is set if [ -z "$DPI" ]; then echo "$1" else local SCALE SCALE=$(echo "scale=2; $DPI / 96.0" | bc) # check if scaling the value is worthy if [ "$(echo "$SCALE > 1.25" | bc -l)" -eq 0 ]; then echo "$1" else echo "$SCALE * $1 / 1" | bc fi fi } update() { # use background="$1" # default blur level; fallback to 1 [[ $blur_level ]] || blur_level=1 rectangles=" " SR=$(xrandr --query | grep ' connected' | grep -o '[0-9][0-9]*x[0-9][0-9]*[^ ]*') for RES in $SR; do # shellcheck disable=SC2206 SRA=(${RES//[x+]/ }) CX=$((SRA[2] + $(logical_px 25 1))) CY=$((SRA[1] - $(logical_px 30 2))) rectangles+="rectangle $CX,$CY $((CX+$(logical_px 300 1))),$((CY-$(logical_px 80 2))) " done # User supplied Image user_image="$folder/user_image.png" # create folder if [ ! -d "$folder" ]; then echo "Creating '$folder' directory to cache processed images." mkdir -p "$folder" fi # get random file in dir if passed argument is a dir rec_get_random "$background" # get user image cp "$user_input" "$user_image" if [ ! -f "$user_image" ]; then echo 'Please specify the path to the image you would like to use' exit 1 fi # replace orignal with user image cp "$user_image" "$orig_wall" rm "$user_image" echo 'Generating alternate images based on the image you specified,' echo 'please wait this might take few seconds...' # wallpapers echo echo 'Converting provided image to match your resolution...' # resize image convert "$orig_wall" -resize "$res""^" -gravity center -extent "$res" "$resized" echo echo 'Applying dim, blur, and pixelation effect to resized image' # dim convert "$resized" -fill black -colorize 40% "$dim" # pixel convert -scale 10% -scale 1000% "$resized" "$pixel" # blur blur_shrink=$(echo "scale=2; 20 / $blur_level" | bc) blur_sigma=$(echo "scale=2; 0.6 * $blur_level" | bc) convert "$resized" \ -filter Gaussian \ -resize "$blur_shrink%" \ -define "filter:sigma=$blur_sigma" \ -resize "$res^" -gravity center -extent "$res" \ "$blur" # dimblur convert "$dim" \ -filter Gaussian \ -resize "$blur_shrink%" \ -define "filter:sigma=$blur_sigma" \ -resize "$res^" -gravity center -extent "$res" \ "$dimblur" # lockscreen backgrounds echo echo 'Caching images for faster screen locking' # resized convert "$resized" -draw "fill #$loginbox $rectangles" "$l_resized" # dim convert "$dim" -draw "fill #$loginbox $rectangles" "$l_dim" # blur convert "$blur" -draw "fill #$loginbox $rectangles" "$l_blur" # dimblur convert "$dimblur" -draw "fill #$loginbox $rectangles" "$l_dimblur" # pixel convert "$pixel" -draw "fill #$loginbox $rectangles" "$l_pixel" echo echo 'All required changes have been applied' } wallpaper() { case "$1" in '') # set resized image as wallpaper if no argument is supplied by user wallpaper="$resized" ;; dim) # set dimmed image as wallpaper wallpaper="$dim" ;; blur) # set blurred image as wallpaper wallpaper="$blur" ;; dimblur) # set dimmed + blurred image as wallpaper wallpaper="$dimblur" ;; pixel) # set pixelated image as wallpaper wallpaper="$pixel" ;; esac eval "$wallpaper_cmd $wallpaper" } empty() { if [ -f "$l_dim" ]; then echo -e "\nSeems you haven't provided any arguments. See below for usage details." else echo 'Important: Update the image cache (e.g. betterlockscreen -u path/to/image.jpg).' echo echo ' Image cache must be updated to initially configure or update the wallpaper used.' fi echo echo 'For other sets of options and help, use the help command.' echo 'e.g. betterlockscreen -h or betterlockscreen --help' echo echo 'See: https://github.com/pavanjadhaw/betterlockscreen for additional info...' exit 1 } usage() { echo 'Important: Update the image cache (e.g. betterlockscreen -u path/to/image.jpg).' echo ' Image cache must be updated to initially configure or update wallpaper used' echo echo echo 'See: https://github.com/pavanjadhaw/betterlockscreen for additional info...' echo echo echo 'Options:' echo echo ' -h --help' echo ' For help (e.g. betterlockscreen -h or betterlockscreen --help).' echo echo echo ' -u --update' echo ' to update image cache, you should do this before using any other options' echo ' E.g: betterlockscreen -u path/to/image.png when image.png is custom background' echo ' Or you can use betterlockscreen -u path/to/imagedir and a random file will be selected.' echo echo echo ' -l --lock' echo ' to lock screen (e.g. betterlockscreen -l)' echo ' you can also use dimmed or blurred background for lockscreen.' echo ' E.g: betterlockscreen -l dim (for dimmed background)' echo ' E.g: betterlockscreen -l blur (for blurred background)' echo ' E.g: betterlockscreen -l dimblur (for dimmed + blurred background)' echo echo echo ' -s --suspend' echo ' to suspend system and lock screen (e.g. betterlockscreen -s)' echo ' you can also use dimmed or blurred background for lockscreen.' echo ' E.g: betterlockscreen -s dim (for dimmed background)' echo ' E.g: betterlockscreen -s blur (for blurred background)' echo ' E.g: betterlockscreen -s dimblur (for dimmed + blurred background)' echo echo echo ' -w --wall' echo ' you can also set lockscreen background as wallpaper' echo ' to set wallpaper (e.g. betterlockscreen -w or betterlockscreen --wall)' echo ' (The default wallpaper setter is feh, to set your own use the -wc command)' echo ' you can also use dimmed or blurred variants.' echo ' E.g: betterlockscreen -w dim (for dimmed wallpaper)' echo ' E.g: betterlockscreen -w blur (for blurred wallpaper)' echo ' E.g: betterlockscreen -w dimblur (for dimmed + blurred wallpaper)' echo echo echo ' -r --resolution' echo ' to be used after -u' echo ' used to set a custom resolution for the image cache.' echo ' E.g: betterlockscreen -u path/to/image.png -r 1920x1080' echo ' E.g: betterlockscreen -u path/to/image.png --resolution 3840x1080' echo echo echo ' -b --blur' echo ' to be used after -u' echo ' used to set blur intensity. Default to 1.' echo ' E.g: betterlockscreen -u path/to/image.png -b 3' echo ' E.g: betterlockscreen -u path/to/image.png --blur 0.5' echo echo echo ' -t --text' echo ' to set custom lockscreen text (max 31 chars)' echo " E.g: betterlockscreen -l dim -t \"Don't touch my machine!\"" echo ' E.g: betterlockscreen --text "Hi, user!" -s blur' echo echo echo ' --off ' echo ' to set custom monitor turn off timeout for lockscreen' echo ' timeout is in seconds' echo ' E.g: betterlockscreen -l dim --off 5' echo echo echo ' -wc --wallpaper_cmd ' echo ' to set your custom wallpaper setter' echo ' the default is "feh --bg-fill --no-fehbg"' echo ' E.g: betterlockscreen -wc "xwallpaper --zoom" -w' echo echo echo ' -tf --time_format ' echo ' to set the time format used by i3lock-color' echo ' see the i3lock or strftime man pages for more details.' echo ' E.g: betterlockscreen -l dim -tf "%I:%M %p"' } # Options [[ "$1" = '' ]] && empty for arg in "$@"; do [[ "${arg:0:1}" = '-' ]] || continue case "$1" in -h | --help) usage break ;; -s | --suspend) runsuspend=true ;& -l | --lock) runlock=true if [[ ${2:0:1} = '-' ]]; then shift 1 else lockstyle="$2"; shift 2 fi ;; -w | --wall | --wallpaper) wallpaper "$2" shift 2 ;; -u | --update) runupdate=true imagepath="$2" shift 2 ;; -t | --text) locktext="$2" shift 2 ;; --off) lock_timeout="$2" shift 2 ;; -r | --resolution) res="$2" init_filenames "$res" force shift 2 ;; -b | --blur) blur_level="$2" shift 2 ;; -wc | --wallpaper_cmd) wallpaper_cmd="$2" shift 2 ;; -tf | --time_format) time_format="$2" shift 2 ;; --) lockargs="$lockargs ${*:2}" break ;; *) echo "invalid argument: $1" break ;; esac done # Run image generation [[ $runupdate ]] && update "$imagepath" # Activate lockscreen [[ $runlock ]] && lockselect "$lockstyle" && \ { [[ $runsuspend ]] && systemctl suspend; } exit 0