#!/bin/bash

# Script to configure separate backgrounds for each Fluxbox Workspace
# Written by user PPC, modified by MX Devs Jan 2024
# Released under GPLv3

TEXTDOMAINDIR=/usr/share/locale 
export TEXTDOMAIN="mxfb-accessories"

#Confirmation Window

#TRANSLATORS Rotate backgrounds is a separate app which creates a wallpaper slideshow 
NOTIFICATION="$(gettext 'Rotate Backgrounds has been disabled to avoid conflict."')"
#TRANSLATORS Main window text - line 1 
MESSAGE1="$(gettext 'This app allows you to configure separate backgrounds for each Workspace')"
#TRANSLATORS Main window text - line 2 
HINT1="$(gettext 'A selection window for each currently configured workspace will be displayed.')"
#TRANSLATORS Main window text - line 3 
HINT2="$(gettext 'Select the background you want and click OK.')"

#TRANSLATORS Main window subtitle
NOTE0="$(gettext 'Notes')"
#TRANSLATORS Main window text - note 1 
NOTE1="$(gettext 'Setting up separate backgrounds deactivates Nitrogen, the standard background settings app.')"
#TRANSLATORS Main window text - note 2 
NOTE2="$(gettext 'Any background changes using Nitrogen will not be permanent until separate backgrounds are disabled.')"
#TRANSLATORS Main window text - note 3 
NOTE3="$(gettext 'You need to rerun this app if you subsequently add new workspaces.')"

#TRANSLATORS Main window title 
TITLE="$(gettext 'Separate workspace wallpapers')"
#TRANSLATORS Wallpaper selection window title 
TITLE2="$(gettext 'Wallpaper selector')"
#TRANSLATORS  
TITLE3="$(gettext 'Warning')"
CLASS=mxfb-sbg

#TRANSLATORS - button label
BUTTON1="$(gettext 'Cancel')"
#TRANSLATORS - button label
BUTTON2="$(gettext 'Disable')"
#TRANSLATORS - button label
BUTTON3="$(gettext 'Set up separate backgrounds')"

#TRANSLATORS - notification text
MESSAGE2="$(gettext 'Separate backgrounds have been disabled.')"
#TRANSLATORS - notification text
WARNING1="$(gettext 'There is no wallpaper image selected for Workspace')"
#TRANSLATORS - notification text
WARNING2="$(gettext 'Will substitute mx_blue.jpg to avoid any errors.')"

#TRANSLATORS Wallpaper selection window text - workspace number is added after WORKSPACE
WS_NUMBER="$(gettext 'Select background for WORKSPACE')"

ICON=/usr/share/icons/mxflux.png

yad --title="$TITLE" --window-icon=$ICON --class=$CLASS --text-align=center \
--width=500  --height=300 --center --buttons-layout=spread \
--text="\n<b>$MESSAGE1</b>\n\n$HINT1\n$HINT2\n\n$NOTE0\:\n- $NOTE1\n- $NOTE2\n- $NOTE3" \
--button="$BUTTON1":1 \
--button="$BUTTON2":2 \
--button="$BUTTON3":3 \ 

case $? in

1 | 252 )
    exit 0
;;
    
2 )

 #####
#DISABLE SEPARATE BACKGROUNDS
#####

    awk '!/ChangeWorkspace/' ~/.fluxbox/keys > temp && mv temp ~/.fluxbox/keys
    awk '!/#This executes fbsetbg/' ~/.fluxbox/keys > temp && mv temp ~/.fluxbox/keys
    
# block feh and enable nitrogen
    HASHCHECK_NITROGEN=$(grep '#nitrogen' $HOME/.fluxbox/startup)
    if [ ! -z "$HASHCHECK_NITROGEN" ]; then
        sed -i 's/#nitrogen/nitrogen/'  $HOME/.fluxbox/startup
    fi

    HASHCHECK_FEH=$(grep '#~/.fehbg' $HOME/.fluxbox/startup)
    if [ -z "$HASHCHECK_FEH" ]; then
        sed -i 's/~\/.fehbg/#~\/.fehbg/'  $HOME/.fluxbox/startup
    fi

    nitrogen --restore

    sed -i '/$full/d' $HOME/.fluxbox/lastwallpaper

    yad --title=$TITLE --class= mxfb-sbg --window-icon=$ICON \
    --width=300  --height=200 --center --text-align=center \
    --text="\n\n<b>$MESSAGE2</b>" --fixed --no-buttons --timeout=3 

    fluxbox-remote restart

    exit 0

;;
    
3 )

#####
#SET UP SEPARATE BACKGROUNDS
#####

# block nitrogen and enable fehbg
    HASHCHECK_NITROGEN=$(grep '#nitrogen' $HOME/.fluxbox/startup)
    if [ -z "$HASHCHECK_NITROGEN" ]; then
        sed -i 's/nitrogen/#nitrogen/'  $HOME/.fluxbox/startup
    fi

    HASHCHECK_FEH=$(grep '#~/.fehbg' $HOME/.fluxbox/startup)
    if [ ! -z "$HASHCHECK_FEH" ]; then
        sed -i 's/#~\/.fehbg/~\/.fehbg/'  $HOME/.fluxbox/startup
    fi

#Check if the keys file has already been edited to allow custom wallpapers for each workspace:
##check if the keys file has a ChangeWorkspace entry

    expression_to_find="ChangeWorkspace"
    x=$(grep $expression_to_find ~/.fluxbox/keys)

    if [ -z "$x" ]; then
        echo "\$x is empty- the keys file has not been edited, editing it to allow different wallpaper for each workspace"

#Backup the keys config file:
        if [ ! -d "~/.restore/fluxbox" ]; then
            mkdir -p ~/.restore/fluxbox
        fi

        cp ~/.fluxbox/keys ~/.restore/fluxbox/keys_BAK

#Append the needed changes to the keys config file (the "\" is needed not to replace the variables:
        CHECK_KEYS=$(grep 'ChangeWorkspace :Exec' $HOME/.fluxbox/keys)
        if [ -z "$CHECK_KEYS" ]; then
            echo "#This executes fbsetbg every time workspace is changed to load <workspace number>.jpg from ~/.fluxbox/backgrounds/numbered/ 
ChangeWorkspace :Exec fbsetbg ~/.fluxbox/backgrounds/numbered/\$(xprop -root _NET_CURRENT_DESKTOP |awk '{print \$3+1}').jpg" >> ~/.fluxbox/keys
        fi
    else
        echo "\$x is NOT empty- the keys file seems to already allow custom wallpapers for each workspace."

    fi

#Create the needed folder
    mkdir -p  ~/.fluxbox/backgrounds/numbered/

#Check how many Workspaces Fluxbox currently has:
    number_of_workspaces=$(xdotool get_num_desktops)

#Remove existing numbered wallpapers to avoid failure when wallpaper is symlinked to /usr/share/backgrounds
    if [ -f "$HOME/.fluxbox/backgrounds/numbered/*.jpg" ]; then
        rm -r $HOME/.fluxbox/backgrounds/numbered/*.jpg
    fi

#Disable Rotate backgrounds if running
    STRING="Background.Delay: 0"

    if ! grep -q "$STRING" $HOME/.ideskrc;
    then
        sed -i 's/^\([[:blank:]]*Background\.Delay:\).*/\1 0/' "$HOME/.ideskrc"

        yad --title=$TITLE --window-icon=$ICON --class=$CLASS \
        --timeout=3 --no-buttons --geometry 500x100 --text-align=center \
        --text="\n<b>$NOTIFICATION</b>"
    fi

#clear normal thumbnail cache so that yad shows large thumbnails

    delete_thumb(){
    full_path="file://$(realpath -s "$1")"
    md5name=$(printf %s "${full_path// /%20}" | md5sum)
    rm $HOME/.cache/thumbnails/normal/${md5name%% *}.png
    }

    export -f delete_thumb
    
    source $HOME/.config/user-dirs.dirs

    bg_list=$(find /usr/share/backgrounds -type f \( -name '*.png' -o -name '*.jpg' \); find $HOME/.fluxbox/backgrounds -type f \( -name '*.png' -o -name '*.jpg' \); find $XDG_PICTURES_DIR/* backgrounds -type f \( -name '*.png' -o -name '*.jpg' \))

    for i in $bg_list; do
        delete_thumb $i
    done


#Loop for as many workspaces as there are, selecting one wallpaper for each workspace
    for ((n=1;n<=$number_of_workspaces;n++))
    do
        cd /usr/share/backgrounds/

# select wallpaper:
        wallpaper=$(yad --title="$TITLE2" --window-icon=$ICON --class=$CLASS \
        --width=800  --height=400 --center --text-align=center \
        --file --image-filter --add-preview --large-preview \
        --text="<b>\n$WS_NUMBER $n\n</b>")
    
# copy and rename wallpaper to match the current Workspace number:
        cp $wallpaper  ~/.fluxbox/backgrounds/numbered/$n.jpg
 
        if [ ! "$?" = "0" ]; then
            echo User canceled the script
            exit 0
        fi
 
#Check if wallpaper for current Workspace exists, if not, use a default one (mx_blue.jpg), to avoid errors. NOTE: if the users does not select any wallpaper at this time but a wallpaper for that workspace already existed, that previous selection will be maintained

        FILE=$n.jpg

        cd ~/.fluxbox/backgrounds/numbered/

        if [ ! -f "$FILE" ]; then
            echo "File $FILE does not exist, using a default one- mx_blue.jpg"
    
            yad --title="$TITLE3" --class=$CLASS --center --window-icon=$ICON \
            --text="$WARNING1 $n\n$WARNING2"
    
            cp  /usr/share/backgrounds/mx_blue.jpg ~/.fluxbox/backgrounds/numbered/$n.jpg
        fi

    done

    echo Finished setting up workspace wallpapers, restarting fluxbox

#Implement the changes: 
    fluxbox-remote restart

    pgrep -u $(id -u)  -x idesk >/dev/null &&  idesktoggle idesk refresh

    killall -SIGUSR1 conky 2>/dev/null

    echo fluxbox restarted, script finished

;;

esac
