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

AddConfigHandler XHacksOptions
AddConfigHelp "LeaveXBeforeSuspend <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 "nVidiaHack <boolean>" "Some X drivers can be reinitialised by launching a fake X server after resuming to restore the state of the graphics card. Set this to yes to do so."

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

XHacksResume() {
    if [ x"$XHACK_NVIDIA" = "x1" ] ; then
	# Launch a fake 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 X server for nVidia hack."
	else
	    vecho 2 "Launching fake 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

    [ -n "$XHACK_ORIGINAL_VT" ] && chvt $XHACK_ORIGINAL_VT
}

# Hook1's called when using bootsplash and chvt needs to be performed earlier on
XHacksSuspendHook1() {
    [ x"$USE_BOOTSPLASH" = "x1" ] && XHACKS_USING_BOOTSPLASH=1 && XHacksSuspend
    return 0
}

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

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

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

XHacksOptions() {
    case $1 in
	leavexbeforesuspend)
	    BoolIsOn "$1" "$2" && XHACK_LEAVE_X=1 || return 0
	    # only break from case statement if we need something done
	    ;;
	nvidiahack)
	    BoolIsOn "$1" "$2" && XHACK_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
	AddResumeHook  11 XHacksResumeHook1
	AddSuspendHook 85 XHacksSuspendHook2
	AddResumeHook  85 XHacksResumeHook2
	XHACKS_HOOKED=1
    fi
    return 0
}

# $Id: xhacks 347 2004-07-29 20:18:29Z dagobah $
