#!/bin/bash
#
# This script is run by Variety when a new wallpaper is set.
# You can use bash, python or whatever suits you for the script.
# Here you can put custom commands for setting the wallpaper on your specific desktop environment
# or run commands like notify-send to notify you of the change, or you can
# run commands that would theme your browser, login screen or whatever you desire.
#
# 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 [ "`echo $DESKTOP | grep Enlightenment`" ]; 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" -o "$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 ' connected' | wc -l)
    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/.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
    exit 0
fi

# KDE - User will have to manually choose ~/Pictures/variety-wallpaper/ as a slideshow folder with a short iterval.
# Afterwards, with the command below, Variety will just overwrite the single file there when changing the wallpaper
# and KDE will refresh it
if [ "`env | grep KDE_FULL_SESSION | tail -c +18`" == "true" ]; then
    mkdir -p "$(xdg-user-dir PICTURES)/variety-wallpaper"
    NEWWP="$(xdg-user-dir PICTURES)/variety-wallpaper/wallpaper-kde-$RANDOM.jpg"
    cp "$WP" "$NEWWP"
    touch "$NEWWP"
    PWDIR=`pwd`
    cd "$(xdg-user-dir PICTURES)/variety-wallpaper/"
    ls -tr "$(xdg-user-dir PICTURES)/variety-wallpaper/" | head -n -1 | xargs --no-run-if-empty rm
    cd "$PWDIR"
    exit 0
fi

# Cinnamon, for cases when it is detectable
if [ "$XDG_CURRENT_DESKTOP" == "X-Cinnamon" ]; then
    gsettings set org.cinnamon.background picture-uri "file://$WP" 2> /dev/null
    if [ "`gsettings get org.cinnamon.background picture-options`" == "'none'" ]; then
        gsettings set org.cinnamon.background picture-options 'zoom'
    fi

    gsettings set org.cinnamon.desktop.background picture-uri "file://$WP" 2> /dev/null
    if [ "`gsettings get org.cinnamon.desktop.background picture-options`" == "'none'" ]; then
        gsettings set org.cinnamon.desktop.background picture-options 'zoom'
    fi
    exit 0
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

# Deepin
if [ "$(gsettings list-schemas | grep com.deepin.wrap.gnome.desktop.background | wc -l)" -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|egrep -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

# i3-wm/Feh. Use Feh only for i3, as it may cause problems with Nautilus, (see bug https://bugs.launchpad.net/variety/+bug/1047083)
if [ "$XDG_CURRENT_DESKTOP" == "i3" ] || [ "$XDG_SESSION_DESKTOP" == "i3" ]; then
   feh --bg-fill "$WP" 2> /dev/null
fi

# MATE after 1.6
gsettings set org.mate.background picture-filename "$WP" 2> /dev/null

# MATE before 1.6
mateconftool-2 -t string -s /desktop/mate/background/picture_filename "$WP" 2> /dev/null

# Cinnamon after 1.8, before 2.0
gsettings set org.cinnamon.background picture-uri "file://$WP" 2> /dev/null

# Cinnamon after 2.0
gsettings set org.cinnamon.desktop.background picture-uri "file://$WP" 2> /dev/null

# Gnome 2
gconftool-2 -t string -s /desktop/gnome/background/picture_filename "$WP" 2> /dev/null


# openbox/nitrogen
#	check if openbox is running
#	if so, check if nitrogen is installed
#	now apply
if [ "$DESKTOP_SESSION" == "openbox" ]; then
    if dpkg-query -Wf'${db:Status-abbrev}' nitrogen 2>/dev/null | grep -q '^i'; then
        nitrogen --set-zoom-fill --save "$WP" 2> /dev/null
    fi
fi


# Awesome Window Manager

# Set the path to the wallpaper using awesome-client, which communicates with awesome using D-Bus.
# Be sure to start variety when you start awesome, such as by adding it to ~/.xinitrc in Arch Linux.

# echo "local gears = require(\"gears\") gears.wallpaper.maximized(\"$1\", s, true)" | awesome-client

# 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.


# Show a notification on wallpaper change (only when the change is automatic). Display the original filename, but 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
