# Note: LDM_SESSION contains a whole command, e.g.:
# LDM_SESSION="gnome-session --session=gnome-classic"
# That matches the Exec line of xsession.desktop files,
# while .dmrc contains only the xsession.desktop file name, e.g.
# Session=gnome-classic
# So there's some code overhead for converting between those two.

# for code readability
do_ssh(){
    ssh -S "$LDM_SOCKET" "$LDM_SERVER" "$@" 2>/dev/null
}

# $1 = key, case sensitive
get_dmrc_key() {
    echo "$dmrc" | sed -n "s/^$1=//p"
}

# $1 = key, case sensitive
# $2 = value
put_dmrc_key() {
    # Don't do anything if the key already contains that value
    test "$(get_dmrc_key "$1")" = "$2" && return

    dmrc=$(echo "$dmrc" | sed '/\[Desktop\]/d')
    dmrc=$(echo "$dmrc" | sed "/^$1=/d")
    dmrc="[Desktop]
$1=$2
$dmrc"
    changed=true
}

dmrc=$(do_ssh cat .dmrc)
case "$LDM_SESSION" in
    failsafe)
        # No need to access the user's .dmrc for failsafe sessions (man Xsession)
        ;;
    default|'')
        # If the user has a valid session stored in his .dmrc, use it
        dmrc_session=$(get_dmrc_key "Session")
        if [ -n "$dmrc_session" ]; then
            dmrc_exec=$(do_ssh sed -n "s/^Exec=//p" "/usr/share/xsessions/$dmrc_session.desktop")
            if [ -n "$dmrc_exec" ]; then
                LDM_SESSION="$dmrc_exec"
            fi
        fi
        ;;
    *)
        # If there's a corresponding xsession.desktop file, save its name to .dmrc
        dmrc_session=$(do_ssh "grep -lR '^Exec=$LDM_SESSION$' /usr/share/xsessions/ | sed -n '/\/usr\/share\/xsessions\/\(.*\)\.desktop/{s//\1/p;q}'")
        if [ -n "$dmrc_session" ]; then
            put_dmrc_key "Session" "$dmrc_session"
        fi
        ;;
esac

case "$LDM_LANGUAGE" in
    default|'')
        # If the user has a language stored in his .dmrc, use it
        LDM_LANGUAGE=$(get_dmrc_key "Language")
        ;;
    *)
        put_dmrc_key "Language" "$LDM_LANGUAGE"
        ;;
esac

if [ -n "$changed" ]; then
    do_ssh "echo '$dmrc' > .dmrc"
fi

