;;; Code:
-(eval-when-compile (require 'cl-lib))
+(require 'cl-lib)
(require 'dired)
(require 'image-mode)
(require 'jka-compr)
(define-key map (kbd "RET") 'image-next-line)
;; Zoom in/out.
(define-key map "+" 'doc-view-enlarge)
+ (define-key map "=" 'doc-view-enlarge)
(define-key map "-" 'doc-view-shrink)
+ (define-key map "0" 'doc-view-scale-reset)
+ (define-key map [remap text-scale-adjust] 'doc-view-scale-adjust)
;; Fit the image to the window
(define-key map "W" 'doc-view-fit-width-to-window)
(define-key map "H" 'doc-view-fit-height-to-window)
;; how many pages will be available.
(null doc-view--current-converter-processes))
(setq page len)))
+ (force-mode-line-update) ;To update `current-page'.
(setf (doc-view-current-page) page
(doc-view-current-info)
(concat
(md5 (current-buffer)))))
doc-view-cache-directory)))))
-(defun doc-view-remove-if (predicate list)
- "Return LIST with all items removed that satisfy PREDICATE."
- (let (new-list)
- (dolist (item list)
- (when (not (funcall predicate item))
- (setq new-list (cons item new-list))))
- (nreverse new-list)))
-
;;;###autoload
(defun doc-view-mode-p (type)
"Return non-nil if document type TYPE is available for `doc-view'.
(interactive (list doc-view-shrink-factor))
(doc-view-enlarge (/ 1.0 factor)))
+(defun doc-view-scale-reset ()
+ "Reset the document size/zoom level to the initial one."
+ (interactive)
+ (if (and doc-view-scale-internally
+ (eq (plist-get (cdr (doc-view-current-image)) :type)
+ 'imagemagick))
+ (progn
+ (kill-local-variable 'doc-view-image-width)
+ (doc-view-insert-image
+ (plist-get (cdr (doc-view-current-image)) :file)
+ :width doc-view-image-width))
+ (kill-local-variable 'doc-view-resolution)
+ (doc-view-reconvert-doc)))
+
+(defun doc-view-scale-adjust (factor)
+ "Adjust the scale of the DocView page images by FACTOR.
+FACTOR defaults to `doc-view-shrink-factor'.
+
+The actual adjustment made depends on the final component of the
+key-binding used to invoke the command, with all modifiers removed:
+
+ +, = Increase the image scale by FACTOR
+ - Decrease the image scale by FACTOR
+ 0 Reset the image scale to the initial scale"
+ (interactive (list doc-view-shrink-factor))
+ (let ((ev last-command-event)
+ (echo-keystrokes nil))
+ (pcase (event-basic-type ev)
+ ((or ?+ ?=) (doc-view-enlarge factor))
+ (?- (doc-view-shrink factor))
+ (?0 (doc-view-scale-reset)))))
+
(defun doc-view-fit-width-to-window ()
"Fit the image width to the window width."
(interactive)
(car (image-size image 'pixels)))
img-width)
img-width))
- (window-width (window-width (selected-window))))
+ (window-width (window-width)))
(setf (doc-view-current-image) image)
(move-overlay ol (point-min) (point-max))
;; In case the window is wider than the image, center the image
(defun doc-view-search-next-match (arg)
"Go to the ARGth next matching page."
(interactive "p")
- (let* ((next-pages (doc-view-remove-if
+ (let* ((next-pages (cl-remove-if
(lambda (i) (<= (car i) (doc-view-current-page)))
doc-view--current-search-matches))
(page (car (nth (1- arg) next-pages))))
(defun doc-view-search-previous-match (arg)
"Go to the ARGth previous matching page."
(interactive "p")
- (let* ((prev-pages (doc-view-remove-if
+ (let* ((prev-pages (cl-remove-if
(lambda (i) (>= (car i) (doc-view-current-page)))
doc-view--current-search-matches))
(page (car (nth (1- arg) (nreverse prev-pages)))))
"/" (:eval (number-to-string (doc-view-last-page-number)))))
;; Don't scroll unless the user specifically asked for it.
(setq-local auto-hscroll-mode nil)
- (setq-local mwheel-scroll-up-function #'doc-view-scroll-up-or-next-page)
- (setq-local mwheel-scroll-down-function
- #'doc-view-scroll-down-or-previous-page)
+ (if (boundp 'mwheel-scroll-up-function) ; not --without-x build
+ (setq-local mwheel-scroll-up-function
+ #'doc-view-scroll-up-or-next-page))
+ (if (boundp 'mwheel-scroll-down-function)
+ (setq-local mwheel-scroll-down-function
+ #'doc-view-scroll-down-or-previous-page))
(setq-local cursor-type nil)
(use-local-map doc-view-mode-map)
(add-hook 'after-revert-hook 'doc-view-reconvert-doc nil t)