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