#!/bin/dash
# GUI for xlock, originally by Barry Kauler 2005 and Nathan Fisher 2008.
# Re-written from scratch by James for Fatdog64 700
#
# Copyright (C) James Budiono 2015
# License: GPL version 3 or later.
#
# JakeSFR 20160825 - disable CTRL and SysReq before launching xlock

export TEXTDOMAIN=xlock

### configuration
APPTITLE="xlock-gui"
CMD="$1" # -locknow, -configure, -password
MODE=""   # anemone, goop, etc
PARAMS="" # grabserver, etc
[ -e $HOME/.xlock-gui ] && . $HOME/.xlock-gui # override

### helpers

# $1-title $2-message
msg() {
	Xdialog --title "$APPTITLE" --infobox "$1" 0 0 10000
}

# $1-length
get_random() {
	tr -dc 'a-zA-Z0-9./' < /dev/urandom | head -c $1
}

launch_xlock() {
	# Disable SysRq and both CTRL keys
	if [ -e /proc/sys/kernel/sysrq ]; then
		OLD_SYSRQ="$(cat /proc/sys/kernel/sysrq)"
		echo 0 > /proc/sys/kernel/sysrq
	fi
	CTRL_L="$(xmodmap -pm | sed -n 's/.*Control_L (\(0x[0-9a-f]\+\).*/\1/p')"
	CTRL_R="$(xmodmap -pm | sed -n 's/.*Control_R (\(0x[0-9a-f]\+\).*/\1/p')"
	[ "$CTRL_L" ] && xmodmap -e "keycode ${CTRL_L}="
	[ "$CTRL_R" ] && xmodmap -e "keycode ${CTRL_R}="
	xlock -mode ${MODE:-random} $PARAMS
	
	# Restore CTRL keys and re-enable SysRq
	[ "$CTRL_L" ] && xmodmap -e "keycode ${CTRL_L}=Control_L"
	[ "$CTRL_R" ] && xmodmap -e "keycode ${CTRL_R}=Control_R"
	if [ -e /proc/sys/kernel/sysrq ]; then
	 echo $OLD_SYSRQ > /proc/sys/kernel/sysrq
	fi
}

### command handlers ###
configure() {
	local modes=""
	while read -r p; do
		modes="$modes $p $p"
	done << EOF
$(xlock --help 2>&1 | sed -n '/\[-mode/,/^$/ {s_\[-mode_|_;s_\]__;s_|_\n_g;p}' | sort)
EOF
	while true; do
		if mode=$(Xdialog --stdout --no-tags --title "$APPTITLE" --menubox \
		"Choose display mode:" 20 40 10 $modes);
		then
			msg "Click OK to preview mode '$mode'. \nWhen done, close the window."
			xlock -mode $mode -inwindow
			! Xdialog --title "$APPTITLE" --yesno "Do you like mode '$mode'?" 0 0 && continue
			if params="$(Xdialog --stdout --title "$APPTITLE" --inputbox \
			"Additional xlock params (-grabserver, -echokeys, etc.)" 0 0)"; 
			then
				echo MODE=\'$mode\' > $HOME/.xlock-gui
				echo PARAMS=\'$params\' >> $HOME/.xlock-gui
				msg "Mode set to $mode, \nadditional params: $params"
				break
			else
				msg "Cancelled, nothing changed."
				break
			fi
		else
			msg "Cancelled, nothing changed."
			break
		fi
	done
}

locknow() {
	if [ -s $HOME/.xlockrc ]; then
		launch_xlock
	else
		set_passwd
		[ -s $HOME/.xlockrc ] && launch_xlock
	fi
}

set_passwd() {
	if ans="$(Xdialog --title "$APPTITLE" --separator "\n" --stdout \
	    --password --password -2inputsbox "Set Password\nPlease do not use diacritics here!" 0 0 \
	    "Password" "$pw1" "Re-type password" "$pw2")"; then
		OIFS="$IFS"; IFS="
"; set -- $ans; pw1="$1"; pw2="$2"; IFS="$OIFS"
		if [ -z "$pw1" ]; then
			msg "Password cannot be empty."
			set_passwd		
		elif ! [ "$pw1" = "$pw2" ]; then
			msg "Passwords don't match."
			set_passwd
		else
			key="$(echo "$pw1" | head -c8)"
			salt="$(get_random 2)"
			#echo "$key$salt"
			passwd=$(echo "$key$salt" | makekey)
			echo $passwd > $HOME/.xlockrc
		fi
	else
		msg "Cancelled, nothing changed."
	fi
}

### main ###
case "$CMD" in
	-locknow|"") locknow ;;
	-configure) configure ;;
	-password) set_passwd ;;
	*) if test -t 0; then
		echo "Usage: xlock-gui [-locknow|-configure|-password]"
	   else
	    msg "Usage: xlock-gui [-locknow|-configure|-password]"
	   fi ;;
		
esac

