#!/bin/sh xwdcommon='-nobdrs' xwdroot='-root' INFMT=pnm OUTFMT=png STOREDIR="${HOME}/.screenshots" SHOTDATE="$(date +%Y.%m.%d-%H.%M.%S)" have() { type $1 >/dev/null 2>&1 && return 0 } parse_options() { local OPT OPTARG OPTIND fmt fmtlist prefix while getopts d:f:bhlqs OPT; do # escape meta OPTARG=${OPTARG%%[;\\\$]*} case ${OPT} in b) xwdcommon="${xwdcommon} -frame" ;; d) delay="${OPTARG}" ;; f) OUTFMT="${OPTARG}" unset INFMT for fmt in pnm pbm pgm ppm; do have "${fmt}to${OUTFMT}" && { INFMT=${fmt}; break; } done [ -z "${INFMT}" ] && usage ;; l) prefix=$(type ppmtoppm 2>/dev/null | \ sed 's:ppmtoppm is \(.*\)ppmtoppm:\1:') if [ -z "${prefix}" ]; then echo 'Cannot find image converters. Make sure that netpbm are installed' exit 1 fi fmtlist=$(echo ${prefix}/p[nbgp]mto* | tr ' ' '\n' | \ sed -E 's:^.*/(pnm|pbm|pgm|ppm)to::g') echo Supported output formats: echo ${fmtlist} exit 0 ;; q) xwdcommon="${xwdcommon} -silent";; s) unset xwdroot ;; *) usage ;; esac done OPTC=$((${OPTIND} - 1)) } usage() { echo "usage: ${0##*/} [-bhlqs] [-d sec] [-f outfmt] [shotname]" echo ' -b when selecting a window, grab wm border too' echo ' -d wait sec seconds before taking a shot' echo ' -f set output format' echo ' -h display this help and exit' echo ' -l list output formats' echo ' -q be silent' echo ' -s interactively choose a window' echo echo "By default screenshots stored in ${STOREDIR}" echo exit 1 } parse_options ${1+"$@"} shift ${OPTC} if [ -z ${@+1} ]; then SHOTNAME="${STOREDIR}/screenshot-${SHOTDATE}.${OUTFMT}" else SHOTNAME=$1 shift [ -z ${@+1} ] || usage fi [ -d "${STOREDIR}" ] || mkdir "${STOREDIR}" [ -n "${delay}" ] && sleep "${delay}" xwd ${xwdcommon} ${xwdroot} | xwdtopnm 2>/dev/null | \ "${INFMT}to${OUTFMT}" 2>/dev/null > "${SHOTNAME}"