dot/e16-bindings, bin/media-keys: Keybindings for media players.
authorMark Wooding <mdw@distorted.org.uk>
Fri, 20 Jul 2018 20:34:30 +0000 (21:34 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Sat, 21 Jul 2018 01:02:32 +0000 (02:02 +0100)
Makefile
bin/media-keys [new file with mode: 0755]
dot/e16-bindings

index 000074c..fd34e33 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -281,6 +281,7 @@ SCRIPTLINKS         += xinitcmd lock-screen xshutdown
 SCRIPTLINKS            += un-backslashify-selection
 SCRIPTLINKS            += xpra-start-xdummy
 SCRIPTLINKS            += play-rawk
 SCRIPTLINKS            += un-backslashify-selection
 SCRIPTLINKS            += xpra-start-xdummy
 SCRIPTLINKS            += play-rawk
+SCRIPTLINKS            += media-keys
 
 DOTCPP                 += .Xdefaults
 Xdefaults_DEFS          = -DEMACSWD=$(call mdw-conf,emacs-width,77)
 
 DOTCPP                 += .Xdefaults
 Xdefaults_DEFS          = -DEMACSWD=$(call mdw-conf,emacs-width,77)
diff --git a/bin/media-keys b/bin/media-keys
new file mode 100755 (executable)
index 0000000..91e6d11
--- /dev/null
@@ -0,0 +1,85 @@
+#! /usr/bin/zsh -e
+
+bail () { echo >&2 "$*"; exit 2; }
+
+disorder=(disorder)
+
+get-disorder-state () {
+  coproc stdbuf -oL $disorder log; kid=$!
+
+  while read -Ap i; do
+    case $i[2] in
+      state)
+       case $i[3] in
+         enable_random) randp=t ;;
+         disable_random) randp=nil ;;
+         enable_play) playp=t ;;
+         disable_play) playp=nil ;;
+         resume) pausep=nil ;;
+         pause) pausep=t ;;
+       esac
+       ;;
+      *)
+       break
+       ;;
+    esac
+  done
+  kill $kid
+}
+
+alsa_mixer=Master,0
+op-volume-up () { amixer sset $alsa_mixer 5%+ >/dev/null; }
+op-volume-down () { amixer sset $alsa_mixer 5%- >/dev/null; }
+
+op-now-playing () {
+  coproc $disorder playing; kid=$!
+  read -p k track
+  case $k in
+    nothing) echo "Not playing."; return ;;
+    track) ;;
+    *) bail "unexpected first-line token \`$k'" ;;
+  esac
+  read -p k _
+  case $k in id) ;; *) bail "unexpected second-line token \`$k'" ;; esac
+  read -p k _
+  case $k in played) ;; *) bail "unexpected third-line token \`$k'" ;; esac
+  read -pA t
+  case $t[-1] in started) st="" ;; paused) st=" (paused)" ;; esac
+  kill $kid
+
+  artist=$(disorder part $track display artist)
+  album=$(disorder part $track display album)
+  title=$(disorder part $track display title)
+  case $artist in [A-Z]) artist=$album album= ;; esac
+  echo "$artist: ‘$title’${album+, from ‘$album’}"
+}
+
+op-scratch () { disorder scratch; }
+op-enable/disable () {
+  get-disorder-state
+  case $playp in
+    t) disorder disable ;;
+    nil) disorder enable ;;
+  esac
+}
+op-play/pause () {
+  get-disorder-state
+  case $playp,$pausep in
+    nil,t) disorder enable; disorder resume ;;
+    nil,nil) disorder enable ;;
+    t,t) disorder resume ;;
+    t,nil) disorder pause ;;
+  esac
+}
+
+if [[ -e $HOME/etc/media-keys.local ]]; then
+  . $HOME/etc/media-keys.local
+fi
+
+case $# in 0) echo >&2 "usage: $0 OP"; exit 2 ;; esac
+op=$1; shift
+case $(whence -w op-$op) in
+  "op-$op: function") ;;
+  *) echo >&2 "$0: unknown operation \`$op'"; exit 2 ;;
+esac
+op-$op "$@"
index c0ad1db..064a3c3 100644 (file)
@@ -60,6 +60,14 @@ KeyDown   C5        s wop * stick
 KeyDown   C5        v wop * th available
 KeyDown   C5        w menus show winops.menu
 KeyDown   C5        x wop * close
 KeyDown   C5        v wop * th available
 KeyDown   C5        w menus show winops.menu
 KeyDown   C5        x wop * close
+KeyDown   C5 numbersign exec xinitcmd pavucontrol
+KeyDown   C5 apostrophe exec xinitcmd disobedience
+KeyDown   C5     plus exec media-keys volume-up
+KeyDown   C5    minus exec media-keys volume-down
+KeyDown   C5   period exec media-keys enable/disable
+KeyDown   C5    comma exec gdbus call -e -d org.freedesktop.Notifications -o /org/freedesktop/Notifications -m org.freedesktop.Notifications.Notify -- DisOrder 0 audio-volume-high "Now playing" "$(media-keys now-playing)" "[]" "{}" 5000
+KeyDown   C5    slash exec media-keys scratch
+KeyDown   C5    space exec media-keys play/pause
 KeyDown   C5       F1 menus show file.menu
 KeyDown   C5       F2 menus show enlightenment.menu
 KeyDown   C5       F3 menus show settings.menu
 KeyDown   C5       F1 menus show file.menu
 KeyDown   C5       F2 menus show enlightenment.menu
 KeyDown   C5       F3 menus show settings.menu