diff options
| author | Stefan Monnier | 2012-09-26 23:16:35 -0400 |
|---|---|---|
| committer | Stefan Monnier | 2012-09-26 23:16:35 -0400 |
| commit | 83600dc899a15699298809ef7b8adb4cd28df8a3 (patch) | |
| tree | cc1d83a8381afebf203523a30db567dc0468651a | |
| parent | a2e770db7f66fad562ba6cad5d21e6dcf6006973 (diff) | |
| download | emacs-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/ChangeLog | 12 | ||||
| -rw-r--r-- | lisp/doc-view.el | 102 | ||||
| -rw-r--r-- | lisp/image-mode.el | 18 |
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 @@ | |||
| 1 | 2012-09-27 Stefan Monnier <monnier@iro.umontreal.ca> | 1 | 2012-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'." | |||
| 1169 | If FORCE is non-nil, start viewing even if the document does not | 1178 | If FORCE is non-nil, start viewing even if the document does not |
| 1170 | have the page we want to view." | 1179 | have 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. |
| 50 | A winprops object has the shape (WINDOW . ALIST)." | 54 | A winprops object has the shape (WINDOW . ALIST). |
| 55 | WINDOW defaults to `selected-window' if it displays the current buffer, and | ||
| 56 | otherwise 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 |