emacs: show: move the insertion of the header button to the top level

Previously each of the part insertion handlers inserted the part
button themselves. Move this up into
notmuch-show-insert-bodypart. Since a small number of the handlers
modify the button (the encryption/signature ones) we need to pass the
header button as an argument into the individual part insertion
handlers. However, the declared-type argument was only used for the
text for the part buttons we can now omit it.

The patch is large but mostly simple. The only things of note are that
we let the text/plain handler applies notmuch-wash to the whole part
including the part button. In particular, notmuch-wash removes leading
blank lines from a text/plain part, but since the button is counted as
part of the part this does not happen with text/plain buttons that
have a button. This is probably a bug in notmuch-wash but changing it
does make several tests fail (that rely on this blank line) so, for
the moment, keep the old behaviour.
This commit is contained in:
Mark Walters 2013-06-10 05:57:09 +01:00 committed by David Bremner
parent 27768309ce
commit 702210b84d

View file

@ -514,8 +514,7 @@ message at DEPTH in the current thread."
(mapcar (lambda (inner-part) (plist-get inner-part :content-type)) (mapcar (lambda (inner-part) (plist-get inner-part :content-type))
(plist-get part :content))) (plist-get part :content)))
(defun notmuch-show-insert-part-multipart/alternative (msg part content-type nth depth declared-type) (defun notmuch-show-insert-part-multipart/alternative (msg part content-type nth depth button)
(notmuch-show-insert-part-header nth declared-type content-type nil)
(let ((chosen-type (car (notmuch-multipart/alternative-choose (notmuch-show-multipart/*-to-list part)))) (let ((chosen-type (car (notmuch-multipart/alternative-choose (notmuch-show-multipart/*-to-list part))))
(inner-parts (plist-get part :content)) (inner-parts (plist-get part :content))
(start (point))) (start (point)))
@ -592,8 +591,7 @@ message at DEPTH in the current thread."
content-type) content-type)
nil))) nil)))
(defun notmuch-show-insert-part-multipart/related (msg part content-type nth depth declared-type) (defun notmuch-show-insert-part-multipart/related (msg part content-type nth depth button)
(notmuch-show-insert-part-header nth declared-type content-type nil)
(let ((inner-parts (plist-get part :content)) (let ((inner-parts (plist-get part :content))
(start (point))) (start (point)))
@ -612,8 +610,7 @@ message at DEPTH in the current thread."
(indent-rigidly start (point) 1))) (indent-rigidly start (point) 1)))
t) t)
(defun notmuch-show-insert-part-multipart/signed (msg part content-type nth depth declared-type) (defun notmuch-show-insert-part-multipart/signed (msg part content-type nth depth button)
(let ((button (notmuch-show-insert-part-header nth declared-type content-type nil)))
(button-put button 'face 'notmuch-crypto-part-header) (button-put button 'face 'notmuch-crypto-part-header)
;; add signature status button if sigstatus provided ;; add signature status button if sigstatus provided
(if (plist-member part :sigstatus) (if (plist-member part :sigstatus)
@ -621,7 +618,7 @@ message at DEPTH in the current thread."
(sigstatus (car (plist-get part :sigstatus)))) (sigstatus (car (plist-get part :sigstatus))))
(notmuch-crypto-insert-sigstatus-button sigstatus from)) (notmuch-crypto-insert-sigstatus-button sigstatus from))
;; if we're not adding sigstatus, tell the user how they can get it ;; if we're not adding sigstatus, tell the user how they can get it
(button-put button 'help-echo "Set notmuch-crypto-process-mime to process cryptographic MIME parts."))) (button-put button 'help-echo "Set notmuch-crypto-process-mime to process cryptographic MIME parts."))
(let ((inner-parts (plist-get part :content)) (let ((inner-parts (plist-get part :content))
(start (point))) (start (point)))
@ -634,8 +631,7 @@ message at DEPTH in the current thread."
(indent-rigidly start (point) 1))) (indent-rigidly start (point) 1)))
t) t)
(defun notmuch-show-insert-part-multipart/encrypted (msg part content-type nth depth declared-type) (defun notmuch-show-insert-part-multipart/encrypted (msg part content-type nth depth button)
(let ((button (notmuch-show-insert-part-header nth declared-type content-type nil)))
(button-put button 'face 'notmuch-crypto-part-header) (button-put button 'face 'notmuch-crypto-part-header)
;; add encryption status button if encstatus specified ;; add encryption status button if encstatus specified
(if (plist-member part :encstatus) (if (plist-member part :encstatus)
@ -647,7 +643,7 @@ message at DEPTH in the current thread."
(sigstatus (car (plist-get part :sigstatus)))) (sigstatus (car (plist-get part :sigstatus))))
(notmuch-crypto-insert-sigstatus-button sigstatus from)))) (notmuch-crypto-insert-sigstatus-button sigstatus from))))
;; if we're not adding encstatus, tell the user how they can get it ;; if we're not adding encstatus, tell the user how they can get it
(button-put button 'help-echo "Set notmuch-crypto-process-mime to process cryptographic MIME parts."))) (button-put button 'help-echo "Set notmuch-crypto-process-mime to process cryptographic MIME parts."))
(let ((inner-parts (plist-get part :content)) (let ((inner-parts (plist-get part :content))
(start (point))) (start (point)))
@ -660,8 +656,7 @@ message at DEPTH in the current thread."
(indent-rigidly start (point) 1))) (indent-rigidly start (point) 1)))
t) t)
(defun notmuch-show-insert-part-multipart/* (msg part content-type nth depth declared-type) (defun notmuch-show-insert-part-multipart/* (msg part content-type nth depth button)
(notmuch-show-insert-part-header nth declared-type content-type nil)
(let ((inner-parts (plist-get part :content)) (let ((inner-parts (plist-get part :content))
(start (point))) (start (point)))
;; Show all of the parts. ;; Show all of the parts.
@ -673,8 +668,7 @@ message at DEPTH in the current thread."
(indent-rigidly start (point) 1))) (indent-rigidly start (point) 1)))
t) t)
(defun notmuch-show-insert-part-message/rfc822 (msg part content-type nth depth declared-type) (defun notmuch-show-insert-part-message/rfc822 (msg part content-type nth depth button)
(notmuch-show-insert-part-header nth declared-type content-type nil)
(let* ((message (car (plist-get part :content))) (let* ((message (car (plist-get part :content)))
(body (car (plist-get message :body))) (body (car (plist-get message :body)))
(start (point))) (start (point)))
@ -695,12 +689,13 @@ message at DEPTH in the current thread."
(indent-rigidly start (point) 1))) (indent-rigidly start (point) 1)))
t) t)
(defun notmuch-show-insert-part-text/plain (msg part content-type nth depth declared-type) (defun notmuch-show-insert-part-text/plain (msg part content-type nth depth button)
(let ((start (point))) ;; For backward compatibility we want to apply the text/plain hook
;; If this text/plain part is not the first part in the message, ;; to the whole of the part including the part button if there is
;; insert a header to make this clear. ;; one.
(if (> nth 1) (let ((start (if button
(notmuch-show-insert-part-header nth declared-type content-type (plist-get part :filename))) (button-start button)
(point))))
(insert (notmuch-get-bodypart-content msg part nth notmuch-show-process-crypto)) (insert (notmuch-get-bodypart-content msg part nth notmuch-show-process-crypto))
(save-excursion (save-excursion
(save-restriction (save-restriction
@ -708,8 +703,7 @@ message at DEPTH in the current thread."
(run-hook-with-args 'notmuch-show-insert-text/plain-hook msg depth)))) (run-hook-with-args 'notmuch-show-insert-text/plain-hook msg depth))))
t) t)
(defun notmuch-show-insert-part-text/calendar (msg part content-type nth depth declared-type) (defun notmuch-show-insert-part-text/calendar (msg part content-type nth depth button)
(notmuch-show-insert-part-header nth declared-type content-type (plist-get part :filename))
(insert (with-temp-buffer (insert (with-temp-buffer
(insert (notmuch-get-bodypart-content msg part nth notmuch-show-process-crypto)) (insert (notmuch-get-bodypart-content msg part nth notmuch-show-process-crypto))
;; notmuch-get-bodypart-content provides "raw", non-converted ;; notmuch-get-bodypart-content provides "raw", non-converted
@ -732,8 +726,8 @@ message at DEPTH in the current thread."
t) t)
;; For backwards compatibility. ;; For backwards compatibility.
(defun notmuch-show-insert-part-text/x-vcalendar (msg part content-type nth depth declared-type) (defun notmuch-show-insert-part-text/x-vcalendar (msg part content-type nth depth button)
(notmuch-show-insert-part-text/calendar msg part content-type nth depth declared-type)) (notmuch-show-insert-part-text/calendar msg part content-type nth depth button))
(defun notmuch-show-get-mime-type-of-application/octet-stream (part) (defun notmuch-show-get-mime-type-of-application/octet-stream (part)
;; If we can deduce a MIME type from the filename of the attachment, ;; If we can deduce a MIME type from the filename of the attachment,
@ -751,7 +745,7 @@ message at DEPTH in the current thread."
nil)) nil))
nil)))) nil))))
(defun notmuch-show-insert-part-text/html (msg part content-type nth depth declared-type) (defun notmuch-show-insert-part-text/html (msg part content-type nth depth button)
;; text/html handler to work around bugs in renderers and our ;; text/html handler to work around bugs in renderers and our
;; invisibile parts code. In particular w3m sets up a keymap which ;; invisibile parts code. In particular w3m sets up a keymap which
;; "leaks" outside the invisible region and causes strange effects ;; "leaks" outside the invisible region and causes strange effects
@ -759,11 +753,10 @@ message at DEPTH in the current thread."
;; tell w3m not to set a keymap (so the normal notmuch-show-mode-map ;; tell w3m not to set a keymap (so the normal notmuch-show-mode-map
;; remains). ;; remains).
(let ((mm-inline-text-html-with-w3m-keymap nil)) (let ((mm-inline-text-html-with-w3m-keymap nil))
(notmuch-show-insert-part-*/* msg part content-type nth depth declared-type))) (notmuch-show-insert-part-*/* msg part content-type nth depth button)))
(defun notmuch-show-insert-part-*/* (msg part content-type nth depth declared-type) (defun notmuch-show-insert-part-*/* (msg part content-type nth depth button)
;; This handler _must_ succeed - it is the handler of last resort. ;; This handler _must_ succeed - it is the handler of last resort.
(notmuch-show-insert-part-header nth content-type declared-type (plist-get part :filename))
(notmuch-mm-display-part-inline msg part nth content-type notmuch-show-process-crypto) (notmuch-mm-display-part-inline msg part nth content-type notmuch-show-process-crypto)
t) t)
@ -786,13 +779,13 @@ message at DEPTH in the current thread."
;; ;;
(defun notmuch-show-insert-bodypart-internal (msg part content-type nth depth declared-type) (defun notmuch-show-insert-bodypart-internal (msg part content-type nth depth button)
(let ((handlers (notmuch-show-handlers-for content-type))) (let ((handlers (notmuch-show-handlers-for content-type)))
;; Run the content handlers until one of them returns a non-nil ;; Run the content handlers until one of them returns a non-nil
;; value. ;; value.
(while (and handlers (while (and handlers
(not (condition-case err (not (condition-case err
(funcall (car handlers) msg part content-type nth depth declared-type) (funcall (car handlers) msg part content-type nth depth button)
(error (progn (error (progn
(insert "!!! Bodypart insert error: ") (insert "!!! Bodypart insert error: ")
(insert (error-message-string err)) (insert (error-message-string err))
@ -820,6 +813,7 @@ message at DEPTH in the current thread."
"Insert the body part PART at depth DEPTH in the current thread. "Insert the body part PART at depth DEPTH in the current thread.
If HIDE is non-nil then initially hide this part." If HIDE is non-nil then initially hide this part."
(let* ((content-type (downcase (plist-get part :content-type))) (let* ((content-type (downcase (plist-get part :content-type)))
(mime-type (or (and (string= content-type "application/octet-stream") (mime-type (or (and (string= content-type "application/octet-stream")
(notmuch-show-get-mime-type-of-application/octet-stream part)) (notmuch-show-get-mime-type-of-application/octet-stream part))
@ -827,9 +821,12 @@ If HIDE is non-nil then initially hide this part."
"text/x-diff") "text/x-diff")
content-type)) content-type))
(nth (plist-get part :id)) (nth (plist-get part :id))
(beg (point))) (beg (point))
;; We omit the part button for the first (or only) part if this is text/plain.
(button (unless (and (string= mime-type "text/plain") (<= nth 1))
(notmuch-show-insert-part-header nth mime-type content-type (plist-get part :filename)))))
(notmuch-show-insert-bodypart-internal msg part mime-type nth depth content-type) (notmuch-show-insert-bodypart-internal msg part mime-type nth depth button)
;; Some of the body part handlers leave point somewhere up in the ;; Some of the body part handlers leave point somewhere up in the
;; part, so we make sure that we're down at the end. ;; part, so we make sure that we're down at the end.
(goto-char (point-max)) (goto-char (point-max))