all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Tassilo Horn <tsdh@gnu.org>
To: Stephen Berman <stephen.berman@gmx.net>
Cc: 12876@debbugs.gnu.org
Subject: bug#12876: 24.3.50; DocView problem with cached files
Date: Tue, 13 Nov 2012 21:28:44 +0100	[thread overview]
Message-ID: <87k3tpi6wz.fsf@thinkpad.tsdh.de> (raw)
In-Reply-To: <87ip99g3it.fsf@rosalinde.fritz.box> (Stephen Berman's message of "Tue, 13 Nov 2012 12:12:42 +0100")

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





  parent reply	other threads:[~2012-11-13 20:28 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-11-13 11:12 bug#12876: 24.3.50; DocView problem with cached files Stephen Berman
2012-11-13 13:12 ` Tassilo Horn
2012-11-13 20:28 ` Tassilo Horn [this message]
2012-11-13 21:09   ` Stephen Berman
2012-11-14 10:05     ` Tassilo Horn
2012-11-14 10:25       ` Stephen Berman
2012-11-14 10:45         ` Tassilo Horn
2012-11-15  3:47   ` Stefan Monnier
2012-11-15  7:31     ` Tassilo Horn
2012-11-15  7:57       ` Tassilo Horn
2020-09-13 16:07         ` Lars Ingebrigtsen
2020-09-13 20:05           ` Stephen Berman
2020-09-13 20:23             ` Lars Ingebrigtsen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87k3tpi6wz.fsf@thinkpad.tsdh.de \
    --to=tsdh@gnu.org \
    --cc=12876@debbugs.gnu.org \
    --cc=stephen.berman@gmx.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.