comparison lisp/doc-view.el @ 101909:b62aecf6b1db

(doc-view-scroll-up-or-next-page) (doc-view-scroll-down-or-previous-page, doc-view-goto-page): Reset the old hscroll value after switching pages.
author Tassilo Horn <tassilo@member.fsf.org>
date Mon, 09 Feb 2009 15:33:47 +0000
parents 0974e3e4aca7
children 07bc423d78f1
comparison
equal deleted inserted replaced
101908:2f90d8471cb7 101909:b62aecf6b1db
344 (defmacro doc-view-current-slice () `(image-mode-window-get 'slice)) 344 (defmacro doc-view-current-slice () `(image-mode-window-get 'slice))
345 345
346 (defun doc-view-goto-page (page) 346 (defun doc-view-goto-page (page)
347 "View the page given by PAGE." 347 "View the page given by PAGE."
348 (interactive "nPage: ") 348 (interactive "nPage: ")
349 (let ((len (length doc-view-current-files))) 349 (let ((len (length doc-view-current-files))
350 (hscroll (window-hscroll)))
350 (if (< page 1) 351 (if (< page 1)
351 (setq page 1) 352 (setq page 1)
352 (when (and (> page len) 353 (when (and (> page len)
353 ;; As long as the converter is running, we don't know 354 ;; As long as the converter is running, we don't know
354 ;; how many pages will be available. 355 ;; how many pages will be available.
377 ;; that's not right if the pages are not generated sequentially 378 ;; that's not right if the pages are not generated sequentially
378 ;; or if the page isn't in doc-view-current-files yet. 379 ;; or if the page isn't in doc-view-current-files yet.
379 (let ((file (expand-file-name (format "page-%d.png" page) 380 (let ((file (expand-file-name (format "page-%d.png" page)
380 (doc-view-current-cache-dir)))) 381 (doc-view-current-cache-dir))))
381 (doc-view-insert-image file :pointer 'arrow) 382 (doc-view-insert-image file :pointer 'arrow)
383 (set-window-hscroll (selected-window) hscroll)
382 (when (and (not (file-exists-p file)) 384 (when (and (not (file-exists-p file))
383 doc-view-current-converter-processes) 385 doc-view-current-converter-processes)
384 ;; The PNG file hasn't been generated yet. 386 ;; The PNG file hasn't been generated yet.
385 (doc-view-pdf->png-1 doc-view-buffer-file-name file page 387 (doc-view-pdf->png-1 doc-view-buffer-file-name file page
386 (lexical-let ((page page) 388 (lexical-let ((page page)
416 (doc-view-goto-page (length doc-view-current-files))) 418 (doc-view-goto-page (length doc-view-current-files)))
417 419
418 (defun doc-view-scroll-up-or-next-page () 420 (defun doc-view-scroll-up-or-next-page ()
419 "Scroll page up if possible, else goto next page." 421 "Scroll page up if possible, else goto next page."
420 (interactive) 422 (interactive)
421 (when (= (window-vscroll) (image-scroll-up nil)) 423 (let ((hscroll (window-hscroll))
422 (let ((cur-page (doc-view-current-page))) 424 (cur-page (doc-view-current-page)))
425 (when (= (window-vscroll) (image-scroll-up nil))
423 (doc-view-next-page) 426 (doc-view-next-page)
424 (when (/= cur-page (doc-view-current-page)) 427 (when (/= cur-page (doc-view-current-page))
425 (image-bob) 428 (image-bob)
426 (image-bol 1))))) 429 (image-bol 1))
430 (set-window-hscroll (selected-window) hscroll))))
427 431
428 (defun doc-view-scroll-down-or-previous-page () 432 (defun doc-view-scroll-down-or-previous-page ()
429 "Scroll page down if possible, else goto previous page." 433 "Scroll page down if possible, else goto previous page."
430 (interactive) 434 (interactive)
431 (when (= (window-vscroll) (image-scroll-down nil)) 435 (let ((hscroll (window-hscroll))
432 (let ((cur-page (doc-view-current-page))) 436 (cur-page (doc-view-current-page)))
437 (when (= (window-vscroll) (image-scroll-down nil))
433 (doc-view-previous-page) 438 (doc-view-previous-page)
434 (when (/= cur-page (doc-view-current-page)) 439 (when (/= cur-page (doc-view-current-page))
435 (image-eob) 440 (image-eob)
436 (image-bol 1))))) 441 (image-bol 1))
442 (set-window-hscroll (selected-window) hscroll))))
437 443
438 ;;;; Utility Functions 444 ;;;; Utility Functions
439 445
440 (defun doc-view-kill-proc () 446 (defun doc-view-kill-proc ()
441 "Kill the current converter process(es)." 447 "Kill the current converter process(es)."
1102 (let* ((prev-major-mode (if (eq major-mode 'doc-view-mode) 1108 (let* ((prev-major-mode (if (eq major-mode 'doc-view-mode)
1103 doc-view-previous-major-mode 1109 doc-view-previous-major-mode
1104 major-mode))) 1110 major-mode)))
1105 (kill-all-local-variables) 1111 (kill-all-local-variables)
1106 (set (make-local-variable 'doc-view-previous-major-mode) prev-major-mode)) 1112 (set (make-local-variable 'doc-view-previous-major-mode) prev-major-mode))
1107 1113
1108 ;; Figure out the document type. 1114 ;; Figure out the document type.
1109 (let ((name-types 1115 (let ((name-types
1110 (when buffer-file-name 1116 (when buffer-file-name
1111 (cdr (assoc (file-name-extension buffer-file-name) 1117 (cdr (assoc (file-name-extension buffer-file-name)
1112 '(("dvi" dvi) 1118 '(("dvi" dvi)
1126 (when (and name-types content-types) 1132 (when (and name-types content-types)
1127 (error "Conflicting types: name says %s but content says %s" 1133 (error "Conflicting types: name says %s but content says %s"
1128 name-types content-types)) 1134 name-types content-types))
1129 name-types content-types 1135 name-types content-types
1130 (error "Cannot determine the document type"))))) 1136 (error "Cannot determine the document type")))))
1131 1137
1132 (doc-view-make-safe-dir doc-view-cache-directory) 1138 (doc-view-make-safe-dir doc-view-cache-directory)
1133 ;; Handle compressed files, remote files, files inside archives 1139 ;; Handle compressed files, remote files, files inside archives
1134 (set (make-local-variable 'doc-view-buffer-file-name) 1140 (set (make-local-variable 'doc-view-buffer-file-name)
1135 (cond 1141 (cond
1136 (jka-compr-really-do-compress 1142 (jka-compr-really-do-compress
1148 (file-name-nondirectory buffer-file-name) 1154 (file-name-nondirectory buffer-file-name)
1149 doc-view-cache-directory)) 1155 doc-view-cache-directory))
1150 (t buffer-file-name))) 1156 (t buffer-file-name)))
1151 (when (not (string= doc-view-buffer-file-name buffer-file-name)) 1157 (when (not (string= doc-view-buffer-file-name buffer-file-name))
1152 (write-region nil nil doc-view-buffer-file-name)) 1158 (write-region nil nil doc-view-buffer-file-name))
1153 1159
1154 (add-hook 'change-major-mode-hook 1160 (add-hook 'change-major-mode-hook
1155 (lambda () 1161 (lambda ()
1156 (doc-view-kill-proc) 1162 (doc-view-kill-proc)
1157 (remove-overlays (point-min) (point-max) 'doc-view t)) 1163 (remove-overlays (point-min) (point-max) 'doc-view t))
1158 nil t) 1164 nil t)
1159 (add-hook 'clone-indirect-buffer-hook 'doc-view-clone-buffer-hook nil t) 1165 (add-hook 'clone-indirect-buffer-hook 'doc-view-clone-buffer-hook nil t)
1160 (add-hook 'kill-buffer-hook 'doc-view-kill-proc nil t) 1166 (add-hook 'kill-buffer-hook 'doc-view-kill-proc nil t)
1161 1167
1162 (remove-overlays (point-min) (point-max) 'doc-view t) ;Just in case. 1168 (remove-overlays (point-min) (point-max) 'doc-view t) ;Just in case.
1163 ;; Keep track of display info ([vh]scroll, page number, overlay, 1169 ;; Keep track of display info ([vh]scroll, page number, overlay,
1164 ;; ...) for each window in which this document is shown. 1170 ;; ...) for each window in which this document is shown.
1165 (add-hook 'image-mode-new-window-functions 1171 (add-hook 'image-mode-new-window-functions
1166 'doc-view-new-window-function nil t) 1172 'doc-view-new-window-function nil t)
1167 (image-mode-setup-winprops) 1173 (image-mode-setup-winprops)
1168 1174
1169 (set (make-local-variable 'mode-line-position) 1175 (set (make-local-variable 'mode-line-position)
1170 '(" P" (:eval (number-to-string (doc-view-current-page))) 1176 '(" P" (:eval (number-to-string (doc-view-current-page)))
1171 "/" (:eval (number-to-string (length doc-view-current-files))))) 1177 "/" (:eval (number-to-string (length doc-view-current-files)))))
1172 ;; Don't scroll unless the user specifically asked for it. 1178 ;; Don't scroll unless the user specifically asked for it.
1173 (set (make-local-variable 'auto-hscroll-mode) nil) 1179 (set (make-local-variable 'auto-hscroll-mode) nil)