#!/bin/sh
# PSnip : screenhot tray applet
# Screenshot settings are defined by
# the user in the main GUI of PSnip.

export TEXTDOMAIN=precorder
export OUTPUT_CHARSET=UTF-8

APPDIR="/usr/local/precorder"
[ ! -d $APPDIR ] && mkdir -p $APPDIR
PREFDIR="$APPDIR/preferences"
[ ! -d $PREFDIR ] && mkdir -p $PREFDIR
[ ! -d $HOME/Pictures ] && mkdir -p $HOME/Pictures
[ ! -d $HOME/Pictures/Screenshots ] && mkdir -p $HOME/Pictures/Screenshots
SAVEFOLDER=`cat $PREFDIR/savefolder 2>/dev/null`
[ ! "$SAVEFOLDER" ] && SAVEFOLDER="$HOME/Pictures/Screenshots/"
WORKDIR="/tmp/psnip"
[ ! -d $WORKDIR ] && mkdir -p $WORKDIR

# pSnip settings (SCALE excluded)
DATE=`cat $PREFDIR/ss-date 2>/dev/null`
[ ! "$DATE" ] && DATE=false
DELAY=`cat $PREFDIR/ss-delay 2>/dev/null`
[ ! "$DELAY" ] && DELAY=0
EDIT=`cat $PREFDIR/ss-edit 2>/dev/null`
[ ! "$EDIT" ] && EDIT=false
FILENAME=`cat $PREFDIR/ss-filename 2>/dev/null`
[ ! "$FILENAME" ] && FILENAME=Screenshot-1
FILETYPE=`cat $PREFDIR/ss-filetype 2>/dev/null`
[ ! "$FILETYPE" ] && FILETYPE=PNG
IMAGEEDITOR=`cat $PREFDIR/imageeditor 2>/dev/null`
if [ ! "$IMAGEEDITOR" ]; then
	for i in defaultimageeditor mtpaint gimp; do [ "`which $i 2>/dev/null`" ] && { IMAGEEDITOR="$i"; break; } done
fi
IMAGEVIEWER=`cat $PREFDIR/imageviewer 2>/dev/null`
if [ ! "$IMAGEVIEWER" ]; then
	for i in defaultimageviewer viewnior gpicview fotoxx geeqie gqview gwenview ristretto xnview; do [ "`which $i 2>/dev/null`" ] && { IMAGEVIEWER="$i"; break; } done
fi
TIMER=`cat $PREFDIR/ss-timer 2>/dev/null`
[ ! "$TIMER" ] && TIMER=true

export DELAY

## COUNTDOWN FUNCTION ##

func_timer_delay(){
 if [ ${DELAY} -gt 0 ] && [ "$TIMER" = "true" ]; then #countdown code by SFR
	echo '<window resizable="false" opacity="0.7" type-hint="6" window-position="3">
		<vbox spacing="0" margin="0">
			<notebook show-border="false" show-tabs="false" tab-base-index="0">
				'$( for ((V=${DELAY}; V>=1; V--)); do
				echo '<text use-markup="true"><label>"<span font='"'Sans 24'"' size='"'xx-large'"' weight='"'bold'"' color='"'green'"'>'${V}'</span>"</label></text>'
				done )'
				<variable>varINDEX</variable>
				<input>echo $(( ($varINDEX+1) % '${DELAY}' ))</input>
			</notebook>
			<timer visible="false" interval="1">
				<action>refresh:varINDEX</action>
			</timer>
			<timer visible="false" interval="'${DELAY}'">
				<action>exit:EXIT</action>
			</timer>
		</vbox>
		<action signal="hide">exit:abort</action>
	</window>' | gtkdialog -s >/dev/null 2>&1
 else
	sleep ${DELAY}
 fi
}
export -f func_timer_delay

## MAIN DIALOG ##

[ -f /usr/local/lib/X11/pixmaps/info.xpm ] && ICON="/usr/local/lib/X11/pixmaps/info.xpm" || ICON=""
REPLY=`Xdialog --stdout --title "$(gettext 'Screenshot')" \
  --backtitle "$(gettext 'FORMAT'): ${FILETYPE} | $(gettext 'DELAY'): ${DELAY}s" \
  --icon "$ICON" \
  --under-mouse \
  --buttons-style text \
  --no-tags \
  --cancel-label "$(gettext 'Cancel')" \
  --ok-label "$(gettext 'Capture')" \
  --radiolist "$(gettext 'Capture the full desktop screen or use the \n  mouse to select a rectangular region (ROI).')" 0 0 4  "1" "$(gettext 'Fullscreen')" "on"  "2" "$(gettext 'Region - selected by mouse')" "off" `
if [ "$REPLY" = "1" ]; then #fullscreen
	OUTPUTS="`wlr-randr | grep -m 2 -v '^ ' | cut -f 1 -d ' ' | tr '\n' ' ' | sed 's/ $//'`" #define screen ID
	OUTPUT="${OUTPUTS%% *}"
	[ -z "$OUTPUT" ] && exit
	if [ "$OUTPUT" != "$OUTPUTS" ]; then #when multiple screens detected, use mouse-click to select a screen for fullscreen capture
		OUTPUT="`slurp -p -f %o`"
		[ -z "$OUTPUT" ] && exit
	fi
	FILETYPE="`echo ${FILETYPE} | tr [:upper:] [:lower:]`"
	num=1
	while [ -f "${SAVEFOLDER}${FILENAME}.${FILETYPE}" ]
	do
		FILENAME=Screenshot-"$num"
		let num=num+1
	done
	echo "$FILENAME" > $PREFDIR/ss-filename
	[ "$DATE" = "true" ] && DATE="$(date +%Y-%m-%d_%H-%M-%S)" FILENAME="" || DATE=""
	if [ "$TIMER" = "true" ]; then
		func_timer_delay
		sleep .5
	else
		sleep $DELAY
	fi
	if [ "$FILETYPE" = "gif" ]; then
		grim -o "$OUTPUT" "${WORKDIR}/tmp-psnip.png"
		ffmpeg -i "${WORKDIR}/tmp-psnip.png" -update true -filter_complex "[0]split[a][b]; [a]palettegen[palette]; [b][palette]paletteuse" "${SAVEFOLDER}${FILENAME}${DATE}.${FILETYPE}"
	elif [ "$FILETYPE" = "jpg" ]; then
		grim -o "$OUTPUT" "${WORKDIR}/tmp-psnip.png"
		ffmpeg -i "${WORKDIR}/tmp-psnip.png" -update true -qscale:v 5 "${SAVEFOLDER}${FILENAME}${DATE}.${FILETYPE}"
	else
		grim -o "$OUTPUT" "${WORKDIR}/tmp-psnip.png"
		ffmpeg -i "${WORKDIR}/tmp-psnip.png" -update true "${SAVEFOLDER}${FILENAME}${DATE}.${FILETYPE}"
	fi
	rm -f "${WORKDIR}/tmp-psnip.png"
	echo "${SAVEFOLDER}${FILENAME}${DATE}.${FILETYPE}" > $PREFDIR/current
	gtkdialog-splash -close never -timeout 5 -margin 10 -placement center -fontsize large -bg goldenrod -text " ${FILENAME}${DATE}.${FILETYPE} $(gettext 'saved in '$SAVEFOLDER'') "
	if [ "$EDIT" = "true" ]; then
		$IMAGEEDITOR "${SAVEFOLDER}${FILENAME}${DATE}.${FILETYPE}" &
	else
		$IMAGEVIEWER "${SAVEFOLDER}${FILENAME}${DATE}.${FILETYPE}" &
	fi
elif [ "$REPLY" = "2" ]; then #region of interest (ROI)
	FILETYPE="`echo ${FILETYPE} | tr [:upper:] [:lower:]`"
	num=1
	while [ -f "${SAVEFOLDER}${FILENAME}.${FILETYPE}" ]
	do
		FILENAME=Screenshot-"$num"
		let num=num+1
	done
	echo "$FILENAME" > $PREFDIR/ss-filename
	[ "$DATE" = "true" ] && DATE="$(date +%Y-%m-%d_%H-%M-%S)" FILENAME="" || DATE=""
	cd $SAVEFOLDER
	if [ "$TIMER" = "true" ]; then
		if [ "$FILETYPE" = "gif" ]; then
			grim -g "$(slurp -d; func_timer_delay; sleep 0.5)" "${WORKDIR}/tmp-psnip.png"
			ffmpeg -i "${WORKDIR}/tmp-psnip.png" -update true -filter_complex "[0]split[a][b]; [a]palettegen[palette]; [b][palette]paletteuse" "${SAVEFOLDER}${FILENAME}${DATE}.${FILETYPE}"
		elif [ "$FILETYPE" = "jpg" ]; then
			grim -g "$(slurp -d; func_timer_delay; sleep 0.5)" "${WORKDIR}/tmp-psnip.png"
			ffmpeg -i "${WORKDIR}/tmp-psnip.png" -update true -qscale:v 5 "${SAVEFOLDER}${FILENAME}${DATE}.${FILETYPE}"
		else
			grim -g "$(slurp -d; func_timer_delay; sleep 0.5)" "${WORKDIR}/tmp-psnip.png"
			ffmpeg -i "${WORKDIR}/tmp-psnip.png" -update true "${SAVEFOLDER}${FILENAME}${DATE}.${FILETYPE}"
		fi
	else
		if [ "$FILETYPE" = "gif" ]; then
			grim -g "$(slurp -d; sleep $DELAY)" "${WORKDIR}/tmp-psnip.png"
			ffmpeg -i "${WORKDIR}/tmp-psnip.png" -update true -filter_complex "[0]split[a][b]; [a]palettegen[palette]; [b][palette]paletteuse" "${SAVEFOLDER}${FILENAME}${DATE}.${FILETYPE}"
		elif [ "$FILETYPE" = "jpg" ]; then
			grim -g "$(slurp -d; sleep $DELAY)" "${WORKDIR}/tmp-psnip.png"
			ffmpeg -i "${WORKDIR}/tmp-psnip.png" -update true -qscale:v 5 "${SAVEFOLDER}${FILENAME}${DATE}.${FILETYPE}"
		else
			grim -g "$(slurp -d; sleep $DELAY)" "${WORKDIR}/tmp-psnip.png"
			ffmpeg -i "${WORKDIR}/tmp-psnip.png" -update true "${SAVEFOLDER}${FILENAME}${DATE}.${FILETYPE}"
		fi
	fi
	rm -f "${WORKDIR}/tmp-psnip.png"
	echo "${SAVEFOLDER}${FILENAME}${DATE}.${FILETYPE}" > $PREFDIR/current
	gtkdialog-splash -close never -timeout 5 -margin 10 -placement center -fontsize large -bg goldenrod -text " ${FILENAME}${DATE}.${FILETYPE} $(gettext 'saved in '$SAVEFOLDER'') "
	if [ "$EDIT" = "true" ]; then
		$IMAGEEDITOR "${SAVEFOLDER}${FILENAME}${DATE}.${FILETYPE}" &
	else
		$IMAGEVIEWER "${SAVEFOLDER}${FILENAME}${DATE}.${FILETYPE}" &
	fi
else
	exit 0
fi

exit 0
