| 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//&/&}; cmd=${cmd//</<}; cmd=${cmd//>/>} |
| 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 |