--- mm-decode.el.orig Fri May 4 21:17:17 2001 +++ mm-decode.el Fri May 4 21:18:23 2001 @@ -22,6 +22,14 @@ ;;; Commentary: +;; Jaap-Henk Hoepman (jhh@xs4all.nl): +;; +;; Added support for delayed destroy of external MIME viewers. All external +;; viewers for mime types in mm-keep-viewer-alive-types will remain active +;; after switching articles or groups, and will only be removed when exiting +;; gnus. +;; + ;;; Code: (require 'mail-parse) @@ -32,6 +40,8 @@ (eval-and-compile (autoload 'mm-inline-partial "mm-partial")) +(add-hook 'gnus-exit-gnus-hook 'mm-destroy-postponed-undisplay-list) + (defgroup mime-display () "Display of MIME in mail and news articles." :link '(custom-manual "(emacs-mime)Customization") @@ -158,6 +168,15 @@ "List of media types that are to be displayed inline." :type '(repeat string) :group 'mime-display) + +(defcustom mm-keep-viewer-alive-types + '("application/postscript" "application/msword" "application/vnd.ms-excel" + "application/pdf" "application/x-dvi" + ) + "List of media types for which the external viewer will not be killed +when selecting a different article." + :type '(repeat string) + :group 'mime-display) (defcustom mm-automatic-display '("text/plain" "text/enriched" "text/richtext" "text/html" @@ -212,6 +231,7 @@ (defvar mm-dissection-list nil) (defvar mm-last-shell-command "") (defvar mm-content-id-alist nil) +(defvar mm-postponed-undisplay-list nil) ;; According to RFC2046, in particular, in a digest, the default ;; Content-Type value for a body part is changed from "text/plain" to @@ -229,6 +249,35 @@ ;;; The functions. +(defun mm-keep-viewer-alive-p (handle) + "Say whether external viewer for HANDLE should stay alive." + (let ((types mm-keep-viewer-alive-types) + (type (mm-handle-media-type handle)) + ty) + (catch 'found + (while (setq ty (pop types)) + (when (string-match ty type) + (throw 'found t)))))) + +(defun mm-handle-set-external-undisplayer (handle function) + "Set the undisplayer for this handle; postpone undisplaying of viewers +for types in mm-keep-viewer-alive-types." + (if (mm-keep-viewer-alive-p handle) + (progn + (setq new-handle (copy-sequence handle)) + (mm-handle-set-undisplayer new-handle function) + (mm-handle-set-undisplayer handle nil) + (push new-handle mm-postponed-undisplay-list) + ) + (mm-handle-set-undisplayer handle function) + ) +) + +(defun mm-destroy-postponed-undisplay-list () + (message "Destroying external MIME viewers") + (mm-destroy-parts mm-postponed-undisplay-list) +) + (defun mm-dissect-buffer (&optional no-strict-mime) "Dissect the current buffer and return a list of MIME handles." (save-excursion @@ -432,7 +481,7 @@ shell-command-switch (mm-mailcap-command method file (mm-handle-type handle))) - (mm-handle-set-undisplayer handle (cons file buffer))) + (mm-handle-set-external-undisplayer handle (cons file buffer))) (message "Displaying %s..." (format method file)) 'external) (copiousoutput @@ -468,7 +517,7 @@ shell-command-switch (mm-mailcap-command method file (mm-handle-type handle))) - (mm-handle-set-undisplayer handle (cons file buffer))) + (mm-handle-set-external-undisplayer handle (cons file buffer))) (message "Displaying %s..." (format method file)) 'external)))))))