#!/bin/bash

# Mandatorily source xinitrc-common, which is common code shared between the
# Xsession and xinitrc scripts which has been factored out to avoid duplication
. /etc/X11/xinit/xinitrc-common

# Hack to symlink Glide3 lib to point to proper lib for either Voodoo 3 or 4/5
# This hack will go away in the future in XFree86 4.2.0 likely.
[ -x /usr/sbin/glidelink ] && /usr/sbin/glidelink

site_session=/etc/sysconfig/xinit-session
user_session="$HOME/.xinit.d/session"
site_xim=/etc/sysconfig/xinit-xim
user_xim="$HOME/.xinit.d/xim"
site_lang=/etc/sysconfig/xinit-lang
user_lang="$HOME/.xinit.d/lang"
custom_env="$HOME/.xinit.d/custom"

session_dir=/etc/X11/xinit/session.d
xim_dir=/etc/X11/xinit/xim.d
lang_dir=/etc/X11/xinit/lang.d

userresources="$HOME/.Xresources"
usermodmap="$HOME/.Xmodmap"
userxkbmap="$HOME/.Xkbmap"
sysresources=/etc/X11/xinit/Xresources
sysmodmap=/etc/X11/xinit/Xmodmap
sysxkbmap=/etc/X11/xinit/Xkbmap


# create default dotfiles if not exist
if [ ! -d "$HOME/.xinit.d" ]; then
	rm -rf "$HOME/.xinit.d"
	mkdir "$HOME/.xinit.d"
fi

if [ ! -f "$user_session" ]; then
	cp -f "$site_session" "$user_session" 2> /dev/null
fi

if [ ! -f "$user_xim" ]; then
	cp -f "$site_xim" "$user_xim" 2> /dev/null
fi

if [ ! -f "$user_lang" ]; then
	cp -f "$site_lang" "$user_lang" 2> /dev/null
fi


# merge in defaults
for i in "$sysresources" "$userresources"; do
    if [ -f "$i" ]; then
        /usr/bin/xrdb -merge "$i"
    fi
done

# language dependent settings
LANG_TYPE=`cat "$user_lang" 2> /dev/null`
if [ -f "$lang_dir/$LANG_TYPE" ]; then
        unset LC_COLLATE LC_CTYPE LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME
        unset LC_ALL LANG LANGUAGE
        echo "Reading $lang_dir/$LANG_TYPE"
        source "$lang_dir/$LANG_TYPE"
fi

# custom language environment
if [ -f "$custom_env" ]; then
	echo "Reading $custom_env"
	source "$custom_env"
fi

# merge in keymaps
if [ -f "$sysxkbmap" ]; then
    setxkbmap `cat "$sysxkbmap"`
    XKB_IN_USE=yes
fi

if [ -f "$userxkbmap" ]; then
    setxkbmap `cat "$userxkbmap"`
    XKB_IN_USE=yes
fi

if [ -z "$XKB_IN_USE" -a ! -L /etc/X11/X ]; then
    if grep '^exec.*/Xsun' /etc/X11/X > /dev/null 2>&1 && [ -f /etc/X11/XF86Config ]; then
	xkbsymbols=`sed -n -e 's/^[ 	]*XkbSymbols[ 	]*"\(.*\)".*$/\1/p' /etc/X11/XF86Config`
	if [ -n "$xkbsymbols" ]; then
	    setxkbmap -symbols "$xkbsymbols"
	    XKB_IN_USE=yes
	fi
    fi
fi

# xkb and xmodmap don't play nice together
if [ -z "$XKB_IN_USE" ]; then
    if [ -f "$sysmodmap" ]; then
	xmodmap "$sysmodmap"
    fi

    if [ -f "$usermodmap" ]; then
	xmodmap "$usermodmap"
    fi
fi

unset XKB_IN_USE

# read session type 
unset SESSION_TYPE
if [ -f "$user_session" ]; then
	SESSION_TYPE=`cat "$user_session" 2> /dev/null`
	export SESSION_TYPE
	if [ "$SESSION_TYPE" = "UserDefined" ]; then
		exec "$CK_XINIT_SESSION $HOME/.Xclients"
		echo "Failed to execute $HOME/.Xclients"
		exit 1
	fi
fi

# Prefix launch of session with ssh-agent if available and not already running.
SSH_AGENT=
if [ -x /usr/bin/ssh-agent -a -z "$SSH_AGENT_PID" ]; then
    if [ "x$TMPDIR" != "x" ]; then
        SSH_AGENT="/usr/bin/ssh-agent /bin/env TMPDIR=$TMPDIR"
    else
        SSH_AGENT="/usr/bin/ssh-agent"
  fi
fi

echo "Starting Xclients"
exec $CK_XINIT_SESSION $SSH_AGENT /etc/X11/xinit/Xclients
echo "Failed to execute /etc/X11/xinit/Xclients"
exit 1


