--- /dev/null
+### -*-sh-*-
+
+## This idea shamelessly stolen from Jonathan Lange's `undistract-me'; see
+## <https://github.com/jml/undistract-me>.
+
+__wakey_start=nil __wakey_cmd=
+: ${LONG_RUNNING_COMMAND_TIMEOUT=10}; export LONG_RUNNING_COMMAND_TIMEOUT
+: ${IGNORE_WINDOW_CHECK=nil}; export IGNORE_WINDOW_CHECK
+: ${LONG_RUNNING_IGNORE_LIST=}; export LONG_RUNNING_IGNORE_LIST
+
+__wakey_preexec () {
+ case $__wakey_start in
+ nil)
+ case " $LONG_RUNNING_IGNORE_LIST " in
+ *" $1 "*) ;;
+ *) __wakey_start=$SECONDS __wakey_cmd=$1 ;;
+ esac
+ ;;
+ esac
+}
+
+__wakey_precmd () {
+ local icon head rc=$? cmd suppress=nil win i now=$SECONDS
+
+ case $__wakey_start in
+ nil) ;;
+ *)
+ if (( now - __wakey_start < LONG_RUNNING_COMMAND_TIMEOUT )); then
+ suppress=t
+ else
+ case $IGNORE_WINDOW_CHECK in
+ t) ;;
+ *)
+ win=$(xprop -root _NET_ACTIVE_WINDOW | sed 's/^.*# //')
+ if (( win == WINDOWID )); then
+ suppress=t
+ else
+ for i in $(xwininfo -tree -id $win |
+ sed -n '/^ *[0-9]\+ child\(ren\)\?[.:]$/,$ {
+ /^ *\(0x[0-9a-f]\+\) (.*$/s//\1/p
+ }')
+ do
+ if (( i == WINDOWID )); then suppress=t; break; fi
+ done
+ fi
+ esac
+ fi
+ case $suppress in
+ t) ;;
+ *)
+ case $rc in
+ 0) icon=trophy-gold head="Command completed" ;;
+ *) icon=dialog-warning head="Command FAILED (rc = $rc)" ;;
+ esac
+ cmd=${__wakey_cmd//&/&}; cmd=${cmd//</<}; cmd=${cmd//>/>}
+ notify-send -c Wakey -i $icon -t 5000 "$head" "$cmd"
+ esac
+ __wakey_start=nil
+ ;;
+ esac
+}
+
+case ${DISPLAY+t},${WINDOWID+t},${__mdw_precmd_hook+t},${mdw__preexec_hook+t} in
+ t,t,t,t) ;;
+ *)
+ if __mdw_programp notify-send ; then
+ __mdw_addhook __mdw_preexec_hook __wakey_preexec
+ __mdw_addhook __mdw_precmd_hook __wakey_precmd
+ fi
+ ;;
+esac