#!/bin/sh

PROG="${0##*/}" #program name

if [ "`id -u`" == "0" ];then
    MAINCONFIG="/etc/X11/xorg.conf"
    WORKCOPY="/var/cache/alterator/xorg.work"
else
    MAINCONFIG="$HOME/xorg.conf"
    WORKCOPY="$HOME/tmp/xorg.work"
fi
ANSWER="/var/cache/alterator/xtest-answer"

TEMPLATECONFIG="/usr/share/alterator-x11/xorg.conf"

XCONFTOOL="/usr/bin/xconf"
MONITORTOOL="/usr/bin/monitorinfo"
VCARDTOOL="/usr/bin/vcardinfo"
MOUSETOOL="/usr/bin/mousescan"
KBDTOOL="/usr/bin/xkbdinfo"
SETGLTOOL="/usr/sbin/setgl"

TEMPLATETOOL="/usr/bin/x11createconfig"

print_version()
{
	cat <<EOF
$PROG version @VERSION@

Written by Stanislav Ievlev

Copyright (C) 2003-2004 ALT Linux Team
EOF
	exit
}


print_usage()
{
	[ "$1" = 0 ] || exec >&2
	cat <<EOF
Usage: $PROG [options] 

alterator backend to work with X11 config file (also testing this configuration)

Valid options are:
  -h, --help	display help screen
  -v, --version	display version information
  -l, --list	get list of available vendors/drivers
  -t, --type	check for vendor/driver existance
  -d, --delete	(empty action, required for backend)
  -r, --read	read driver information
  -w, --write	(empty action, required for backend)

Report bugs to <inger@altlinux.org>
EOF
	[ -n "$1" ] && exit "$1" || exit
}

#quote filenames,to made it usable in filesystem
encode_obj_name()
{
	#hide / symbols - both for input and output
	sed $sed_options 's,%,%%,g
	s,|,%|,g
	s,/,|,g'
}

decode_obj_name()
{
    local separator=$(printf '\007')
    sed  $sed_options "s,%\(.\),$separator\1,g
	    s,\([^$separator]\|^\)|,\1/,g
	    s,\([^$separator]\|^\)|,\1/,g
	    s,$separator,,g"
}

made_workcopy()
{
	if [ -f "$MAINCONFIG" ] ;then
		cp "$MAINCONFIG" "$WORKCOPY"
	else
		"$TEMPLATETOOL" >"$WORKCOPY"
	fi
}

sure_workcopy()
{
	[ -f "$WORKCOPY" ]  || made_workcopy
}


read_config_name()
{
	if [ -f "$WORKCOPY" ] ;then
		echo "$WORKCOPY"
	else
		echo "$MAINCONFIG"
	fi
}

is_ok_answer()
{
	[ -f "$ANSWER" ] && cat "$ANSWER"|grep -qs ok 
}

TEMP=`getopt -n $PROG -o h,v,l:,d:,r:,w:,t: -l help,version,list:,delete:,read:,write:,type: -- "$@"` || print_usage
eval set -- "$TEMP"

while :; do
	case "$1" in
		-h|--help) print_usage 0
			;;
		-v|--version) print_version
			;;
		-l|--list)
			shift;dir="$1";
			if [ "$dir" = "/" ] ;then
				echo "autodetect r"
				echo "data r"
				echo "commit r"
				echo "test r"
			fi
			;;
		-d|--delete)
			#ignore
			shift;drv="$1";
			;;
		-t|--type)
			shift;drv="$1";
			if [ "$drv" == "data" ];then
				echo "data r"
			elif [ "$drv" == "autodetect" ];then
				echo "autodetect r"
			elif [ "$drv" = "commit" ];then
				echo "commit r"
			elif [ "$drv" = "test" ];then
				is_ok_answer && echo "test r"
			fi
			;;
		-r|--read)
			shift;drv="$1";
			if [ "$drv" = "data" ];then
				confname=$(read_config_name)
				video=$($XCONFTOOL -d $confname|cut -f1 -d'|'|encode_obj_name)
				monitor=$($XCONFTOOL -n $confname|cut -f1 -d'|'|encode_obj_name)
				mouse=$($XCONFTOOL -m $confname|encode_obj_name)
				color=$($XCONFTOOL -c $confname|encode_obj_name)
				resolution=$($XCONFTOOL -r $confname|encode_obj_name)
				[ -n "$video" ] && echo "card:$video"
				[ -n "$monitor" ] && echo "monitor:$monitor"
				[ -n "$mouse" ] && echo "mouse:$mouse"
				[ -n "$color" ] && echo "color:$color"
				[ -n "$resolution" ] && echo "resolution:$resolution"
			elif [ "$drv" == "autodetect" ];then
				$TEMPLATETOOL -c|encode_obj_name
			fi
			;;
		-w|--write)
			shift;drv="$1";
			rm -f "$ANSWER" #invalidate answer
			if [ "$drv" = "data" ];then
				sure_workcopy
				while read l; do
					option=${l%%:*}
                                        value=$(echo "${l#*:}"|decode_obj_name)
					[ -n "$value" ] &&
					case "$option" in
						monitor)
							$MONITORTOOL "$value"|$XCONFTOOL -N "$value" $WORKCOPY $WORKCOPY
							;;
						card)
							$VCARDTOOL "$value"|$XCONFTOOL -D "$value" $WORKCOPY $WORKCOPY
							;;
						color-depth)
							$XCONFTOOL -C "$value" $WORKCOPY $WORKCOPY
							;;
						resolution)
							$XCONFTOOL -R "$value" $WORKCOPY $WORKCOPY
							;;
						kbd)
							[ -s "/etc/sysconfig/kbd" ] && . /etc/sysconfig/kbd
							[ -z "$LAYOUT" ] && LAYOUT="UnknownKeyboard"
							$KBDTOOL|$XCONFTOOL -K "$LAYOUT" "$WORKCOPY" "$WORKCOPY"
							;;
						*)
						;;
					esac
				done
				#TODO:fix "-M/m" option to support multiple mices
				#mousename=$($MOUSETOOL |cut -f3|sed -r 's,\"(.*)\",\1,')
				#[ -z "$mousename" ] && mousename="UnknownMouse"
				#$MOUSETOOL -v|$XCONFTOOL -M "$mousename" "$WORKCOPY" "$WORKCOPY"
				#auto_keyboard_tool
			elif [ "$drv" = "commit" ] ;then
				[ -f "$WORKCOPY" ] && mv -f "$WORKCOPY" "$MAINCONFIG"
			elif [ "$drv" = "test" ] ;then
			    [ -x "$SETGLTOOL" ] && $SETGLTOOL "$WORKCOPY" 2>/dev/null ||:
			    [ -f "$WORKCOPY" ] && XAUTHORITY= /usr/X11R6/bin/xinit /usr/bin/xtest -- :9 -xf86config "$WORKCOPY" 
    			    is_ok_answer || exit 1
			fi
			;;
		--) shift; break
			;;
		*) Fatal "unrecognized option: $1"
			;;
	esac
	shift
done
