chiark / gitweb /
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 000074c512a4250871cb7125f41ccef18bd48f1f..fd34e336df1bd32843d335d31512a2fdbe2c721a 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            += media-keys
 
 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 c0ad1db051e13d97a27eb2937440881f3979b274..064a3c34113c7e918a2ccb6cc9662756cb796ece 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 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