bin/wakey.sh: Rename, now that it's not `zsh'-specific.
[profile] / bin / wakey.sh
diff --git a/bin/wakey.sh b/bin/wakey.sh
new file mode 100644 (file)
index 0000000..6f008a9
--- /dev/null
@@ -0,0 +1,71 @@
+### -*-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//&/&amp;}; cmd=${cmd//</&lt;}; cmd=${cmd//>/&gt;}
+         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