#!/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.) # # $4: Fourth parameter comes from the display mode setting: "os" means that set_wallpaper should try to # leave the OS setting unchanged. "zoom" means to try to fill the screen fully with the provided image. # Other parameters that could be passed are the scaling modes used by GNOME: # "centered", "scaled", "stretched", "zoom", "spanned", "wallpaper" # TODO: Ideally all sections below for different DEs would take this setting into account # # 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 "$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 gsettings set org.gnome.desktop.background picture-uri-dark "file://$WP" 2> /dev/null if [[ "$4" =~ ^(wallpaper|centered|scaled|stretched|zoom|spanned)$ ]]; then gsettings set org.gnome.desktop.background picture-options "$4" fi 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 [[ "$4" =~ ^(wallpaper|centered|scaled|stretched|zoom|spanned)$ ]]; then gsettings set org.gnome.desktop.screensaver picture-options "$4" fi 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 [[ "$4" =~ ^(wallpaper|centered|scaled|stretched|zoom|spanned)$ ]]; then gsettings set com.deepin.wrap.gnome.desktop.background picture-options "$4" fi 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" "LeftWM" "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 # TODO: This should take the scaling parameter $4 into account and use other options than --bg-fill feh --bg-fill "$WP" 2> /dev/null elif command -v "nitrogen" >/dev/null 2>&1; then # TODO: This should take the scaling parameter $4 into account and use other options than --set-zoom-fill nitrogen --set-zoom-fill --save "$WP" 2> /dev/null fi fi if [[ -n $SWAYSOCK ]]; then # If swaybg is available, use it as prevents system freeze. # See https://github.com/swaywm/sway/issues/5606 if command -v "swaybg" >/dev/null 2>&1; then # Grey background flicker is prevented by killing old swaybg process after new one. # See https://github.com/swaywm/swaybg/issues/17#issuecomment-851680720 PID=`pidof swaybg` swaybg -i "$WP" -m fill & if [ ! -z "$PID" ]; then sleep 1 kill $PID 2>/dev/null fi else swaymsg output "*" bg "$WP" fill 2> /dev/null fi 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 if [ "$(gsettings get org.mate.desktop.background picture-options 2>/dev/null)" == "'none'" ]; then gsettings set org.mate.desktop.background picture-options 'zoom' fi if [[ "$4" =~ ^(wallpaper|centered|scaled|stretched|zoom|spanned)$ ]]; then gsettings set org.mate.desktop.background picture-options "$4" fi # 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 if [[ "$4" =~ ^(wallpaper|centered|scaled|stretched|zoom|spanned)$ ]]; then gsettings set org.cinnamon.desktop.background picture-options "$4" 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 # ===================================================================================== exit 0