# -*- sh -*-
# vim:ft=sh:ts=8:sw=4:noet

AddConfigHandler XHacksOptions
AddConfigHelp "SwitchToTextMode <boolean>" "If your X driver is unable to resume properly, you can try switching to a text console first by setting this to yes."
AddConfigHelp "UseDummyXServer <boolean>" "Some X drivers can be reinitialised by launching a dummy X server after resuming to restore the state of the graphics card. Set this to yes to do so."

XHacksSuspend() {
    if [ x"$XHACKS_LEAVE_X" = "x1" ] ; then
	local dest_vt
	if which fgconsole > /dev/null 2>&1 ; then
	    XHACKS_ORIGINAL_VT=`fgconsole`
	else
	    XHACKS_ORIGINAL_VT=1
	fi
	[ -z "$SWSUSPVT" ] && dest_vt=15 || dest_vt="$SWSUSPVT"
	vecho 3 "xhacks: changing console from $XHACKS_ORIGINAL_VT to $dest_vt"
	chvt $dest_vt || return 1
    fi
    return 0
}

XHacksResume() {
    if [ x"$XHACKS_NVIDIA" = "x1" ] ; then
	# Launch a dummy X server to reinitialise the graphics card
	PATH=$PATH:/usr/bin/X11:/usr/X11R6/bin
	if ! which X > /dev/null 2>&1 ; then
	    vecho 1 "X not in path. Not starting dummy X server."
	else
	    vecho 2 "Launching dummy X server."
	    unset XAUTHORITY   # Make sure we don't clobber the user's .Xauthority
	    xinit /bin/true -- `which X` :9 -auth /dev/null -audit 0 -nolisten tcp > /dev/null 2>&1
	fi
    fi

    if [ -n "$XHACKS_ORIGINAL_VT" ] ; then
	vecho 3 "xhacks: changing console back to $XHACKS_ORIGINAL_VT"
	chvt $XHACKS_ORIGINAL_VT
    fi
}

# Hook1's called when using bootsplash and chvt needs to be performed earlier on
XHacksSuspendHook1() {
    if [ x"$USE_BOOTSPLASH" = "x1" -o -n "$SWSUSPVT" ] ; then
	XHACKS_EARLY_SWITCH=1
	XHacksSuspend
    fi
    return 0
}

XHacksResumeHook1() {
    [ -n "$XHACKS_EARLY_SWITCH" ] && XHacksResume
    return 0
}

# Hook2's called when not using bootsplash or redirecting output and chvt can
# wait a while.
XHacksSuspendHook2() {
    [ -z "$XHACKS_EARLY_SWITCH" ] && XHacksSuspend
    return 0
}

XHacksResumeHook2() {
    [ -z "$XHACKS_EARLY_SWITCH" ] && XHacksResume
    return 0
}

XHacksOptions() {
    case $1 in
	switchtotextmode|leavexbeforesuspend)
	    BoolIsOn "$1" "$2" && XHACKS_LEAVE_X=1 || return 0
	    # only break from case statement if we need something done
	    ;;
	usedummyxserver|nvidiahack)
	    BoolIsOn "$1" "$2" && XHACKS_NVIDIA=1 || return 0
	    # only break from case statement if we need something done
	    ;;
	*)
	    return 1
    esac

    if [ -z "$XHACKS_HOOKED" ] ; then
	AddSuspendHook 11 XHacksSuspendHook1
	AddSuspendHook 95 XHacksSuspendHook2
	AddResumeHook 11 XHacksResumeHook1
	AddResumeHook 85 XHacksResumeHook2
	# The switch back has to occur after modules have been loaded in order
	# to allow for anything X might need (eg, psmouse)
	XHACKS_HOOKED=1
    fi
    return 0
}

# $Id: xhacks 628 2005-01-04 17:48:04Z dagobah $
