From: martin f. krafft Date: Sun, 12 Aug 2018 01:19:48 +0000 (+1200) Subject: Attachment viewing in the background X-Git-Url: https://git.madduck.net/etc/mutt.git/commitdiff_plain/76227d1c302ee76d82c037e923c70edc61fd5aea Attachment viewing in the background This makes use of Mutt's internal mailcap handling to inject a script before deferring to run-mailcap, saving the attachment to a temporary file, backgrounding the viewer process, and then cleaning up the temporary stuff after its return. Stdout/stderr are reported using Awesome's naughty library, so this will not work on other window managers for now. text/html files are handled differently to address the issue that Firefox would return to the shell before the remote process even accessed the file (https://bugzilla.mozilla.org/show_bug.cgi?id=1482024) --- diff --git a/.mutt/bgrun b/.mutt/bgrun new file mode 100755 index 0000000..e0bcd20 --- /dev/null +++ b/.mutt/bgrun @@ -0,0 +1,60 @@ +#!/bin/sh + +SELF="${0##*/}" + +if [ -z "$TMPDIR" ]; then + TMPDIR=/tmp +elif [ -d "${TMPDIR}/volatile" ]; then + TMPDIR="${TMPDIR}/volatile" +fi +export TMPDIR +TMPDIR=$(mktemp -dp "$TMPDIR" mutt.XXXXXXXXXX) +trap "rm -rf '$TMPDIR'" 1 2 3 4 5 6 7 8 10 11 12 13 14 15 + +BASENAME="${1##*/}" +TEMPFILE="${TMPDIR}/${BASENAME}" + +notify() { + if [ -x "$(command -v awesome-client)" ]; then + awesome-client <<-_eof + local naughty = require("naughty") + naughty.notify({ preset = naughty.config.presets.low, + title = "$3", + text = [[stdout: + $(sed -e 's,\",\\\",g' "$1") + stderr: + $(sed -e 's,\",\\\",g' "$2")]] + }) + _eof + fi +} + +case "$SELF" in + (bgrun) + # make a copy of the file, then launch a shell process in the background + # to divert to run-mailcap, after which the temporary directory gets + # cleaned up. + cp -a "$1" $TMPDIR + MIMETYPE="$2" + ( + run-mailcap --action=view "$MIMETYPE":"$TEMPFILE" + rm -rf "$TMPDIR" + if [ -s "$TMPDIR/output.stdout" ] || [ -s "$TMPDIR/output.stderr" ]; then + notify $TMPDIR/output.stdout $TMPDIR/output.stderr \ + "Output from mutt/$SELF on $BASENAME" + fi + ) & + trap - 1 2 3 4 5 6 7 8 10 11 12 13 14 15 + ;; + (browserrun) + # hack to stay around until the browser has read the file: make a fifo and + # wait for the cat process to finish writing to it, which means that it + # must have been consumed on the other end. + mkfifo "$TEMPFILE" + INPUTFILE="$1" + cat "$INPUTFILE" > $TEMPFILE & + sensible-browser "$TEMPFILE" > $TMPDIR/output.stdout 2> $TMPDIR/output.stderr + wait + ;; +esac + diff --git a/.mutt/browserrun b/.mutt/browserrun new file mode 120000 index 0000000..b07e7aa --- /dev/null +++ b/.mutt/browserrun @@ -0,0 +1 @@ +bgrun \ No newline at end of file diff --git a/.mutt/mailcap.backgrounding b/.mutt/mailcap.backgrounding new file mode 100644 index 0000000..37b57ed --- /dev/null +++ b/.mutt/mailcap.backgrounding @@ -0,0 +1,6 @@ +# +# Mutt mailcap for backgrounding + +text/html; ~/.mutt/browserrun %s; description=Open file in browser via FIFO +application/*; ~/.mutt/bgrun %s %t; description=Backgrounded run of run-mailcap +image/*; ~/.mutt/bgrun %s %t; description=Backgrounded run of run-mailcap diff --git a/.mutt/muttrc b/.mutt/muttrc index 9315ab1..4281b4b 100644 --- a/.mutt/muttrc +++ b/.mutt/muttrc @@ -1552,6 +1552,7 @@ set include=yes # This variable specifies which files to consult when attempting to # display MIME bodies not directly supported by Mutt. # +set mailcap_path="$my_confdir/mailcap.backgrounding" # # set mailcap_sanitize=yes #