161 lines
4.3 KiB
Bash
161 lines
4.3 KiB
Bash
|
#! /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##*/}
|