chiark / gitweb /
34048c00fb83bc191f82e778fe7dc8f0015d70c6
[profile] / bin / wakey.zsh
1 ### -*-sh-*-
2
3 ## This idea shamelessly stolen from Jonathan Lange's `undistract-me'; see
4 ## <https://github.com/jml/undistract-me>.
5
6 __wakey_start=nil __wakey_cmd=
7 : ${LONG_RUNNING_COMMAND_TIMEOUT=10}; export LONG_RUNNING_COMMAND_TIMEOUT
8 : ${IGNORE_WINDOW_CHECK=nil}; export IGNORE_WINDOW_CHECK
9 : ${LONG_RUNNING_IGNORE_LIST=}; export LONG_RUNNING_IGNORE_LIST
10
11 __wakey_preexec () {
12   case $__wakey_start in
13     nil)
14       case $LONG_RUNNING_IGNORE_LIST in
15         *" $1 "*) ;;
16         *) __wakey_start=$SECONDS __wakey_cmd=$1 ;;
17       esac
18       ;;
19   esac
20 }
21
22 __wakey_precmd () {
23   typeset icon head rc=$? cmd suppress=nil
24   typeset -i 10 win i now=$SECONDS
25
26   case $__wakey_start in
27     nil) ;;
28     *)
29       if (( now - __wakey_start < LONG_RUNNING_COMMAND_TIMEOUT )); then
30         suppress=t
31       else
32         case $IGNORE_WINDOW_CHECK in
33           t) ;;
34           *)
35             win=$(xprop -root _NET_ACTIVE_WINDOW | sed 's/^.*# //')
36             if (( win == WINDOWID )); then
37               suppress=t
38             else
39               for i in $(xwininfo -tree -id $win |
40                               sed -n '/^ *[0-9]\+ child\(ren\)\?[.:]$/,$ {
41                                 /^ *\(0x[0-9a-f]\+\) (.*$/s//\1/p
42                               }')
43               do
44                 if (( i == WINDOWID )); then suppress=t; break; fi
45               done
46             fi
47         esac
48       fi
49       case $suppress in
50         t) ;;
51         *)
52           case $rc in
53             0) icon=trophy-gold head="Command completed" ;;
54             *) icon=dialog-warning head="Command FAILED (rc = $rc)" ;;
55           esac
56           cmd=${__wakey_cmd//&/&amp;}; cmd=${cmd//</&lt;}; cmd=${cmd//>/&gt;}
57           notify-send -c Wakey -i $icon -t 5000 $head $cmd
58       esac
59       __wakey_start=nil
60       ;;
61   esac
62 }
63
64 case ${DISPLAY-nil},${WINDOWID-nil} in
65   nil,* | *,nil) ;;
66   *)
67     if whence notify-send >/dev/null 2>&1; then
68       preexec_functions+=(__wakey_preexec)
69       precmd_functions+=(__wakey_precmd)
70     fi
71     ;;
72 esac