#!/bin/bash

MODULE_DIRS=("/Library/Screen Savers" "/System/Library/Screen Savers" "$HOME/Library/Screen Savers")
SAVER="/System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app/Contents/MacOS/ScreenSaverEngine"

# killsaver <warn_if_not_active>
killsaver()
{
    PROC_NUMBER=`ps -a | awk '/System[^\.]*ScreenSaver/{ print $1 }'`
    
    if [ $PROC_NUMBER  ]
    then
        kill -TERM $PROC_NUMBER
    else
        if $1; then
            echo "The screen saver is not currently active."
        fi
    fi

}

# moduleexists <module_name>
moduleexists()
{
    MODULE="$1"
    EXISTS=false
    
    for DIR in "${MODULE_DIRS[@]}"
    do
        if [[ -e "$DIR/$MODULE.saver" || -e "$DIR/$MODULE.slideSaver" ]]; then
            EXISTS=true
        fi
    done
    
    $EXISTS
}


case "$1" in
    stop)
        killsaver true
        ;;
        
    list)
        # build up a list of modules, then sort them
        # when getting the module names, ' ' is translated to '_', to avoid 
        # unwanted breaks between words
        
        declare -a MODULES
    	for DIR in "${MODULE_DIRS[@]}"
        do
            MODULES=( ${MODULES[@]} `ls "$DIR" | sed 's/\..*aver//g' | tr ' \n' '_ '` )
        done
		
        echo "${MODULES[@]}" | tr ' _' '\n ' | sort
        ;;
        
    start)
        $SAVER -background 2>/dev/null &
        ;;
    
    "")
        # display help
        cat <<EOF
Usage:
 bgsaver             Show help
 bgsaver start       Start default screensaver (chosen in System Preferences)
 bgsaver stop        Stop screensaver
 bgsaver list        List available modules
 bgsaver <module>    Start specified module
EOF
        ;;
    
    *)
        if moduleexists "$1"; then
            # the ScreenSaver engine warns us about an obsolete "IgnoreForEvents" window property,
            # but still works. This may become a problem in the future, but for now, just ignore it
            killsaver false
            $SAVER -background -module "$1" 2>/dev/null &
        else
            echo "That module does not exist."
            exit 1
        fi

        ;;
esac

