dotfiles/.config/variety/scripts/set_wallpaper

259 lines
11 KiB
Bash
Executable File

#!/bin/bash
#
# This script is run by Variety when a new wallpaper is set. You can use Bash, Python or whatever suits you best.
# Here you can put custom commands for setting the wallpaper on your specific desktop environment,
# or run commands like notify-send that notify you of the change. You can also add commands to theme your browser,
# login screen or whatever you desire.
#
# Occasionally new versions of this script are released to bring support for new desktops. To apply them, you
# should either delete this copy (in ~/.config/data/scripts/) and restart Variety, or merge in the changes yourself.
# Bug fixes are automatically applied by Variety provided the local copy is never changed.
#
# PARAMETERS:
# $1: The first passed parameter is the absolute path to the wallpaper image to be set as wallpaper
# (after effects, clock, etc. are applied).
#
# $2: The second passed parameter is "auto" when the wallpaper is changed automatically (i.e. regular change), "manual"
# when the user has triggered the change, or "refresh" when the change is triggered by a change in quotes, clock, etc.
#
# $3: The third passed parameter is the absolute path to the original wallpaper image (before effects, clock, etc.)
#
# EXAMPLE:
# echo "$1" # /home/username/.config/variety/wallpaper/wallpaper-clock-fac0eef772f9b03bd9c0f82a79d72506.jpg
# echo "$2" # auto
# echo "$3" # /home/username/Pictures/Wallpapers/Nature/green-tunnel-1920x1080-wallpaper-861.jpg
# Here you may apply some additional custom operations on the wallpaper before it is applied.
# In the end put the path to the actual final wallpaper image file in the WP variable.
# The default is to simply set WP=$1.
WP=$1
# Enlightenment
# Needs Modules/System/DBus Extension loaded to work
if [[ "$DESKTOP" == *"Enlightenment"* ]] || [[ "$DESKTOP" == *"Moksha"* ]]; then
OUTPUT_DIR="$HOME/.e/e/backgrounds"
TEMPLATE='
images { image: "@IMAGE@" USER; }
collections {
group {
name: "e/desktop/background";
data { item: "style" "4"; item: "noanimation" "1"; }
max: @WIDTH@ @HEIGHT@;
parts {
part {
name: "bg";
mouse_events: 0;
description {
state: "default" 0.0;
aspect: @ASPECT@ @ASPECT@;
aspect_preference: NONE;
image { normal: "@IMAGE@"; scale_hint: STATIC; }
}
}
}
}
}
'
OFILE="$OUTPUT_DIR/variety_wallpaper_$RANDOM"
DIMENSION="$(identify -format "%w/%h" "$WP")"
if [ ! -z "$DIMENSION" ]; then
WIDTH="$(echo "$DIMENSION" | cut -d/ -f1)"
HEIGHT="$(echo "$DIMENSION" | cut -d/ -f2)"
IMAGE="$(echo "$WP" | sed 's/[^[:alnum:]_-]/\\&/g')"
if [ -z "$HEIGHT" ] || [ "$HEIGHT" = "0" ]; then
ASPECT="0.0"
else
ASPECT="$(echo "scale=9; $DIMENSION" | bc)"
fi
fi
printf "%s" "$TEMPLATE" | \
sed "s/@ASPECT@/$ASPECT/g; s/@WIDTH@/$WIDTH/g; s/@HEIGHT@/$HEIGHT/g; s|@IMAGE@|$IMAGE|g" > "$OFILE.edc"
edje_cc "$OFILE.edc" "$OFILE.edj" 2>/dev/null
rm "$OFILE.edc"
## Get the current number of virtual desktops
desk_x_count=$(enlightenment_remote -desktops-get | awk '{print $1}')
desk_y_count=$(enlightenment_remote -desktops-get | awk '{print $2}')
## Get the current number of screens
screen_count=1
# If xrandr is available use it to get screen desk_x_count
if command -v xrandr >/dev/null 2>&1; then
screen_count=$(xrandr -q | grep -c ' connected')
fi
## Set the wallpaper for each virtual desktop
for ((x=0; x<desk_x_count; x++)); do
for ((y=0; y<desk_y_count; y++)); do
for ((z=0; z<screen_count; z++)); do
# -desktop-bg-add OPT1 OPT2 OPT3 OPT4 OPT5 Add a desktop bg definition.
# OPT1 = ContainerNo OPT2 = ZoneNo OPT3 = Desk_x. OPT4 = Desk_y. OPT5 = bg file path
enlightenment_remote -desktop-bg-add 0 "$z" "$x" "$y" "$OFILE.edj"&
done
done
done
# Remove all Variety wallpapers, but the current one and the previous one
# as we are calling enlightenment_remote asynchronously, if the previous wallpaper hasn't been
# replaced yet then the wallpaper will get set back to the theme one causing ugly artifacts
LAST_WALLPAPER_FILE="/home/breizh/.config/variety/.enlightenment_last_wallpaper.txt"
if [ -e "$LAST_WALLPAPER_FILE" ]; then
find "$OUTPUT_DIR" -name "variety_wallpaper*.*" | grep -v "$OFILE.edj" | grep -v "$(cat "$LAST_WALLPAPER_FILE")" | xargs rm
else
find "$OUTPUT_DIR" -name "variety_wallpaper*.*" | grep -v "$OFILE.edj" | xargs rm
fi
echo "$OFILE.edj" > "$LAST_WALLPAPER_FILE"
fi
# KDE: Users on KDE 4 or Plasma < 5.7 will have to manually choose ~/Pictures/variety-wallpaper/ as a slideshow folder with a short interval.
# Afterwards, with the command below, Variety will just overwrite the single file there when changing the wallpaper
# and KDE will refresh it
# On Plasma 5.7 and above, the wallpaper choosing is automatic.
if [ "${KDE_FULL_SESSION}" == "true" ]; then
# Plasma 5.7 introduced a new feature to set the wallpaper via a qdbus script:
# https://github.com/KDE/plasma-workspace/commit/903cbfd7e267a4812a6ec222eb7e1b5dd775686f
if [[ -n "${KDE_SESSION_VERSION}" && "${KDE_SESSION_VERSION}" == '5' ]]; then
# Try to find the Qt 5 version of qdbus. For systems using qtchooser, the binary name is 'qdbus'
# and the Qt version can be selected via the QT_SELECT environment variable.
if command -v qdbus-qt5 &>/dev/null; then
qdbus_command=qdbus-qt5
else
qdbus_command=qdbus
fi
QT_SELECT=5 $qdbus_command org.kde.plasmashell /PlasmaShell org.kde.PlasmaShell.evaluateScript "
var allDesktops = desktops();
for (i=0; i < allDesktops.length; i++) {
d = allDesktops[i];
d.wallpaperPlugin = 'org.kde.image';
d.currentConfigGroup = Array('Wallpaper', 'org.kde.image', 'General');
d.writeConfig('Image', 'file://""$WP""')
}
"
# Reuse the exit code from qdbus
qdbus_exitcode="$?"
if [[ "$qdbus_exitcode" -ne 0 ]]; then
# If the script fails, show a notification.
kdialog --title "Variety: cannot change Plasma wallpaper" --passivepopup "Could not change the Plasma 5 wallpaper; \
make sure that you're using Plasma 5.7+ and have widgets unlocked.\n----\n \
Due to Plasma limitations, external programs cannot automatically change the wallpaper when the widgets are locked.\n \
See https://git.io/vprpM for more information." --icon variety 10 # Final number is the length of the popup
fi
exit "$qdbus_exitcode"
else
WALLDIR="$(xdg-user-dir PICTURES)/variety-wallpaper"
mkdir -p "$WALLDIR"
# Remove all old wallpapers
rm -fv "${WALLDIR}"/*
NEWWP="${WALLDIR}/wallpaper-kde-$RANDOM.jpg"
cp "$WP" "$NEWWP"
touch "$NEWWP"
fi
fi
# Gnome 3, Unity
gsettings set org.gnome.desktop.background picture-uri "file://$WP" 2> /dev/null
if [ "$(gsettings get org.gnome.desktop.background picture-options)" == "'none'" ]; then
gsettings set org.gnome.desktop.background picture-options 'zoom'
fi
# GNOME Screensaver / Lock screen - thanks to George C. de Araujo for the patch
gsettings set org.gnome.desktop.screensaver picture-uri "file://$WP" 2> /dev/null
if [ "$(gsettings get org.gnome.desktop.screensaver picture-options)" == "'none'" ]; then
gsettings set org.gnome.desktop.screensaver picture-options 'zoom'
fi
# Deepin
if [ "$(gsettings list-schemas | grep -c com.deepin.wrap.gnome.desktop.background)" -ge 1 ]; then
gsettings set com.deepin.wrap.gnome.desktop.background picture-uri "file://$WP"
if [ "$(gsettings get com.deepin.wrap.gnome.desktop.background picture-options)" == "'none'" ]; then
gsettings set com.deepin.wrap.gnome.desktop.background picture-options 'zoom'
fi
fi
# XFCE
command -v xfconf-query >/dev/null 2>&1
rc=$?
if [[ $rc = 0 ]] ; then
for i in $(xfconf-query -c xfce4-desktop -p /backdrop -l | grep -E -e "screen.*/monitor.*image-path$" -e "screen.*/monitor.*/last-image$"); do
xfconf-query -c xfce4-desktop -p "$i" -n -t string -s "" 2> /dev/null
xfconf-query -c xfce4-desktop -p "$i" -s "" 2> /dev/null
xfconf-query -c xfce4-desktop -p "$i" -s "$WP" 2> /dev/null
done
fi
# LXDE/PCmanFM
if [ "$XDG_CURRENT_DESKTOP" == "LXDE" ]; then
pcmanfm --set-wallpaper "$WP" 2> /dev/null
fi
# LXQt/PCmanFM-qt
if [ "$XDG_CURRENT_DESKTOP" == "LXQt" ]; then
pcmanfm-qt --set-wallpaper "$WP" 2> /dev/null
fi
# For simple WMs, use either feh or nitrogen
# Implementation note: this uses spaces around list items to enforce matching whole words.
# This also means that an empty variable won't cause false positives, since it expands to " "
SIMPLE_WMS=("bspwm" "dwm" "herbstluftwm" "i3" "i3-with-shmlog" "jwm" "openbox" "qtile" "qtile-venv" "xmonad")
if [[ " ${SIMPLE_WMS[*]} " = *" $XDG_CURRENT_DESKTOP "* || " ${SIMPLE_WMS[*]} " = *" $XDG_SESSION_DESKTOP "* ||
" ${SIMPLE_WMS[*]} " = *" $DESKTOP_SESSION "* ]]; then
if command -v "feh" >/dev/null 2>&1; then
feh --bg-fill "$WP" 2> /dev/null
elif command -v "nitrogen" >/dev/null 2>&1; then
nitrogen --set-zoom-fill --save "$WP" 2> /dev/null
fi
fi
if [[ -n $SWAYSOCK ]]; then
swaymsg output "*" bg "$WP" fill 2> /dev/null
ln -s -f "$WP" /home/breizh/.config/variety/wallpaper/link
fi
# trinity
if [ "$XDG_CURRENT_DESKTOP" == "Trinity" ]; then
# The 4 refers to display mode 4; valid ones are 1-8
dcop kdesktop KBackgroundIface setWallpaper "$WP" 4 2> /dev/null
fi
# MATE after 1.6
gsettings set org.mate.background picture-filename "$WP" 2> /dev/null
# Cinnamon after 2.0
gsettings set org.cinnamon.desktop.background picture-uri "file://$WP" 2> /dev/null
if [ "$(gsettings get org.cinnamon.desktop.background picture-options 2>/dev/null)" == "'none'" ]; then
gsettings set org.cinnamon.desktop.background picture-options 'zoom'
fi
# Awesome Window Manager
# Be sure to start variety when you start awesome, such as by adding it to ~/.xinitrc
# NOTE: This config will change the wallpaper after your current awesome theme sets it.
# As such, the theme's wallpaper will briefly appear before being replaced with Variety's wallpaper.
if [[ "$XDG_SESSION_DESKTOP $DESKTOP_STARTUP_ID $DESKTOP_SESSION $XDG_CURRENT_DESKTOP" == *"awesome"* ]]; then
echo "local gears = require(\"gears\") gears.wallpaper.maximized(\"$1\", nil)" | awesome-client
fi
# =====================================================================================
# OPTIONAL: Show a notification on automatic wallpaper change.
# Display the original filename in the notification, but actually apply the post-effects image.
# name=$(echo "$3" | sed 's/\//\n/g'| tail -n 1)
# if [ "$2" == "auto" ]; then notify-send --icon "$WP" "Wallpaper changed" "$name" ; fi
exit 0