#!/bin/sh
#
# Functions for application launcher

# Variables
#
TERMID=""
TERMCOLOR=""
TERMGEOM=""
NOCOLORTERM=0
SWITCHFILE=~/.launch/.switch
TERM_SWITCH="X" # E == Eterm, X == xterm
if [ -f $SWITCHFILE ]; then
    TERM_SWITCH="E"
fi
if [ "$DISPLAY" != "" ]; then
    WORKSPACE=`getpwmws`
fi
if [ "$SHADE" = "" ]; then
    SHADE=18
fi
MAXLN=10000
HOST=`cat /etc/hostname`


# Geometry and fonts definitions
#
if [ "$DISPLAY" != "" ]; then
    SCREENDIMS=`xdpyinfo | grep dimensions | awk '{print $2}' | head -n 1`
    if [ "$SCREENDIMS" = "800x600" ]; then
        LFTTERM="80x59+0+0"
        RGHTERM="50x52+490+0"
        UPLTERM="80x29+0+0"
        DNLTERM="80x29+0+300"
        UPRTERM="50x29+490+0"
        DNRTERM="50x23+490+300"
        MAXTERM="131x59+2+0"
        UNITERM="92x51+120+6"
        FONT="-*-fixed-medium-r-normal-*-10-*-*-*-*-*-iso8859-15"
        ALTFONT="-*-neep-medium-r-normal-*-11-*-*-*-*-*-iso8859-15"
    elif [ "$SCREENDIMS" = "1152x900" ]; then
        LFTTERM="80x68+0+0"
        RGHTERM="80x63-0+0"
        UPLTERM="80x30+0+0"
        DNLTERM="80x37+0-0"
        UPRTERM="80x30-0+0"
        DNRTERM="80x32-0-65"
        MAXTERM="163x68+0+0"
        UNITERM="92x51+248+6"
        FONT="-*-fixed-medium-r-normal-*-13-*-*-*-*-*-iso8859-15"
        ALTFONT="-*-neep-medium-r-normal-*-15-*-*-*-*-*-iso8859-15"
    else
        LFTTERM="80x67+0+0"
        RGHTERM="80x62-0+0"
        UPLTERM="80x30+0+0"
        DNLTERM="80x36+0-0"
        UPRTERM="80x30-0+0"
        DNRTERM="80x31-0-73"
        MAXTERM="141x67+0+0"
        UNITERM="92x51+120+6"
        FONT="-*-fixed-medium-r-normal-*-15-*-*-*-*-*-iso8859-15"
        ALTFONT="-*-neep-medium-r-normal-*-15-*-*-*-*-*-iso8859-15"
    fi
fi


# Terminal emulators
#
if [ $debug = 1 ]; then
    echo "Host : $HOST"
fi


# Functions
#
do_setterm () {
    if [ "$HOST" = "julie" ]; then
        if [ "$TERM_SWITCH" = "E" ]; then
            LFTTERM="80x68"
            RGHTERM="80x63+582+0"
            UPLTERM="80x30"
            DNLTERM="80x37+0+409"
            UPRTERM="80x30+582+0"
            DNRTERM="80x32+582+409"
            MAXTERM="163x68"

            TERMCMD="Eterm"
            #TERMOPT="--select-line --login-shell off -c SpringGreen"
            TERMOPT=""
            TERMFNT="-F $FONT"
        else
            TERMCMD="xterm"
            TERMOPT="-bc"
            TERMFNT="-fn $FONT"
        fi
    else
        TERMCMD="Eterm"
        TERMOPT="--select-line --menubar off --login-shell off -c SpringGreen"
        TERMFNT="-F $FONT"
    fi
}


do_settermname () {
    WSINFOS="$WORKSPACE-$2"
    if [ "$1" != "" ]; then
        if [ "$TERMCMD" = "Eterm" ]; then
            TERMID="-T $1 --name $1 --icon-name $WSINFOS"
        elif [ "$TERMCMD" = "xterm" ]; then
            TERMID="-T $1 -name $1 -n $WSINFOS"
        else
            TERMID=""
        fi
    fi
}

do_get_usedspace () {
    grepexp="Command:.* [xE]term .* (-n|--icon-name) $WORKSPACE"
    sedexp="s/.*-n \([^ ]*\) .*/\1/;s/.*--icon-name \([^ ]*\) .*/\1/;s/$WORKSPACE-//"
    ul=0
    ur=0
    dl=0
    dr=0
    clients=`xlsclients -l | grep -E "$grepexp" | sed -e "$sedexp"`

    for pos in $clients ; do
        case $pos in
            left)      ul=1; dl=1;;
            right)     ur=1; dr=1;;
            upleft)    ul=1;;
            downleft)  dl=1;;
            upright)   ur=1;;
            downright) dr=1;;
            max)       ul=1; dl=1; ur=1; dr=1;;
            alone)     ul=1; dl=1; ur=1; dr=1;;
            user)      ;;
            *)         ;;
        esac
    done

    if [ $debug = 1 ]; then
        echo "Clients     : $clients"
        echo "Used spaces : ul=$ul dl=$dl ur=$ur dr=$dr"
    fi
}


do_set_geom () {
    parg=$1
    case $parg in
        left)       GEOM=$LFTTERM;;
        right)      GEOM=$RGHTERM;;
        upleft)     GEOM=$UPLTERM;;
        downleft)   GEOM=$DNLTERM;;
        upright)    GEOM=$UPRTERM;;
        downright)  GEOM=$DNRTERM;;
        max)        GEOM=$MAXTERM;;
        alone)      GEOM=$UNITERM;;
        user)       GEOM=$2;;
        *)          GEOM="80x25";;
    esac
}

do_try_sides () {
    if [ $1 = 1 -o $2 = 1 ]; then
        if [ $3 = 0 -a $4 = 0 ]; then
            LGEO=$5
            do_set_geom $LGEO
        elif [ $1 = 0 ]; then
            LGEO=$6
            do_set_geom $LGEO
        elif [ $2 = 0 ]; then
            LGEO=$7
            do_set_geom $LGEO
        elif [ $3 = 0 ]; then
            LGEO=$8
            do_set_geom $LGEO
        elif [ $4 = 0 ]; then
            LGEO=$9
            do_set_geom $LGEO
        fi
    fi
}

do_try_corners () {
    if [ $1 = 1 ]; then
        if [ $2 = 0 ]; then
            LGEO=$3
            do_set_geom $LGEO
        elif [ $4 = 0 ]; then
            LGEO=$5
            do_set_geom $LGEO
        elif [ $6 = 0 ]; then
            LGEO=$7
            do_set_geom $LGEO
        fi
    fi
}

do_settermgeom () {
    garg=$1

    do_get_usedspace
    do_set_geom $garg $2
    if [ $FORCE = 0 ]; then
        case $garg in
            left) do_try_sides $ul $dl $ur $dr right upleft downleft upright downright;;
            right) do_try_sides $ur $dr $ul $dl left upright downright upleft downleft;;
            upleft)  do_try_corners $ul $ur upright $dl downleft $dr downright;;
            downleft) do_try_corners $dl $dr downright $ul upleft $ur upright;;
            upright)  do_try_corners $ur $ul upleft $dr downright $dl downleft;;
            downright) do_try_corners $dr $dl downleft $ur upright $ul upleft;;
        esac
    fi
    if [ "$TERMCMD" = "Eterm" ]; then
        TERMGEOM="--geometry $GEOM"
    elif [ "$TERMCMD" = "xterm" ]; then
        TERMGEOM="-geometry $GEOM"
    else
        TERMGEOM=""
    fi
}

do_settermcolor () {
    carg=$1
    NC="grey92"
    case $carg in
        casio)  FG="black";  BG="DeepSkyBlue2"; NOCOLORTERM=1;;
        lcd)    FG="grey24"; BG="#7E9E69";      NOCOLORTERM=1;;
        normal) FG=$NC;      BG="black";;
        vidinv) FG="black";  BG="white";        NOCOLORTERM=1;;
        mono)   FG="green";  BG="black";        NOCOLORTERM=1;;
        dos)    FG="white";  BG="blue";         NOCOLORTERM=1;;
        *)      FG="";;
    esac
    TERMCOLOR=""
    if [ "$FG" != "" ]; then
        if [ "$TERMCMD" = "Eterm" ]; then
            TERMCOLOR="-f $FG -c $FG -b $BG"
        elif [ "$TERMCMD" = "xterm" ]; then
            TERMCOLOR="-fg $FG -cr $FG -bg $BG -bd $BG"
        fi
    else
        if [ "$TERMCMD" = "Eterm" ]; then
            TERMCOLOR="-f $NC -c $NC --trans --tint 0xffffff --shade $SHADE"
        fi
    fi
}

do_settermbar () {
    if [ $1 = 1 ]; then
        if [ "$TERMCMD" = "Eterm" ]; then
            TERMBAR="-L $MAXLN --scrollbar on" 
        elif [ "$TERMCMD" = "xterm" ]; then
            TERMBAR="-sl $MAXLN -sb" 
        else
            TERMBAR=""
        fi
    else
        if [ "$TERMCMD" = "Eterm" ]; then
            if [ "$2" = "" ]; then
                if [ "$HOST" != julie ]; then
                    TERMBAR="-L $MAXLN --scrollbar off" 
                else
                    TERMBAR="-L 0 --scrollbar off"
                fi
            else
                TERMBAR="-L 0 --scrollbar off"
            fi
        elif [ "$TERMCMD" = "xterm" ]; then
            TERMBAR="-sl 0 +sb" 
        else
            TERMBAR=""
        fi
    fi
}

do_help () {
    echo "terminal options :"

    echo "  -h          : this help"
    echo "  -i string   : set identity to 'string'"
    echo "  -s style    : set terminal preset geometry"
    echo "      left      : full length at left of screen"
    echo "      right     : full length at right of screen"
    echo "      upleft    : upper corner at left of screen"
    echo "      downleft  : lower corner at left of screen"
    echo "      upright   : upper corner at right of screen"
    echo "      downright : lower corner at right of screen"
    echo "      max       : full screen"
    echo "      alone     : center of the screen"
    echo "  -S style    : does the same thing as -s but force the position"
    echo "  -c color    : set color style"
    echo "      casio  : casio style (black on bright blue)"
    echo "      lcd    : lcd style (black on green-grey)"
    echo "      normal : normal (white on black)"
    echo "      vidinv : video inverse (black on white)"
    echo "      mono   : oldstyle green on black"
    echo "      dos    : old dos style (white on blue)"
    echo "  -g geometry : set terminal geometry (WxH+X+Y)"
    echo "  -e command  : launch command in terminal"
    echo "  -b          : set scrollbar"
    echo "  -a          : alternate font"
    exit
}

do_openterm () {
    LBAR=0
    LCMD=""
    LNAM=""
    LGEO="left"
    LCOL=""
    UGEO=""
    FORCE=0
    while [ "$1" != "" ]; do
        arg=$1
        case $arg in
            -h) do_help;;
            -a) FONT=$ALTFONT;;
            -b) LBAR=1;;
            -i) LNAM="$2"; shift;;
            -s) LGEO="$2"; shift;;
            -S) LGEO="$2"; FORCE=1; shift;;
            -c) LCOL="$2"; shift;;
            -g) LGEO="user"; UGEO="$2"; shift;;
            -X) TERM_SWITCH="X";;
            -E) TERM_SWITCH="E";;
            -e) LCMD="$2"
                shift 2
                while [ "$1" != "" ]; do
                    LCMD="$LCMD $1"
                    shift
                done;;
        esac
        shift
    done
    if [ "$DISPLAY" != "" ]; then
        do_setterm
        do_settermgeom $LGEO $UGEO
        do_settermname $LNAM $LGEO
        do_settermcolor $LCOL
        do_settermbar $LBAR "$LCMD"
        if [ $NOCOLORTERM = 1 ]; then
            export NOCOLORTERM
        fi
        if [ "$LCMD" != "" ]; then
            LCMD="-e $LCMD"
        fi
        if [ $debug = 1 ]; then
            echo $TERMCMD $TERMOPT $TERMBAR $TERMFNT $TERMID $TERMGEOM $TERMCOLOR $LCMD "&"
        else
            $TERMCMD $TERMOPT $TERMBAR $TERMFNT $TERMID $TERMGEOM $TERMCOLOR $LCMD &
        fi
    else
        if [ $debug = 1 ]; then
            echo "$LCMD"
        else
            $LCMD
        fi
    fi
}

if [ $debug = 1 ]; then
    echo "Functions loaded..."
fi
