# 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