[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#12876: 24.3.50; DocView problem with cached files
From: |
Tassilo Horn |
Subject: |
bug#12876: 24.3.50; DocView problem with cached files |
Date: |
Tue, 13 Nov 2012 21:28:44 +0100 |
User-agent: |
Gnus/5.130006 (Ma Gnus v0.6) Emacs/24.3.50 (gnu/linux) |
Hi Stephen & Stefan,
the following patch fixes the issue for me, but I'm not sure if it's the
right thing to do. Stefan, could you please check?
Basically, the difference between finding a not yet converted doc and a
doc that's already cached is that in the former case
`doc-view-goto-page' runs with the selected window displaying the doc's
buffer. AFAIKS, that's a must for the image-mode winprops stuff to
work, so in the latter case, the patch defers running
`doc-view-goto-page' a bit into the future when the window showing the
doc buffer is hopefully there.
--8<---------------cut here---------------start------------->8---
=== modified file 'lisp/doc-view.el'
--- lisp/doc-view.el 2012-09-28 10:05:46 +0000
+++ lisp/doc-view.el 2012-11-13 20:25:53 +0000
@@ -419,57 +419,63 @@
(defun doc-view-goto-page (page)
"View the page given by PAGE."
(interactive "nPage: ")
- (let ((len (doc-view-last-page-number))
- (hscroll (window-hscroll)))
- (if (< page 1)
- (setq page 1)
- (when (and (> page len)
- ;; As long as the converter is running, we don't know
- ;; how many pages will be available.
- (null doc-view-current-converter-processes))
- (setq page len)))
- (setf (doc-view-current-page) page
- (doc-view-current-info)
- (concat
- (propertize
- (format "Page %d of %d." page len) 'face 'bold)
- ;; Tell user if converting isn't finished yet
- (if doc-view-current-converter-processes
- " (still converting...)\n"
- "\n")
- ;; Display context infos if this page matches the last search
- (when (and doc-view-current-search-matches
- (assq page doc-view-current-search-matches))
- (concat (propertize "Search matches:\n" 'face 'bold)
- (let ((contexts ""))
- (dolist (m (cdr (assq page
- doc-view-current-search-matches)))
- (setq contexts (concat contexts " - \"" m "\"\n")))
- contexts)))))
- ;; Update the buffer
- ;; We used to find the file name from doc-view-current-files but
- ;; that's not right if the pages are not generated sequentially
- ;; or if the page isn't in doc-view-current-files yet.
- (let ((file (expand-file-name (format "page-%d.png" page)
- (doc-view-current-cache-dir))))
- (doc-view-insert-image file :pointer 'arrow)
- (set-window-hscroll (selected-window) hscroll)
- (when (and (not (file-exists-p file))
- doc-view-current-converter-processes)
- ;; The PNG file hasn't been generated yet.
- (doc-view-pdf->png-1 doc-view-buffer-file-name file page
- (let ((win (selected-window)))
- (lambda ()
- (and (eq (current-buffer) (window-buffer win))
- ;; If we changed page in the mean
- ;; time, don't mess things up.
- (eq (doc-view-current-page win) page)
- ;; Make sure we don't infloop.
- (file-readable-p file)
- (with-selected-window win
- (doc-view-goto-page
page))))))))
- (overlay-put (doc-view-current-overlay)
- 'help-echo (doc-view-current-info))))
+ (if (null (get-buffer-window))
+ ;; The document buffer isn't displayed in any window yet. This
+ ;; happens when using cached PNG files. The buffer will be
+ ;; displayed after `doc-view-mode' has returned, so try again a
+ ;; bit later.
+ (run-with-timer 0.1 nil #'doc-view-goto-page page)
+ (let ((len (doc-view-last-page-number))
+ (hscroll (window-hscroll)))
+ (if (< page 1)
+ (setq page 1)
+ (when (and (> page len)
+ ;; As long as the converter is running, we don't know
+ ;; how many pages will be available.
+ (null doc-view-current-converter-processes))
+ (setq page len)))
+ (setf (doc-view-current-page) page
+ (doc-view-current-info)
+ (concat
+ (propertize
+ (format "Page %d of %d." page len) 'face 'bold)
+ ;; Tell user if converting isn't finished yet
+ (if doc-view-current-converter-processes
+ " (still converting...)\n"
+ "\n")
+ ;; Display context infos if this page matches the last search
+ (when (and doc-view-current-search-matches
+ (assq page doc-view-current-search-matches))
+ (concat (propertize "Search matches:\n" 'face 'bold)
+ (let ((contexts ""))
+ (dolist (m (cdr (assq page
+
doc-view-current-search-matches)))
+ (setq contexts (concat contexts " - \"" m "\"\n")))
+ contexts)))))
+ ;; Update the buffer
+ ;; We used to find the file name from doc-view-current-files but
+ ;; that's not right if the pages are not generated sequentially
+ ;; or if the page isn't in doc-view-current-files yet.
+ (let ((file (expand-file-name (format "page-%d.png" page)
+ (doc-view-current-cache-dir))))
+ (doc-view-insert-image file :pointer 'arrow)
+ (set-window-hscroll (selected-window) hscroll)
+ (when (and (not (file-exists-p file))
+ doc-view-current-converter-processes)
+ ;; The PNG file hasn't been generated yet.
+ (doc-view-pdf->png-1 doc-view-buffer-file-name file page
+ (let ((win (selected-window)))
+ (lambda ()
+ (and (eq (current-buffer) (window-buffer
win))
+ ;; If we changed page in the mean
+ ;; time, don't mess things up.
+ (eq (doc-view-current-page win) page)
+ ;; Make sure we don't infloop.
+ (file-readable-p file)
+ (with-selected-window win
+ (doc-view-goto-page page))))))))
+ (overlay-put (doc-view-current-overlay)
+ 'help-echo (doc-view-current-info)))))
(defun doc-view-next-page (&optional arg)
"Browse ARG pages forward."
--8<---------------cut here---------------end--------------->8---
Bye,
Tassilo