dotfiles/config/openbox/desktop-pause.sh

161 lines
4.3 KiB
Bash
Executable File

#! /bin/sh
# Copyright (c) 2018 Slawomir Wojciech Wojtczak (vermaden)
# All rights reserved.
#
# THIS SOFTWARE USES FREEBSD LICENSE (ALSO KNOWN AS 2-CLAUSE BSD LICENSE)
# https://www.freebsd.org/copyright/freebsd-license.html
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that following conditions are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS 'AS IS' AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# ------------------------------
# DESKTOP ANY APPLICATION PAUSE
# ------------------------------
# vermaden [AT] interia [DOT] pl
# https://vermaden.wordpress.com
__usage() {
echo "usage: ${0##*/} OPTION [ARGUMENT]"
echo
echo "OPTIONS:"
echo " -a - Do pause/resume active window."
echo " -A - Do pause/resume active window and minimize it."
echo " -s - Do pause/resume interactively selected window."
echo " -S - Do pause/resume interactively selected window and minimize it."
echo " -p - Do pause/resume specified PID."
echo " -l - Do list paused processes/windows."
echo " -L - Do list paused processes/windows with PIDs."
echo
echo "ARGUMENT:"
echo " PID for '-p' option."
echo
exit 1
}
case ${1} in
(-a)
PID=$( xdotool getactivewindow getwindowpid )
;;
(-A)
PID=$( xdotool getactivewindow getwindowpid )
MIN=1
;;
(-p)
if ! expr ${2} + 1 1> /dev/null 2> /dev/null
then
echo "[x] PID must be a number."
exit 1
else
if [ ${2} -lt 1 -o ${2} -gt 99999 ]
then
echo "[x] PID must be in the 1-99999 number range."
exit 1
fi
fi
if ! ps -o pid ${2} 1> /dev/null 2> /dev/null
then
echo "[x] PID '${2}' does not exists."
exit 1
fi
PID=${2}
;;
(-s)
PID=$( xprop | awk '/^_NET_WM_PID/ {print $3}' )
;;
(-S)
PID=$( xprop | awk '/^_NET_WM_PID/ {print $3}' )
MIN=1
;;
(-l)
ps -U ${USER} -o state,comm \
| grep '^T' \
| grep -v 'Ts+' \
| sort -u \
| awk '{print $2}'
exit 0
;;
(-L)
ps -U ${USER} -o state,pid,comm \
| grep '^T' \
| grep -v 'Ts+' \
| awk '{print substr($0, index($0, $2))}'
exit 0
;;
(*)
__usage
;;
esac
if [ "${PID}" = "" ]
then
echo "[x] Could not get PID of the window."
exit 1
fi
STATE=$( ps -o state ${PID} | sed 1d )
case ${STATE} in
(I*|S*|R*) SIGNAL=STOP ;;
(T*) SIGNAL=CONT ;;
(*)
zenity --info --text "[x] not supported '${STATE}' process state." \
1> /dev/null 2> /dev/null
echo "[x] not supported '${STATE}' process state."
exit 1
;;
esac
if [ "${MIN}" = "1" -a "${SIGNAL}" = "STOP" ]
then
for WINDOW in $( xdotool search --pid ${PID} )
do
xdotool windowminimize ${WINDOW}
echo "[i] xdotool windowminimize ${WINDOW} (PID: ${PID})"
done
fi
kill -${SIGNAL} ${PID}
echo "[i] kill -${SIGNAL} ${PID}"
pgrep -P ${PID} \
| while read I
do
if [ "${MIN}" = "1" -a "${SIGNAL}" = "STOP" ]
then
for WINDOW in $( xdotool search --pid ${I} )
do
xdotool windowminimize ${WINDOW}
echo "[i]: xdotool windowminimize ${WINDOW} (PID: ${I})"
done
fi
kill -${SIGNAL} ${I}
echo "[i] kill -${SIGNAL} ${I}"
done
echo '1' >> ~/scripts/stats/${0##*/}