#!/bin/bash
# AQ
# 20160303

DEVICE=`xinput_calibrator --list | sed "s/Device \"//;s/\" id.*//"`
if [ "$DEVICE" == "No calibratable devices found." ];then
    logger -t calib "Устройств не найдено"
    zenity --error --text="No calibratable devices found."
    exit 1
fi

NUMMONITORS=`xrandr | sed "/LVDS/d" | grep -e " connected " | wc | awk '{print $1}'`
rm -rf /home/terminal/atm/resources/ports.blacklist

if [ $NUMMONITORS -gt 1 ]; then 
    logger -t calib "multi head"
    OUTPUTS=`xrandr | grep -e " connected " | awk '{print $1}'`
    COUNT=0
    for output in $OUTPUTS; do
	logger -t calib "Выход $output"
	MODE=`xrandr | grep -A 3 -e "$output" | grep -e "*" | awk '{print $1}'`
	logger -t calib "Режим $MODE"
	ZEROMON=`xrandr | grep -e "+0+0" | awk  '{print  $1}'`
	if [ "$ZEROMON" == "$output" ]; then
	    DEFOUT="$output"
	    DEFMODE="$MODE"
	else
	    SECOUT="$output"
	    SECMODE="$MODE"
	fi
	
	(( COUNT++ ))
    done

    logger -t calib "Устройство $DEVICE"
    logger -t calib "Главный экран $DEFOUT $DEFMODE"
    logger -t calib "Второй экран $SECOUT $SECMODE"
    logger -t calib "Отключаем $SECOUT"
    xrandr --output $SECOUT --off
    logger -t calib "Сброс настроек"
    xinput set-int-prop "$DEVICE" "Evdev Axis Calibration" 32 0 16000 0 16000
    xinput set-int-prop "$DEVICE" "Evdev Axes Swap" 8 0
    xinput set-prop "$DEVICE" --type=float "Coordinate Transformation Matrix" 1 0 0 0 1 0 0 0 1
    logger -t calib "Запуск калибровки"
    xinput="$(xinput_calibrator --misclick 50 --output-type xinput | grep 'xinput set-int-prop')"
    logger -t calib "$xinput"
    logger -t calib "Включаем второй монитор"
    xrandr --output $SECOUT --mode $SECMODE --right-of $DEFOUT
    xrandr --output $DEFOUT --primary

    DEFW=`echo $DEFMODE | sed "s/x.*.$//"`
    DEFH=`echo $DEFMODE | sed "s/^.*.x//"`
    SECW=`echo $SECMODE | sed "s/x.*.$//"`
    SECH=`echo $SECMODE | sed "s/^.*.x//"`

    CENTERX=$( echo "$DEFW/2" | bc )
    CENTERY=$( echo "$DEFH/2" | bc )
    logger -t calib "Main screen center: $CENTERX $CENTERY"
    if [ "$CENTERX" == "" ]; then
        CENTERX=100
	CENTERY=100
        logger -t calib "Fallback center screen"
    fi

    TRANSFORM1=$( echo "scale=2;$DEFW/($DEFW+$SECW)" | bc )
    if [ $DEFH -gt $SECH ];then
	TRANSFORM2=$( echo "scale=2;$DEFH/$DEFH" | bc )
    else
	TRANSFORM2=$( echo "scale=2;$DEFH/$SECH" | bc )
    fi

    # fallback
    if [ "$TRANSFORM1" == "" ]; then
        TRANSFORM1="0.5"
        logger -t calib "Fallback TRANSFORM1"
    fi
    if [ "$TRANSFORM2" == "" ]; then
        TRANSFORM2="0.5"
        logger -t calib "Fallback TRANSFORM2"
    fi
    logger -t calib "Transform: $TRANSFORM1 $TRANSFORM2"

    xinput set-prop "$DEVICE" --type=float "Coordinate Transformation Matrix" $TRANSFORM1 0 0 0 $TRANSFORM2 0 0 0 1

    logger -t calib "Пишем настройки"

    echo "#!/bin/bash" > /home/terminal/bin/calibrate.done
    echo "NUMMONITORS=\`xrandr | grep -e \" connected \" | wc | awk '{print \$1}'\`" >> /home/terminal/bin/calibrate.done
    echo 'if [ $NUMMONITORS -gt 1 ]; then' >> /home/terminal/bin/calibrate.done
    echo "# multihead" >> /home/terminal/bin/calibrate.done
    echo "xrandr --output $DEFOUT --mode $DEFMODE --primary" >> /home/terminal/bin/calibrate.done
    echo "xrandr --output $SECOUT --mode $SECMODE --right-of $DEFOUT" >> /home/terminal/bin/calibrate.done
    echo "xdotool mousemove --sync $CENTERX $CENTERY" >> /home/terminal/bin/calibrate.done
    echo "xdotool click 1" >> /home/terminal/bin/calibrate.done
    echo "$xinput" >> /home/terminal/bin/calibrate.done
    echo "xinput set-prop \"$DEVICE\" --type=float \"Coordinate Transformation Matrix\" $TRANSFORM1 0 0 0 $TRANSFORM2 0 0 0 1" >> /home/terminal/bin/calibrate.done
    echo "xrandr --output $SECOUT --mode $SECMODE --right-of $DEFOUT" >> /home/terminal/bin/calibrate.done
    echo "else" >> /home/terminal/bin/calibrate.done
    echo "# singlehead" >> /home/terminal/bin/calibrate.done
    echo "xrandr --output $DEFOUT --mode $DEFMODE --primary" >> /home/terminal/bin/calibrate.done
    echo "xdotool mousemove --sync $CENTERX $CENTERY" >> /home/terminal/bin/calibrate.done
    echo "xdotool click 1" >> /home/terminal/bin/calibrate.done
    echo "$xinput" >> /home/terminal/bin/calibrate.done
    echo "fi" >> /home/terminal/bin/calibrate.done

    chmod 755 /home/terminal/bin/calibrate.done
    echo -e "[Desktop Entry]\nType=Application\nName=xinput\nExec=/home/terminal/bin/calibrate.done" > $HOME/.config/autostart/xinput.desktop
else
    logger -t calib "single head"
    logger -t calib "Устройство $DEVICE"
    logger -t calib "Сброс настроек"
    xinput set-int-prop "$DEVICE" "Evdev Axis Calibration" 32 0 16000 0 16000
    xinput set-int-prop "$DEVICE" "Evdev Axes Swap" 8 0
    xinput set-prop "$DEVICE" --type=float "Coordinate Transformation Matrix" 1 0 0 0 1 0 0 0 1
    logger -t calib "Запуск калибровки"
    xinput="$(xinput_calibrator --misclick 50 --output-type xinput | grep 'xinput set-int-prop')"
    logger -t calib "$xinput"

    SWAP=`echo $xinput | grep Swap`
    if [ "$SWAP" != "" ];then
	OLD_IFS=$IFS
        IFS=$'\n'
        for line in ${xinput[@]} ; do
            SWAP=`echo $line | grep Swap`
            if [ "$SWAP" != "" ];then
                    xinput_swap="$line"
		    logger -t calib "$line"
            fi
        done
        IFS=$OLD_IFS
    
        xinput="$(xinput_calibrator --misclick 50 --output-type xinput | grep 'xinput set-int-prop')"
	logger -t calib "$xinput"
        echo "#!/bin/bash" > /home/terminal/bin/calibrate.done
        echo "$xinput" >> /home/terminal/bin/calibrate.done
        echo "$xinput_swap" >> /home/terminal/bin/calibrate.done
        chmod 755 /home/terminal/bin/calibrate.done
        echo -e "[Desktop Entry]\nType=Application\nName=xinput\nExec=/home/terminal/bin/calibrate.done" > $HOME/.config/autostart/xinput.desktop
    else
        echo "#!/bin/bash" > /home/terminal/bin/calibrate.done
        echo "$xinput" >> /home/terminal/bin/calibrate.done
        chmod 755 /home/terminal/bin/calibrate.done
        echo -e "[Desktop Entry]\nType=Application\nName=xinput\nExec=/home/terminal/bin/calibrate.done" > $HOME/.config/autostart/xinput.desktop
    fi
fi

rm -rf $HOME/.config/autostart/GT_service.desktop > /dev/null 2>&1
