#!/bin/bash

#	-------------------------------------------------------------------
#
#	Shell program to start an instance of "acroread" on localhost via
#	"pdfopen" and call "pdfopen" again every time when catching the SIGUSR1
#	signal. This provides the same behaviour as "xdvi" for reloading changed
#	files. Acrobat Reader doesn't come with a "watch file" option, hence
#	this workaround, sigh...
#
#	Copyright 2005, Thorsten Bonow 
#                         ( thorsten.bonow at post.rwth-aachen.de ).
#
#	This program is free software; you can redistribute it and/or
#	modify it under the terms of the GNU General Public License as
#	published by the Free Software Foundation; either version 2 of the
#	License, or (at your option) any later version. 
#
#	This program is distributed in the hope that it will be useful, but
#	WITHOUT ANY WARRANTY; without even the implied warranty of
#	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
#	General Public License for more details.
#
#	Description:
#
#
#
#	Usage:
#
#		startacrobat [ -h | --help ] [PDF document]
#
#	Options:
#
#		-h, --help	Display this help message and exit.
#
#       Known Bugs:
#
#       No other instance of Acrobat Reader should be running: this script kills
#       all of them on exit!
#
#	Revision History:
#
#       01/05/2005      Initial version, adapted from "startxpdf"
#       28/08/2005      Adapted to "pdfopen" and "acrobat"
#       01/14/2006      Use HUP or USR1 signal for update to be fully
#                           compatible with latexmk 3.07 and 3.08
#                       (modification by John Collins (collins at phys.psu.edu))
#                           
#
#	-------------------------------------------------------------------


#	-------------------------------------------------------------------
#	Constants
#	-------------------------------------------------------------------

	PROGNAME=$(basename $0)
	VERSION="0.95A"
	ACRO_RELOAD_EXEC="pdfopen --file"
	ACROBAT_EXEC="acroread"

#	-------------------------------------------------------------------
#	Functions
#	-------------------------------------------------------------------


function clean_up
{

#	-----------------------------------------------------------------------
#	Function to kill remote instance of acrobat
#		No arguments
#	-----------------------------------------------------------------------

        return
}


function error_exit
{

#	-----------------------------------------------------------------------
#	Function for exit due to fatal program error
#		Accepts 1 argument:
#			string containing descriptive error message
#	-----------------------------------------------------------------------


	echo "${PROGNAME}: ${1:-"Unknown Error"}" >&2
	clean_up
	exit 1
}


function graceful_exit
{

#	-----------------------------------------------------------------------
#	Function called for a graceful exit
#		No arguments
#	-----------------------------------------------------------------------

	clean_up
	exit
}


function usage
{

#	-----------------------------------------------------------------------
#	Function to display usage message (does not exit)
#		No arguments
#	-----------------------------------------------------------------------

	echo "Usage: ${PROGNAME} [-h | --help]  [PDF document]"
}


function helptext
{

#	-----------------------------------------------------------------------
#	Function to display help message for program
#		No arguments
#	-----------------------------------------------------------------------

	local tab=$(echo -en "\t\t")

	cat <<- -EOF-

	${PROGNAME} ver. ${VERSION}
	Shell program to start an instance of "acroread" on localhost via
	"acro-reload" and call "acro-reload" again every time when catching the
	SIGUSR1 signal. This provides the same behaviour as "xdvi" for reloading
	changed files. Acrobat Reader doesn't come with a "watch file" option,
	hence this workaround, sigh...

	$(usage)

	Options:

	-h, --help	Display this help message and exit.


	
	
-EOF-
}


function signal_handle
{

#	-----------------------------------------------------------------------
#	Function to handle signals
#		Accepts 1 argument:
#			signal_spec
#	-----------------------------------------------------------------------

	case $1 in
		INT)	echo "$PROGNAME: Program aborted by user" >&2
			clean_up
			exit
			;;
		TERM)	echo "$PROGNAME: Program terminated" >&2
			clean_up
			exit
			;;
		USR1)	echo "$PROGNAME: Reloading..." >&2
		        $ACRO_RELOAD_EXEC $PDF_FILE
			;;
		*)	error_exit "$PROGNAME: Terminating on unknown signal"
			;;
	esac
}


#	-------------------------------------------------------------------
#	Program starts here
#	-------------------------------------------------------------------


##### Command Line Processing #####

if [ "$1" = "--help" ]; then
	helptext
	graceful_exit
fi

while getopts ":h" opt; do
	case $opt in

		h )	helptext
			graceful_exit ;;
		* )	usage
			clean_up
			exit 1
	esac
done

PDF_FILE="$1"

##### Initialization And Setup #####

# Trap TERM and INT signals and properly exit

trap "signal_handle TERM" TERM 
trap "signal_handle INT"  INT

# Trap HUP and USR1 signals for reloading the PDF document 
# Convert to USR1
# (Note HUP is used by gv, and USR1 by xdvi, so both signals have precedent)

trap "signal_handle USR1" HUP USR1


##### Main Logic #####

$ACRO_RELOAD_EXEC $PDF_FILE

while [ 1 ]; 
  do
  # sleeps again after being interrupted by SIGUSR1, breaks if Acrobat Reader is
  # killed
  sleep 1
  eval pgrep "-f" "$ACROBAT_EXEC" ">/dev/null" || break
done

graceful_exit

