Fixed.
[elisp/epg.git] / epa.el
diff --git a/epa.el b/epa.el
index a7f598e..7e862cb 100644 (file)
--- a/epa.el
+++ b/epa.el
   :type 'boolean
   :group 'epa)
 
+(defcustom epa-popup-info-window t
+  "If non-nil, status information from epa commands is displayed on
+the separate window."
+  :type 'boolean
+  :group 'epa)
+
+(defcustom epa-info-window-height 5
+  "Number of lines used to display status information."
+  :type 'integer
+  :group 'epa)
+
 (defgroup epa-faces nil
   "Faces for epa-mode."
   :group 'epa)
          (epg-sub-key-id (car (epg-key-sub-key-list
                                (widget-get widget :value))))))
 
+(defun epa--temp-buffer-show-function (buffer)
+  (save-selected-window
+    (let ((window (or (get-buffer-window buffer)
+                     (progn
+                       (select-window (get-largest-window))
+                       (split-window-vertically)))))
+      (set-window-buffer window buffer)
+      (if window
+         (select-window window))
+      (unless (pos-visible-in-window-p (point-max))
+       (enlarge-window (- epa-info-window-height (window-height))))
+      (let ((height (window-height)))
+       (if (> height epa-info-window-height)
+           (shrink-window (- height epa-info-window-height)))
+       (set-window-start window (point-min))))))
+
+(defun epa-display-verify-result (verify-result)
+  (if epa-popup-info-window
+      (let ((temp-buffer-show-function #'epa--temp-buffer-show-function))
+       (with-output-to-temp-buffer "*Info*"
+         (save-excursion
+           (set-buffer standard-output)
+           (insert (epg-verify-result-to-string verify-result)))))
+    (message "%s" (epg-verify-result-to-string verify-result))))
+
 (defun epa-keys-mode ()
   "Major mode for `epa-list-keys'."
   (kill-all-local-variables)
                     (or (next-single-property-change point 'epa-list-keys)
                         (point-max)))
       (goto-char point))
-    (epa--yvfg-xrlf-1 context name mode)
+    (epa-insert-keys context name mode)
     (epa-keys-mode))
   (make-local-variable 'epa-list-keys-arguments)
   (setq epa-list-keys-arguments (list name mode protocol))
   (goto-char (point-min))
   (pop-to-buffer (current-buffer)))
 
-(defun epa--yvfg-xrlf-1 (context name mode)
-  (save-restriction
-    (narrow-to-region (point) (point))
-    (let ((inhibit-read-only t)
-         buffer-read-only
-         (keys (epg-list-keys context name mode))
-         point)
-      (while keys
-       (setq point (point))
-       (insert "  ")
-       (put-text-property point (point) 'epa-key (car keys))
-       (widget-create 'epa-key :value (car keys))
-       (insert "\n")
-       (setq keys (cdr keys))))      
-    (put-text-property (point-min) (point-max) 'epa-list-keys t)))
+(defun epa-insert-keys (context name mode)
+  (save-excursion
+    (save-restriction
+      (narrow-to-region (point) (point))
+      (let ((keys (epg-list-keys context name mode))
+           point)
+       (while keys
+         (setq point (point))
+         (insert "  ")
+         (add-text-properties point (point)
+                              (list 'epa-key (car keys)
+                                    'front-sticky nil
+                                    'rear-nonsticky t
+                                    'start-open t
+                                    'end-open t))
+         (widget-create 'epa-key :value (car keys))
+         (insert "\n")
+         (setq keys (cdr keys))))      
+      (add-text-properties (point-min) (point-max)
+                          (list 'epa-list-keys t
+                                'front-sticky nil
+                                'rear-nonsticky t
+                                'start-open t
+                                'end-open t)))))
 
 (defun epa-marked-keys ()
   (or (save-excursion
@@ -357,12 +402,12 @@ If SECRET is non-nil, list secret keys instead of public keys."
       (if names
          (while names
            (setq point (point))
-           (epa--yvfg-xrlf-1 context (car names) secret)
+           (epa-insert-keys context (car names) secret)
            (goto-char point)
            (epa-mark)
            (goto-char (point-max))
            (setq names (cdr names)))
-       (epa--yvfg-xrlf-1 context nil secret))
+       (epa-insert-keys context nil secret))
       (epa-keys-mode)
       (setq epa-exit-buffer-function #'abort-recursive-edit)
       (goto-char (point-min))
@@ -487,9 +532,7 @@ If ARG is non-nil, mark the current line."
     (epg-decrypt-file context file plain)
     (message "Decrypting %s...done" (file-name-nondirectory file))
     (if (epg-context-result-for context 'verify)
-       (message "%s"
-                (epg-verify-result-to-string
-                 (epg-context-result-for context 'verify))))))
+       (epa-display-verify-result (epg-context-result-for context 'verify)))))
 
 ;;;###autoload
 (defun epa-verify-file (file)
@@ -501,9 +544,8 @@ If ARG is non-nil, mark the current line."
     (message "Verifying %s..." (file-name-nondirectory file))
     (epg-verify-file context file plain)
     (message "Verifying %s...done" (file-name-nondirectory file))
-    (message "%s"
-            (epg-verify-result-to-string
-             (epg-context-result-for context 'verify)))))
+    (if (epg-context-result-for context 'verify)
+       (epa-display-verify-result (epg-context-result-for context 'verify)))))
 
 ;;;###autoload
 (defun epa-sign-file (file signers mode)
@@ -563,9 +605,7 @@ Don't use this command in Lisp programs!"
       (goto-char start)
       (insert (decode-coding-string plain coding-system-for-read))
       (if (epg-context-result-for context 'verify)
-         (message "%s"
-                  (epg-verify-result-to-string
-                   (epg-context-result-for context 'verify)))))))
+         (epa-display-verify-result (epg-context-result-for context 'verify))))))
 
 ;;;###autoload
 (defun epa-decrypt-armor-in-region (start end)
@@ -606,9 +646,8 @@ Don't use this command in Lisp programs!"
                       (encode-coding-string
                        (buffer-substring start end)
                        coding-system-for-write))
-    (message "%s"
-            (epg-verify-result-to-string
-             (epg-context-result-for context 'verify)))))
+    (if (epg-context-result-for context 'verify)
+       (epa-display-verify-result (epg-context-result-for context 'verify)))))
 
 ;;;###autoload
 (defun epa-verify-armor-in-region (start end)