chiark / gitweb /
bin/media-keys: Don't break just because someone actually picked a track.
[profile] / bin / wakey.sh
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   local icon head rc=$? cmd suppress=nil win i now=$SECONDS
24
25   case $__wakey_start in
26     nil) ;;
27     *)
28       if (( now - __wakey_start < LONG_RUNNING_COMMAND_TIMEOUT )); then
29         suppress=t
30       else
31         case $IGNORE_WINDOW_CHECK in
32           t) ;;
33           *)
34             win=$(xprop -root _NET_ACTIVE_WINDOW | sed 's/^.*# //')
35             if (( win == WINDOWID )); then
36               suppress=t
37             else
38               for i in $(xwininfo -tree -id $win 2>/dev/null |
39                               sed -n '/^ *[0-9]\+ child\(ren\)\?[.:]$/,$ {
40                                 /^ *\(0x[0-9a-f]\+\) (.*$/s//\1/p
41                               }')
42               do
43                 if (( i == WINDOWID )); then suppress=t; break; fi
44               done
45             fi
46         esac
47       fi
48       case $suppress in
49         t) ;;
50         *)
51           case $rc in
52             0) icon=trophy-gold head="Command completed" ;;
53             *) icon=dialog-warning head="Command FAILED (rc = $rc)" ;;
54           esac
55           cmd=${__wakey_cmd//&/&amp;}; cmd=${cmd//</&lt;}; cmd=${cmd//>/&gt;}
56           notify-send -c Wakey -i $icon -t 5000 "$head" "$cmd"
57       esac
58       __wakey_start=nil
59       ;;
60   esac
61 }
62
63 case ${DISPLAY+t},${WINDOWID+t},${__mdw_precmd_hook+t},${__mdw_preexec_hook+t} in
64   t,t,t,t)
65     if __mdw_programp notify-send; then
66       __mdw_addhook __mdw_preexec_hook __wakey_preexec
67       __mdw_addhook __mdw_precmd_hook __wakey_precmd
68     fi
69     ;;
70 esac