#!/bin/bash

# =============================================================================
# Take_a_Shot! (TAS) v1.15 by SFR'2013-2016,2019
# GNU GPL v2 applies
# -----------------------------------------------------------------------------
# Contributors:
# `f00, don570, Geoffrey, Relztrah, MochiMoppel, peebee, 01micko, MrDuckGuy
#
# Translators:
# nilsonmorales, vicmz, musher0, charlie6, Bert, vicmz, L18L
# -----------------------------------------------------------------------------
# Requirements: Bash, Gtkdialog, ffmpeg/avconv, xwininfo, getcurpos
# Optional: gifsicle (for GIF optimization), xrectsel
# =============================================================================

export TEXTDOMAIN=tas
export OUTPUT_CHARSET=UTF-8

# -----------------------------------------------------------------------------

PROG_NAME="TAS"
PROG_VERSION="1.15"
MY_NAME="$(readlink -f "$0")"
CONFIG="${HOME}/.take_a_shot.rc"
WORKDIR="/tmp/tas.${USER}.${$}"
mkdir -p "${WORKDIR}"
trap 'rm -rf "${WORKDIR}"; exit' EXIT

ICON_LEGACY="/usr/local/lib/X11/mini-icons/mini-camera.xpm"
ICON_MODERN="/usr/share/pixmaps/puppy/photocamera.svg"
[ -f "$ICON_MODERN" ] && ICON="$ICON_MODERN" || ICON="$ICON_LEGACY"

# -----------------------------------------------------------------------------

[ "`which gtkdialog4 2>/dev/null`" ] && GTKDIALOG=gtkdialog4 || GTKDIALOG=gtkdialog

# -----------------------------------------------------------------------------

PLAYER=aplay
for i in avplay ffplay; do
  which $i >/dev/null 2>&1 && { PLAYER=$i; break; }
done

# -----------------------------------------------------------------------------

# Defaults
DIRECTORY="${HOME}"
FILENAME="$(gettext 'Screenshot')"
DELAY=1
FRAMES=1
FPS=1
EXTRA=false
FORMAT=PNG
SCALE=false
SCALE_PERCENT=75
MODE=Fullscreen
MOUSE=false
BEEP=true
BEEPFILE="/usr/share/audio/beep_high.wav"
TIMER=false
GIFWARNING=on
DEFAULTIMAGEVIEWER="defaultimageviewer"
DEFAULTIMAGEEDITOR="defaultpaint"

if [ -f "${CONFIG}" ]; then
 . "${CONFIG}"
fi

export GTKDIALOG PROG_NAME PROG_VERSION ICON

# =============================================================================

func_vercmp_gt () {
  [ "${1}" != "$(echo -e "${1}\n${2}" | sort -t '.' -k1,1n -k2,2n -k3,3n -k4,4n -k5,5n | head -n1)" ]
}

# -----------------------------------------------------------------------------

func_dlg () {
  case "$1" in
	INFO)  		DLG_TITLE="$(gettext "Info")";		DLG_ICON="gtk-dialog-info"		DLG_BTN="OK"	;;
    WARN)		DLG_TITLE="$(gettext "Warning")";	DLG_ICON="gtk-dialog-warning"	DLG_BTN="OK"	;;
    ERROR)		DLG_TITLE="$(gettext "Error")";		DLG_ICON="gtk-dialog-error"		DLG_BTN="OK"	;;
	WARN_CONT)	DLG_TITLE="$(gettext "Warning")";	DLG_ICON="gtk-dialog-warning"	DLG_BTN="CONT"	;;
    CUSTOM)		DLG_TITLE="$2";						DLG_ICON="$3";					DLG_BTN="OK"; shift; shift	;;
    *)			DLG_TITLE="$(gettext "Info")";		DLG_ICON="gtk-dialog-info"		DLG_BTN=		;;
  esac 
  
  shift
  
  export GUI_DLG='
  <window title="'${PROG_NAME}'-'${PROG_VERSION}'" resizable="false" image-name="'${ICON}'" window-position="1">
    <vbox>
      <frame '${DLG_TITLE}'>
        <pixmap><input file stock="'${DLG_ICON}'"></input></pixmap>
        <vbox spacing="1">
        '$(while (($#)); do
             echo "${1//\"/_}" | while IFS='' read -r LINE; do
               echo "<text><label>\"${LINE//\\/_}\"</label></text>"
             done
             shift
           done)'
         </vbox>
      </frame>
      '$( case "$DLG_BTN" in
			OK)		echo '<hbox><button ok><action>EXIT:OK</action></button></hbox>'	;;
			CONT)	echo '<hbox>
							<checkbox>
							  <default>false</default>
							  <variable>WARN_CHECKBOX</variable>
							  <label>'$(gettext "Don't show this warning again")'</label>
							</checkbox>
							 <text space-expand="true" space-fill="true" visible="false"><label>" "</label></text>
							<button>
								<label>'$(gettext "Continue")'</label>
								<input file stock="gtk-redo"></input>
								<action>EXIT:CONTINUE</action>
							</button>
						  </hbox>'	;;
		  esac)'
    </vbox>
    <action signal="hide">exit:abort</action>
  </window>'

  eval $(${GTKDIALOG} -p GUI_DLG)
}

export -f func_dlg

# -----------------------------------------------------------------------------

func_syntax_info () {
FILENAME_HELP="$(gettext "You can use date format options, such as:")

$(date --help 2>&1 | grep -E '^ +%[d,D,F,H,I,m,M,p,r,R,S,T,Y]' | tr '/' '_')

$(gettext "(see 'date --help' for full list)")
_________________________________

$(gettext "Current filename is:")
$(echo "$(date +"${FILENAME}" | tr '\\\/%' '_')")"

  func_dlg INFO "${FILENAME_HELP}"
}

export -f func_syntax_info

# -----------------------------------------------------------------------------

func_beep () {
  if [ -f "${BEEPFILE}" ]; then
    if [ "$PLAYER" = "aplay" ]; then
      aplay "${BEEPFILE}" >/dev/null 2>&1
    else
      $PLAYER -vn -nodisp -autoexit "${BEEPFILE}" >/dev/null 2>&1
    fi
  else
    beep -f 1000 -l 50
  fi
}

# -----------------------------------------------------------------------------

func_escape () {
  local TMP="${1}"
  TMP="${TMP//\\/\\\\}"			# escape backslashes
  TMP="${TMP//\"/\\\"}"			# escape "
  TMP="${TMP//\$/\\\$}"			# escape $
  TMP="${TMP//\`/\\\`}"			# escape `
  echo -n "$TMP"
}

# -----------------------------------------------------------------------------

func_save_settings () {
  DIRECTORY_TMP="$(func_escape "${DIRECTORY}")"
  FILENAME_TMP="$(func_escape "${FILENAME}")"
  BEEPFILE_TMP="$(func_escape "${BEEPFILE}")"

  echo "DIRECTORY=\"$DIRECTORY_TMP\"" > $CONFIG
  echo "FILENAME=\"$FILENAME_TMP\"" >> $CONFIG
  echo "DELAY=\"$DELAY\"" >> $CONFIG
  echo "FRAMES=\"$FRAMES\"" >> $CONFIG
  echo "FPS=\"$FPS\"" >> $CONFIG
  echo "EXTRA=\"$EXTRA\"" >> $CONFIG
  echo "FORMAT=\"$FORMAT\"" >> $CONFIG
  echo "SCALE=\"$SCALE\"" >> $CONFIG
  echo "SCALE_PERCENT=\"$SCALE_PERCENT\"" >> $CONFIG
  echo "MODE=\"$MODE\"" >> $CONFIG
  echo "MOUSE=\"$MOUSE\"" >> $CONFIG
  echo "BEEP=\"$BEEP\"" >> $CONFIG
  echo "TIMER=\"$TIMER\"" >> $CONFIG
  echo "GIFWARNING=\"$GIFWARNING\"" >> $CONFIG

  echo "BEEPFILE=\"$BEEPFILE_TMP\"" >> $CONFIG
  echo "DEFAULTIMAGEVIEWER=\"$DEFAULTIMAGEVIEWER\"" >> $CONFIG
  echo "DEFAULTIMAGEEDITOR=\"$DEFAULTIMAGEEDITOR\"" >> $CONFIG
}

# =============================================================================

# check gtkdialog version
GTKDLG_VER="`$GTKDIALOG -v 2>/dev/null | grep -Eo 'version.*\.[0-9] ' | cut -f2 -d ' '`"
func_vercmp_gt "0.8.3" "${GTKDLG_VER}" && GTKDLG_NEW=0 || GTKDLG_NEW=1	# 1 = gtkdialog >= 0.8.3

# check ffmpeg/avconv
if [ ! "`which ffmpeg 2>/dev/null`" ] && [ ! "`which avconv 2>/dev/null`" ]; then
  func_dlg ERROR "$(gettext "Please install 'ffmpeg' or 'avconv' first!")"
  exit 1
fi

[ "`which avconv 2>/dev/null`" ] && FFMPEG=avconv || FFMPEG=ffmpeg

if [ "$FFMPEG" = "ffmpeg" ]; then
  # Older versions of ffmpeg need '-loop_output 0' in order to loop anim, but it's been deprecated
  $FFMPEG -loop_output 0 -L >/dev/null 2>&1 && LOOP_CMD_CONST='-loop_output 0' || LOOP_CMD_CONST='-loop 0'
fi

# some versions still don't support this...
$FFMPEG -draw_mouse 0 -L >/dev/null 2>&1 && DRAW_MOUSE_AVAIL='true' || DRAW_MOUSE_AVAIL='false'

# get screen resolution
read MAXX MAXY <<< `xwininfo -root | awk 'NR>=8&&NR<=9 {printf "%d ", $2}'`	# instead of 'printf' can also use 'read -d "\n"'

# -----------------------------------------------------------------------------

# take a "quick" snapshot
case "`echo "${1}" | tr [:upper:] [:lower:]`" in
  -q|--quick|quick)
    CNT=1
    SAVENAME="${HOME}/$(gettext 'Quickshot')"
    EXT=png
    TEMPNAME="${SAVENAME}"
    while [ -e "${TEMPNAME}.${EXT}" ]; do
      TEMPNAME="${SAVENAME}(${CNT})"
      ((CNT++))
    done
    SAVENAME="${TEMPNAME}.${EXT}"
    #func_beep &
    ERRLOG=$($FFMPEG -f x11grab -s "${MAXX}"x"${MAXY}" -r 25 -i ${DISPLAY} -vframes 1 -pix_fmt rgb24 "${SAVENAME}" 2>&1)
    [ $? -ne 0 ] && { echo "$ERRLOG"; exit 1; }
    exit 0
  ;;
esac

# -----------------------------------------------------------------------------

if [ "${1}" != "relaunch" ] && [ "`xwininfo -root | grep -w Depth | awk '{print $2}'`" -lt 24 ]; then
  func_dlg WARN "$(gettext "Color depth is lower than 24bits.")" \
				"$(gettext "TAS may not work 100% properly.")" \
				"$(gettext "Try to use 'xorgwizard' to change the setting.")"
fi

# -----------------------------------------------------------------------------

MODE_1=false
MODE_2=false
MODE_3=false

case "${MODE}" in
  Fullscreen)	MODE_1=true	;;
  Window)		MODE_2=true	;;
  Region)		MODE_3=true	;;
  *)			MODE_1=true	;;
esac

DIRECTORY="$(echo "${DIRECTORY}" | tr '%' '_')"
FILENAME="$(echo "${FILENAME}" | tr '\\\/' '_')"
[ "${DIRECTORY}" = "" ] && DIRECTORY="${HOME}"
[ "${FILENAME}" = "" ] && FILENAME="${gettext 'Screenshot'}"

echo -n "${DIRECTORY}" > "${WORKDIR}/tas_dir"
echo -n "${FILENAME}" > "${WORKDIR}/tas_file"

SUBTITLE=$(gettext "(Take a Shot!)")
[ "$SUBTITLE" = "(Take a Shot!)" ] && SUBTITLE=""

# -----------------------------------------------------------------------------

if which xrectsel >/dev/null 2>&1; then
  TOOLTIP=''
else
  TOOLTIP="$(gettext "To select a window make sure it's not partially covered by other windows and then click its titlebar.
To select a region click on top-left corner of desired area and release mouse button, then click again on bottom-right corner.")"
fi

# -----------------------------------------------------------------------------

MAIN='
<window title="'${PROG_NAME}'-'${PROG_VERSION}'" resizable="false" image-name="'${ICON}'" window-position="1">
  <vbox spacing="1">
      <text use-markup="true"><label>"<span font='"'serif'"' weight='"'bold'"' size='"'xx-large'"'><b>Take a Shot!</b></span>"</label></text>
'

[ "${SUBTITLE}" ] && MAIN=${MAIN}'
<text use-markup="true"><label>"<span style='"'italic'"' size='"'small'"'><b>'${SUBTITLE}'</b></span>"</label></text>
'

export MAIN=${MAIN}'
    <frame>
      <hbox>
        <text xalign="0"><label>'$(gettext "Directory:")'</label></text>
        <text space-expand="true" space-fill="true" visible="false"><label>" "</label></text>
        <entry fs-action="directory" fs-folder="$HOME">
          <variable>DIRECTORY</variable>
          <input file>"'${WORKDIR}/tas_dir'"</input>
        </entry>
        <button>
	      <input file stock="gtk-open"></input>
		  <action>fileselect:DIRECTORY</action>
		</button>
      </hbox>
      
      <hseparator></hseparator>
      
      <hbox>
        <text xalign="0"><label>'$(gettext "Filename:")'</label></text>
        <text space-expand="true" space-fill="true" visible="false"><label>" "</label></text>
        <entry>
          <variable>FILENAME</variable>
          <input file>"'${WORKDIR}/tas_file'"</input>
        </entry>
	    <button>
	      <input file stock="gtk-info"></input>
	      <action>func_syntax_info &</action>
	    </button>
      </hbox>

      <hseparator></hseparator>
 
      <hbox>
        <text xalign="0"><label>'$(gettext "Delay (in seconds):")'</label></text>
        <text space-expand="true" space-fill="true" visible="false"><label>" "</label></text>
        <spinbutton range-min="0" range-max="60" range-step="1">
          <variable>DELAY</variable>
          <default>'${DELAY}'</default>
        </spinbutton>
      </hbox>
      
      <hseparator></hseparator>
      
      <hbox>
        <checkbox>
          <variable>BEEP</variable>
          <default>'${BEEP}'</default>
          <label>'$(gettext "Beep on Shot")'</label>
        </checkbox>
        <text space-expand="true" space-fill="true" visible="false"><label>" "</label></text>
        <vseparator></vseparator>
        <text space-expand="true" space-fill="true" visible="false"><label>" "</label></text>
        <checkbox>
          <variable>TIMER</variable>
          <default>'${TIMER}'</default>
          <label>'$(gettext "Show timer")'</label>
        </checkbox>
      </hbox>
      
      <hseparator></hseparator>
      
      <hbox>
        <text xalign="0"><label>'$(gettext "Format:")'</label></text>
        <text space-expand="true" space-fill="true" visible="false"><label>" "</label></text>
        <comboboxtext>
          <variable>FORMAT</variable>
          <default>'${FORMAT}'</default>
          <item>PNG</item>
          <item>JPG</item>
          <item>BMP</item>
          <item>TIF</item>
          <item>GIF</item>
        </comboboxtext>

        <vseparator></vseparator>

        <checkbox>
          <label>'$(gettext "Scale (%):")'</label>
          <variable>SCALE</variable>
          <default>'${SCALE}'</default>
          <action>if true enable:SCALE_PERCENT</action>
          <action>if false disable:SCALE_PERCENT</action>
        </checkbox>
        <text space-expand="true" space-fill="true" visible="false"><label>" "</label></text>
        <spinbutton range-min="25" range-max="150" range-step="5" range-value="'${SCALE_PERCENT}'">
          <variable>SCALE_PERCENT</variable>
          <sensitive>'${SCALE}'</sensitive>
        </spinbutton>
      </hbox>
            
      <hseparator></hseparator>
      
      <hbox homogeneous="true">
        <checkbox>
          <variable>MOUSE</variable>
          <default>'${MOUSE}'</default>
          <label>'$(gettext "Include mouse pointer")'</label>
        </checkbox>
      </hbox>
      
      <hseparator></hseparator>
      
      <hbox homogeneous="false"  tooltip-text="'${TOOLTIP}'">
        <radiobutton>
          <variable>MODE_1</variable>
          <default>'${MODE_1}'</default>
          <label>'$(gettext "Fullscreen")'</label>
        </radiobutton>
        <text space-expand="true" space-fill="true" visible="false"><label>" "</label></text>
        <radiobutton>
          <variable>MODE_2</variable>
          <default>'${MODE_2}'</default>
          <label>'$(gettext "Window")'</label>
        </radiobutton>
        <text space-expand="true" space-fill="true" visible="false"><label>" "</label></text>
        <radiobutton>
          <variable>MODE_3</variable>
          <default>'${MODE_3}'</default>
          <label>'$(gettext "Region")'</label>
        </radiobutton>
      </hbox>
      
      <hseparator></hseparator>
      
      <vbox visible="'${EXTRA}'">
        <hbox>
          <text xalign="0"><label>'$(gettext "Number of frames:")'</label></text>
          <text space-expand="true" space-fill="true" visible="false"><label>" "</label></text>
          <spinbutton range-min="1" range-max="999" range-step="1">
            <variable>FRAMES</variable>
            <default>'${FRAMES}'</default>
            '`[ ${GTKDLG_NEW} -eq 1 ] && echo '
              <action condition="command_is_true( [ ${FRAMES} -eq 1 ] && echo true)">disable:FPS</action>
              <action condition="command_is_true( [ ${FRAMES} -gt 1 ] && echo true)">enable:FPS</action>'
            `'
          </spinbutton>
        </hbox>
      
        <hbox> 
          <text xalign="0"><label>'$(gettext "Frames per second:")'</label></text>
          <text space-expand="true" space-fill="true" visible="false"><label>" "</label></text>
          <spinbutton range-min="1" range-max="10" range-step="1" range-value="'${FPS}'">
            <variable>FPS</variable>
            '`[ ${FRAMES} -eq 1 ] && [ ${GTKDLG_NEW} -eq 1 ] && echo '<sensitive>false</sensitive>'`'
          </spinbutton>
        </hbox>
        <variable>varTOGGLE</variable>
      </vbox>

      <togglebutton>
        <label>'$(gettext "Burst mode")'</label>
        <default>'${EXTRA}'</default>
        <variable>EXTRA</variable>
        <action>if true show:varTOGGLE</action>
        <action>if false hide:varTOGGLE</action>
      </togglebutton>
                 
    </frame>
    
    <button height-request="64" image-position="top" has-focus="true">
      <label>'$(gettext "Take a Shot!")'</label>
      <input file>'${ICON}'</input>
      <width>32</width>
      <height>32</height>
      <action>exit:COME_BACK</action>
    </button>
    
  </vbox>

<action signal="delete-event">exit:EXIT</action>
<action signal="hide">exit:abort</action>
</window>'

# -----------------------------------------------------------------------------

I="$IFS"; IFS='
'
for STATEMENTS in $(${GTKDIALOG} -p MAIN); do
  if [[ "${STATEMENTS}" == "FILENAME="* ]]; then
    FILENAME="`echo "${STATEMENTS}" | cut -f2- -d '"' | rev | cut -f2- -d '"' | rev`"
  elif [[ "${STATEMENTS}" == "DIRECTORY="* ]]; then
    DIRECTORY="`echo "${STATEMENTS}" | cut -f2- -d '"' | rev | cut -f2- -d '"' | rev`"
  else
    eval ${STATEMENTS}
  fi
done
IFS="$I"

# -----------------------------------------------------------------------------

if [ "${MODE_1}" = true ]; then
  MODE=Fullscreen
elif [ "${MODE_2}" = true ]; then
  MODE=Window
else
  MODE=Region
fi

# filename can't have / (naturally) but also % (which confuses ffmpeg)
DIRECTORY="`echo "${DIRECTORY}" | tr '%' '_'`"
FILENAME="`echo "${FILENAME}" | tr '\\\/"' '_'`"

# ---------------------------------------------------------------------------

func_save_settings

[ "${EXIT}" != "COME_BACK" ] && exit 0

if [ "${GIFWARNING}" = "on" ] && [ "${FORMAT}" = "GIF" ] && [ "${FRAMES}" -gt 1 ] && [ "${EXTRA}" = "true" ] ; then
  func_dlg WARN_CONT "$(gettext "If output GIF it too big (has large resolution and lots of frames) \
an attempt to view it in some of image viewers (Viewnior, GPicView, etc.) \
may result in seizure of all available RAM and hence complete system lockup!

Viewing it in browser (Firefox, Chromium, etc.) is recommended, \
as it takes significantly less RAM.")"

  [ "$EXIT" != "CONTINUE" ] && exec "$MY_NAME" relaunch
  [ "$WARN_CHECKBOX" = "true" ] && GIFWARNING="off" || GIFWARNING="on"
  func_save_settings
fi


# ---------------------------------------------------------------------------

[ "${EXTRA}" = "false" ] && FRAMES=1

EXT="`echo ${FORMAT} | tr [:upper:] [:lower:]`"

PIX_FMT='-pix_fmt rgb24'
#if [ "$FFMPEG" = "avconv" ]; then
  [ "$FORMAT" = "JPG" ] || [ "$FORMAT" = "BMP" ] && PIX_FMT=''
#fi

DRAW_MOUSE_OPT=''
if [ "${MOUSE}" = "false" ]; then
  [ "$DRAW_MOUSE_AVAIL" = "true" ] && DRAW_MOUSE_OPT='-draw_mouse 0'
  POINTER='+nomouse'
else  
  [ "$DRAW_MOUSE_AVAIL" = "true" ] && DRAW_MOUSE_OPT='-draw_mouse 1'
  POINTER=''
fi

[ "${SCALE}" = "true" ] && SCALE_CMD="-vf scale=iw/(100/${SCALE_PERCENT}):-1" || SCALE_CMD=''

case $MODE in
  Fullscreen)
    WIDTH=${MAXX}
    HEIGHT=${MAXY}
    OFFSET=""
  ;;
  Window)
    read XPOS YPOS WIDTH HEIGHT <<< `xwininfo -frame | awk 'NR>=8&&NR<=9 {printf "%d ", $4} NR>=12&&NR<=13 {printf "%d ", $2}'`
    [ ${XPOS} -lt 0 ] && WIDTH=$((${WIDTH}+${XPOS})) && XPOS=0
    [ ${YPOS} -lt 0 ] && HEIGHT=$((${HEIGHT}+${YPOS})) && YPOS=0
    [ $((${WIDTH}+${XPOS})) -ge ${MAXX} ] && WIDTH=$((${MAXX}-${XPOS}))
    [ $((${HEIGHT}+${YPOS})) -ge ${MAXY} ] && HEIGHT=$((${MAXY}-${YPOS}))
    OFFSET="+${XPOS},${YPOS}"
  ;;
  Region)
    if which xrectsel >/dev/null 2>&1; then
      read XPOS YPOS WIDTH HEIGHT <<< `xrectsel "%x %y %w %h"`
      WIDTH=$((WIDTH+XPOS))
      HEIGHT=$((HEIGHT+YPOS))
    else
      xwininfo >/dev/null
      read XPOS YPOS <<< `getcurpos`
      xwininfo >/dev/null
      read WIDTH HEIGHT <<< `getcurpos`
    fi
    [ ${WIDTH} -lt ${XPOS} ] && { TEMP=${WIDTH}; WIDTH=${XPOS}; XPOS=${TEMP}; }
    [ ${HEIGHT} -lt ${YPOS} ] && { TEMP=${HEIGHT}; HEIGHT=${YPOS}; YPOS=${TEMP}; }   
    WIDTH=$(( (${WIDTH}-${XPOS}) + 1))
    HEIGHT=$(( (${HEIGHT}-${YPOS}) + 1))
    [ ${WIDTH} -lt 5 ] && WIDTH=5
    [ ${HEIGHT} -lt 5 ] && HEIGHT=5
    OFFSET="+${XPOS},${YPOS}"
  ;;
esac

# ---------------------------------------------------------------------------

[ ${FRAMES} -eq 1 ] && FPS=25	# to avoid a strange, initial delay

if [ "$FFMPEG" = "ffmpeg" ] && [ "$FORMAT" = "GIF" ]; then
  LOOP_CMD="${LOOP_CMD_CONST}"
else
  LOOP_CMD=''
fi

# ---------------------------------------------------------------------------

[ ! -d "${DIRECTORY}" ] && mkdir -p "${DIRECTORY}"
FILENAME_EVAL="$(date +"${FILENAME}" -d "+ ${DELAY} seconds")"
SAVENAME="$(echo "${FILENAME_EVAL}" | tr '%"/' '_')"
SAVENAME="${DIRECTORY}/${SAVENAME}"

CNT=1
TEMPNAME="${SAVENAME}"
if [ $FRAMES -eq 1 ] || [ "${FORMAT}" = "GIF" ] ; then
  while [ -e "${TEMPNAME}.${EXT}" ]; do
    TEMPNAME="${SAVENAME}(${CNT})"
    ((CNT++))
  done
  SAVENAME="${TEMPNAME}.${EXT}"
else
  while [ -e "${TEMPNAME}" ]; do
    TEMPNAME="${SAVENAME}(${CNT})"
    ((CNT++))
  done
  mkdir -p "$TEMPNAME"
  SAVENAME="${TEMPNAME}/${FILENAME_EVAL##*/}_%03d.${EXT}"
fi

# ---------------------------------------------------------------------------

if [ ${DELAY} -gt 0 ] && [ "$TIMER" = "true" ]; then
  echo '
  <window title="'${PROG_NAME}'-'${PROG_VERSION}'" resizable="false" image-name="'${ICON}'" 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

[ "$BEEP" = "true" ] && func_beep &

################
# Take a Shot! #
################
$FFMPEG -f x11grab ${DRAW_MOUSE_OPT} -s "${WIDTH}"x"${HEIGHT}" -r ${FPS} -i ${DISPLAY}${OFFSET}${POINTER} -vframes ${FRAMES} ${PIX_FMT} ${LOOP_CMD} ${SCALE_CMD} "${SAVENAME}" > "${WORKDIR}/take_a_shot.log" 2>&1

if [ $? -ne 0 ]; then
  rm -f "${SAVENAME}"

  while :; do
    export GUI_WRONG='
    <window title="'${PROG_NAME}'-'${PROG_VERSION}'" resizable="false" image-name="'${ICON}'" window-position="1">
      <vbox>
        <frame '$(gettext "Error")'>
          <pixmap><input file stock="gtk-dialog-error"></input></pixmap>
          <text><label>'$(gettext 'Screenshot not taken, something went wrong!')'</label></text>
        </frame>
        <hbox homogeneous="true" space-fill="true" space-expand="true">
          <button>
            <label>'$(gettext "View log")'</label>
            <input file stock="gtk-index"></input>
            <action>EXIT:log</action>
          </button>
          <button>
            <label>'$(gettext "Continue")'</label>
            <input file stock="gtk-redo"></input>
            <action>EXIT:relaunch</action>
          </button>
          <button>
            <label>'$(gettext "Quit")'</label>
            <input file stock="gtk-quit"></input>
            <action>EXIT:quit</action>
          </button>
        </hbox>
      </vbox>
      <action signal="hide">exit:abort</action>
    </window>'
    
    eval $($GTKDIALOG -cp GUI_WRONG)  
    
    case "$EXIT" in
      log)		echo '
				  <window title="'${PROG_NAME}'-'${PROG_VERSION}'" image-name="'${ICON}'" window-position="1">
				    <vbox>
				      <frame '$(gettext "Log")'>
				        <edit editable="false" cursor-visible="false">
				          <input file>'${WORKDIR}/take_a_shot.log'</input>
				          <width>600</width>
				          <height>400</height>
				        </edit>
				      </frame>
				      <hbox><button ok></button></hbox>
					</vbox>
				    <action signal="hide">exit:abort</action>
				  </window>' | ${GTKDIALOG} -s
      ;;
      relaunch)	exec "${MY_NAME}" relaunch	;;
      *)		exit	;;
    esac

    sleep 0.1
  done
fi

sleep 0.5

# ---------------------------------------------------------------------------

# Optimize GIF and fix the delay (which is broken in GIFs created by older ffmpeg)
if [ "${FORMAT}" = "GIF" ] && [ ${FRAMES} -gt 1 ] && [ "`which gifsicle 2>/dev/null`" ]; then
  func_dlg INFO_NOOK "$(gettext 'Please wait, optimizing the GIF file...')" & DLGPID=$!
  gifsicle -V -d $((100/${FPS})) -i --optimize=3 --conserve-memory < "${SAVENAME}" > "${SAVENAME}_${$}_temp_${$}"
  mv "${SAVENAME}_${$}_temp_${$}" "${SAVENAME}"
  kill -s 0 ${DLGPID} 2>/dev/null && pkill -P ${DLGPID}
fi

[ ${FRAMES} -gt 1 ] && [ "${FORMAT}" != "GIF" ] && SAVENAME="${SAVENAME//\%03d/001}"

# ---------------------------------------------------------------------------

echo -n "<b>$(echo "${SAVENAME}" | sed -e 's~&~\&amp;~g' -e 's~<~\&lt;~g' -e 's~>~\&gt;~g')</b>" > "${WORKDIR}/tas_savename"
ln -sfT "${SAVENAME}" "${WORKDIR}/tas_preview"

while :; do
  if [ ! -e "${SAVENAME}" ]; then
    func_dlg ERROR "$(gettext "File no longer exists!")"
    exec "${MY_NAME}" relaunch
  else
    export GUI_POST='
    <window title="'${PROG_NAME}'-'${PROG_VERSION}'" resizable="false" image-name="'${ICON}'" window-position="1">
      <vbox>
        <frame '$(gettext "Preview")'>
          <pixmap>
            <input file>'${WORKDIR}/tas_preview'</input>
            <width>'$((MAXX/3))'</width>
            <height>'$((MAXY/3))'</height>
          </pixmap>
          <text wrap-mode="1" use-markup="true"><input file>'"${WORKDIR}/tas_savename"'</input></text>
        </frame>
        <hbox homogeneous="true" space-fill="true" space-expand="true">
          <button>
            <label>'$(gettext "Continue")'</label>
            <input file stock="gtk-redo"></input>
            <action>EXIT:relaunch</action>
          </button>
		  <button>
		    <label>'$(gettext "Discard")'</label>
		    <input file stock="gtk-delete"></input>
		    <action>EXIT:discard</action>
		  </button>
          <button>
            <label>'$(gettext "View")'</label>
            <input file stock="gtk-find"></input>
            <action>EXIT:view</action>
          </button>
          <button>
            <label>'$(gettext "Edit")'</label>
            <input file stock="gtk-edit"></input>
            <action>EXIT:edit</action>
          </button>
          <button>
            <label>'$(gettext "Quit")'</label>
            <input file stock="gtk-quit"></input>
            <action>EXIT:quit</action>
          </button>
        </hbox>
      </vbox>
      <action signal="hide">exit:abort</action>
    </window>'
    
    eval $($GTKDIALOG -cp GUI_POST)
    
    case "$EXIT" in
	  discard)
		if [ "${FORMAT}" = "GIF" ] || [ ${FRAMES} -eq 1 ]; then 
		  rm "${SAVENAME}"
		else
		  rm -r "${TEMPNAME}"	# contains dir part of SAVENAME
		fi
	    exec "${MY_NAME}" relaunch
	  ;;
	  
	  view)
	    $DEFAULTIMAGEVIEWER "${SAVENAME}"
	  ;;
	  
	  edit)
		if [ "${FORMAT}" = "GIF" ] || [ ${FRAMES} -eq 1 ]; then 
		  $DEFAULTIMAGEEDITOR "${SAVENAME}"
		else
		  $DEFAULTIMAGEEDITOR "${SAVENAME:0:${#SAVENAME}-7}"*".${EXT}"
		fi
	  ;;
	  
      relaunch)
        exec "${MY_NAME}" relaunch
      ;;
      
	  *)
	    exit
	  ;;
	esac
  fi
  sleep 0.1
done

exit

# =============================================================================
