aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Monnier2012-09-26 23:16:35 -0400
committerStefan Monnier2012-09-26 23:16:35 -0400
commit83600dc899a15699298809ef7b8adb4cd28df8a3 (patch)
treecc1d83a8381afebf203523a30db567dc0468651a
parenta2e770db7f66fad562ba6cad5d21e6dcf6006973 (diff)
downloademacs-83600dc899a15699298809ef7b8adb4cd28df8a3.tar.gz
emacs-83600dc899a15699298809ef7b8adb4cd28df8a3.zip
* lisp/image-mode.el: Use lexical-binding.
(image-mode-winprops): Use t to stand for the window of a buffer that's not displayed. * lisp/doc-view.el (doc-view-new-window-function): Handle t in winprops. (doc-view-enlarge): Make it a real nop if the size is not changed. (doc-view-display): Handle the case where the buffer is not (yet?) displayed in any window. (doc-view-saved-settings): New var. (doc-view-mode): Use it. (doc-view-fallback-mode): Set it.
-rw-r--r--lisp/ChangeLog12
-rw-r--r--lisp/doc-view.el102
-rw-r--r--lisp/image-mode.el18
3 files changed, 87 insertions, 45 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index a000f3240a3..d99ef22ac8e 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,5 +1,17 @@
12012-09-27 Stefan Monnier <monnier@iro.umontreal.ca> 12012-09-27 Stefan Monnier <monnier@iro.umontreal.ca>
2 2
3 * image-mode.el: Use lexical-binding.
4 (image-mode-winprops): Use t to stand for the window of
5 a buffer that's not displayed.
6 * doc-view.el (doc-view-new-window-function): Handle the new
7 t in winprops.
8 (doc-view-enlarge): Make it a real nop if the size is not changed.
9 (doc-view-display): Handle the case where the buffer is not (yet?)
10 displayed in any window.
11 (doc-view-saved-settings): New var.
12 (doc-view-mode): Use it.
13 (doc-view-fallback-mode): Set it.
14
3 * minibuf-eldef.el: Make it possible to replace (default ...) with [...]. 15 * minibuf-eldef.el: Make it possible to replace (default ...) with [...].
4 Set lexical-binding. 16 Set lexical-binding.
5 (minibuffer-eldef-shorten-default): New var. 17 (minibuffer-eldef-shorten-default): New var.
diff --git a/lisp/doc-view.el b/lisp/doc-view.el
index 158d447a1d4..37f58331a5d 100644
--- a/lisp/doc-view.el
+++ b/lisp/doc-view.el
@@ -255,20 +255,23 @@ of the page moves to the previous page."
255;;;; Internal Variables 255;;;; Internal Variables
256 256
257(defun doc-view-new-window-function (winprops) 257(defun doc-view-new-window-function (winprops)
258 ;; (message "New window %s for buf %s" (car winprops) (current-buffer))
259 (cl-assert (or (eq t (car winprops))
260 (eq (window-buffer (car winprops)) (current-buffer))))
258 (let ((ol (image-mode-window-get 'overlay winprops))) 261 (let ((ol (image-mode-window-get 'overlay winprops)))
259 (when (and ol (not (overlay-buffer ol)))
260 ;; I've seen `ol' be a dead overlay. I do not yet know how this
261 ;; happened, so maybe the bug is elsewhere, but in the mean time,
262 ;; this seems like a safe approach.
263 (setq ol nil))
264 (if ol 262 (if ol
265 (progn 263 (progn
266 (cl-assert (eq (overlay-buffer ol) (current-buffer))) 264 (setq ol (copy-overlay ol))
267 (setq ol (copy-overlay ol))) 265 ;; `ol' might actually be dead.
268 (cl-assert (not (get-char-property (point-min) 'display))) 266 (move-overlay ol (point-min) (point-max)))
269 (setq ol (make-overlay (point-min) (point-max) nil t)) 267 (setq ol (make-overlay (point-min) (point-max) nil t))
270 (overlay-put ol 'doc-view t)) 268 (overlay-put ol 'doc-view t))
271 (overlay-put ol 'window (car winprops)) 269 (overlay-put ol 'window (car winprops))
270 (unless (windowp (car winprops))
271 ;; It's a pseudo entry. Let's make sure it's not displayed (the
272 ;; `window' property is only effective if its value is a window).
273 (cl-assert (eq t (car winprops)))
274 (delete-overlay ol))
272 (image-mode-window-put 'overlay ol winprops))) 275 (image-mode-window-put 'overlay ol winprops)))
273 276
274(defvar doc-view-current-files nil 277(defvar doc-view-current-files nil
@@ -560,7 +563,8 @@ at the top edge of the page moves to the previous page."
560 "Kill the current converter process(es)." 563 "Kill the current converter process(es)."
561 (interactive) 564 (interactive)
562 (while (consp doc-view-current-converter-processes) 565 (while (consp doc-view-current-converter-processes)
563 (ignore-errors ;; Maybe it's dead already? 566 (ignore-errors ;; Some entries might not be processes, and maybe
567 ;; some are dead already?
564 (kill-process (pop doc-view-current-converter-processes)))) 568 (kill-process (pop doc-view-current-converter-processes))))
565 (when doc-view-current-timer 569 (when doc-view-current-timer
566 (cancel-timer doc-view-current-timer) 570 (cancel-timer doc-view-current-timer)
@@ -663,19 +667,21 @@ OpenDocument format)."
663(defvar doc-view-shrink-factor 1.125) 667(defvar doc-view-shrink-factor 1.125)
664 668
665(defun doc-view-enlarge (factor) 669(defun doc-view-enlarge (factor)
666 "Enlarge the document." 670 "Enlarge the document by FACTOR."
667 (interactive (list doc-view-shrink-factor)) 671 (interactive (list doc-view-shrink-factor))
668 (if (eq (plist-get (cdr (doc-view-current-image)) :type) 672 (if (eq (plist-get (cdr (doc-view-current-image)) :type)
669 'imagemagick) 673 'imagemagick)
670 ;; ImageMagick supports on-the-fly-rescaling 674 ;; ImageMagick supports on-the-fly-rescaling.
671 (progn 675 (let ((new (ceiling (* factor doc-view-image-width))))
672 (set (make-local-variable 'doc-view-image-width) 676 (unless (equal new doc-view-image-width)
673 (ceiling (* factor doc-view-image-width))) 677 (set (make-local-variable 'doc-view-image-width) new)
674 (doc-view-insert-image (plist-get (cdr (doc-view-current-image)) :file) 678 (doc-view-insert-image
675 :width doc-view-image-width)) 679 (plist-get (cdr (doc-view-current-image)) :file)
676 (set (make-local-variable 'doc-view-resolution) 680 :width doc-view-image-width)))
677 (ceiling (* factor doc-view-resolution))) 681 (let ((new (ceiling (* factor doc-view-resolution))))
678 (doc-view-reconvert-doc))) 682 (unless (equal new doc-view-resolution)
683 (set (make-local-variable 'doc-view-resolution) new)
684 (doc-view-reconvert-doc)))))
679 685
680(defun doc-view-shrink (factor) 686(defun doc-view-shrink (factor)
681 "Shrink the document." 687 "Shrink the document."
@@ -743,12 +749,14 @@ min {(window-width / image-width), (window-height / image-height)} times."
743 (img-height (cdr (image-display-size 749 (img-height (cdr (image-display-size
744 (image-get-display-property) t)))) 750 (image-get-display-property) t))))
745 (doc-view-enlarge (min (/ (float win-width) (float img-width)) 751 (doc-view-enlarge (min (/ (float win-width) (float img-width))
746 (/ (float (- win-height 1)) (float img-height))))) 752 (/ (float (- win-height 1))
753 (float img-height)))))
747 ;; If slice is set 754 ;; If slice is set
748 (let* ((slice-width (nth 2 slice)) 755 (let* ((slice-width (nth 2 slice))
749 (slice-height (nth 3 slice)) 756 (slice-height (nth 3 slice))
750 (scale-factor (min (/ (float win-width) (float slice-width)) 757 (scale-factor (min (/ (float win-width) (float slice-width))
751 (/ (float (- win-height 1)) (float slice-height)))) 758 (/ (float (- win-height 1))
759 (float slice-height))))
752 (new-slice (mapcar (lambda (x) (ceiling (* scale-factor x))) slice))) 760 (new-slice (mapcar (lambda (x) (ceiling (* scale-factor x))) slice)))
753 (doc-view-enlarge scale-factor) 761 (doc-view-enlarge scale-factor)
754 (setf (doc-view-current-slice) new-slice) 762 (setf (doc-view-current-slice) new-slice)
@@ -762,6 +770,7 @@ Should be invoked when the cached images aren't up-to-date."
762 ;; Clear the old cached files 770 ;; Clear the old cached files
763 (when (file-exists-p (doc-view-current-cache-dir)) 771 (when (file-exists-p (doc-view-current-cache-dir))
764 (delete-directory (doc-view-current-cache-dir) 'recursive)) 772 (delete-directory (doc-view-current-cache-dir) 'recursive))
773 (kill-local-variable 'doc-view-last-page-number)
765 (doc-view-initiate-display)) 774 (doc-view-initiate-display))
766 775
767(defun doc-view-sentinel (proc event) 776(defun doc-view-sentinel (proc event)
@@ -1169,24 +1178,23 @@ Predicate for sorting `doc-view-current-files'."
1169If FORCE is non-nil, start viewing even if the document does not 1178If FORCE is non-nil, start viewing even if the document does not
1170have the page we want to view." 1179have the page we want to view."
1171 (with-current-buffer buffer 1180 (with-current-buffer buffer
1172 (let ((prev-pages doc-view-current-files) 1181 (let ((prev-pages doc-view-current-files))
1173 (windows (get-buffer-window-list buffer nil t)))
1174 (setq doc-view-current-files 1182 (setq doc-view-current-files
1175 (sort (directory-files (doc-view-current-cache-dir) t 1183 (sort (directory-files (doc-view-current-cache-dir) t
1176 "page-[0-9]+\\.png" t) 1184 "page-[0-9]+\\.png" t)
1177 'doc-view-sort)) 1185 'doc-view-sort))
1178 (unless windows 1186 (dolist (win (or (get-buffer-window-list buffer nil t)
1179 (switch-to-buffer buffer) 1187 (list t)))
1180 (setq windows (get-buffer-window-list buffer nil t)))
1181 (dolist (win windows)
1182 (let* ((page (doc-view-current-page win)) 1188 (let* ((page (doc-view-current-page win))
1183 (pagefile (expand-file-name (format "page-%d.png" page) 1189 (pagefile (expand-file-name (format "page-%d.png" page)
1184 (doc-view-current-cache-dir)))) 1190 (doc-view-current-cache-dir))))
1185 (when (or force 1191 (when (or force
1186 (and (not (member pagefile prev-pages)) 1192 (and (not (member pagefile prev-pages))
1187 (member pagefile doc-view-current-files))) 1193 (member pagefile doc-view-current-files)))
1188 (with-selected-window win 1194 (if (windowp win)
1189 (cl-assert (eq (current-buffer) buffer) t) 1195 (with-selected-window win
1196 (cl-assert (eq (current-buffer) buffer) t)
1197 (doc-view-goto-page page))
1190 (doc-view-goto-page page)))))))) 1198 (doc-view-goto-page page))))))))
1191 1199
1192(defun doc-view-buffer-message () 1200(defun doc-view-buffer-message ()
@@ -1231,6 +1239,10 @@ For now these keys are useful:
1231 1239
1232;;;;; Toggle between editing and viewing 1240;;;;; Toggle between editing and viewing
1233 1241
1242(defvar-local doc-view-saved-settings nil
1243 "Doc-view settings saved while in some other mode.")
1244(put 'doc-view-saved-settings 'permanent-local t)
1245
1234(defun doc-view-toggle-display () 1246(defun doc-view-toggle-display ()
1235 "Toggle between editing a document as text or viewing it." 1247 "Toggle between editing a document as text or viewing it."
1236 (interactive) 1248 (interactive)
@@ -1483,13 +1495,16 @@ toggle between displaying the document or editing it as text.
1483 ;; returns nil for tar members. 1495 ;; returns nil for tar members.
1484 (doc-view-fallback-mode) 1496 (doc-view-fallback-mode)
1485 1497
1486 (let* ((prev-major-mode (if (eq major-mode 'doc-view-mode) 1498 (let* ((prev-major-mode (if (derived-mode-p 'doc-view-mode)
1487 doc-view-previous-major-mode 1499 doc-view-previous-major-mode
1488 (when (not (memq major-mode 1500 (unless (eq major-mode 'fundamental-mode)
1489 '(doc-view-mode fundamental-mode)))
1490 major-mode)))) 1501 major-mode))))
1491 (kill-all-local-variables) 1502 (kill-all-local-variables)
1492 (set (make-local-variable 'doc-view-previous-major-mode) prev-major-mode)) 1503 (set (make-local-variable 'doc-view-previous-major-mode)
1504 prev-major-mode))
1505
1506 (dolist (var doc-view-saved-settings)
1507 (set (make-local-variable (car var)) (cdr var)))
1493 1508
1494 ;; Figure out the document type. 1509 ;; Figure out the document type.
1495 (unless doc-view-doc-type 1510 (unless doc-view-doc-type
@@ -1563,13 +1578,20 @@ toggle between displaying the document or editing it as text.
1563 1578
1564(defun doc-view-fallback-mode () 1579(defun doc-view-fallback-mode ()
1565 "Fallback to the previous or next best major mode." 1580 "Fallback to the previous or next best major mode."
1566 (if doc-view-previous-major-mode 1581 (let ((vars (if (derived-mode-p 'doc-view-mode)
1567 (funcall doc-view-previous-major-mode) 1582 (mapcar (lambda (var) (cons var (symbol-value var)))
1568 (let ((auto-mode-alist (rassq-delete-all 1583 '(doc-view-resolution
1569 'doc-view-mode-maybe 1584 image-mode-winprops-alist)))))
1570 (rassq-delete-all 'doc-view-mode 1585 (if doc-view-previous-major-mode
1571 (copy-alist auto-mode-alist))))) 1586 (funcall doc-view-previous-major-mode)
1572 (normal-mode)))) 1587 (let ((auto-mode-alist
1588 (rassq-delete-all
1589 'doc-view-mode-maybe
1590 (rassq-delete-all 'doc-view-mode
1591 (copy-alist auto-mode-alist)))))
1592 (normal-mode)))
1593 (when vars
1594 (setq-local doc-view-saved-settings vars))))
1573 1595
1574;;;###autoload 1596;;;###autoload
1575(defun doc-view-mode-maybe () 1597(defun doc-view-mode-maybe ()
diff --git a/lisp/image-mode.el b/lisp/image-mode.el
index fabc12c0219..4ac62fbb6fc 100644
--- a/lisp/image-mode.el
+++ b/lisp/image-mode.el
@@ -1,4 +1,4 @@
1;;; image-mode.el --- support for visiting image files 1;;; image-mode.el --- support for visiting image files -*- lexical-binding: t -*-
2;; 2;;
3;; Copyright (C) 2005-2012 Free Software Foundation, Inc. 3;; Copyright (C) 2005-2012 Free Software Foundation, Inc.
4;; 4;;
@@ -31,6 +31,11 @@
31;; resulting buffer file is saved to another name it will correctly save 31;; resulting buffer file is saved to another name it will correctly save
32;; the image data to the new file. 32;; the image data to the new file.
33 33
34;; Todo:
35
36;; Consolidate with doc-view to make them work on directories of images or on
37;; image files containing various "pages".
38
34;;; Code: 39;;; Code:
35 40
36(require 'image) 41(require 'image)
@@ -38,8 +43,7 @@
38 43
39;;; Image mode window-info management. 44;;; Image mode window-info management.
40 45
41(defvar image-mode-winprops-alist t) 46(defvar-local image-mode-winprops-alist t)
42(make-variable-buffer-local 'image-mode-winprops-alist)
43 47
44(defvar image-mode-new-window-functions nil 48(defvar image-mode-new-window-functions nil
45 "Special hook run when image data is requested in a new window. 49 "Special hook run when image data is requested in a new window.
@@ -47,9 +51,13 @@ It is called with one argument, the initial WINPROPS.")
47 51
48(defun image-mode-winprops (&optional window cleanup) 52(defun image-mode-winprops (&optional window cleanup)
49 "Return winprops of WINDOW. 53 "Return winprops of WINDOW.
50A winprops object has the shape (WINDOW . ALIST)." 54A winprops object has the shape (WINDOW . ALIST).
55WINDOW defaults to `selected-window' if it displays the current buffer, and
56otherwise it defaults to t, used for times when the buffer is not displayed."
51 (cond ((null window) 57 (cond ((null window)
52 (setq window (selected-window))) 58 (setq window
59 (if (eq (current-buffer) (window-buffer)) (selected-window) t)))
60 ((eq window t))
53 ((not (windowp window)) 61 ((not (windowp window))
54 (error "Not a window: %s" window))) 62 (error "Not a window: %s" window)))
55 (when cleanup 63 (when cleanup