branch: elpa/pdf-tools
commit 56645d7fdd9c5908645e385854766eac774d16f3
Author: Rahguzar <[email protected]>
Commit: Vedang Manerikar <[email protected]>

    feat: support pdf-buffer bookmarks in workspace managers
    
    Don't assume that there is a window displaying the buffer when
    `bookmark-jump` is called. Instead of `bookmark-after-jump-hook` use
    `window-buffer-change-functions` so that the buffer is actually
    displayed when the code assuming a window is run.
    
    If `window-buffer-change-functions` isn't bound fallback to
    `bookmark-after-jump-hook`. The window argument for the inserted hook
    is optional to accommodate both cases.
    
    Use `window-buffer-change-functions` only if buffer has not window.
    Save the same bookmark if it wasn't restored
    
    Closes: #188
    Author: @aikrahguzar
---
 lisp/pdf-view.el | 100 +++++++++++++++++++++++++++++++------------------------
 1 file changed, 57 insertions(+), 43 deletions(-)

diff --git a/lisp/pdf-view.el b/lisp/pdf-view.el
index dc2e0be8387..93cbe80f928 100644
--- a/lisp/pdf-view.el
+++ b/lisp/pdf-view.el
@@ -1748,57 +1748,70 @@ the selection styles."
 ;; * Bookmark + Register Integration
 ;; * ================================================================== *
 
+(defvar pdf-view--bookmark-to-restore nil
+  "Used to hold a bookmark that is still to be restored.")
 (defun pdf-view-bookmark-make-record  (&optional no-page no-slice no-size 
no-origin)
   ;; TODO: add NO-PAGE, NO-SLICE, NO-SIZE, NO-ORIGIN to the docstring.
   "Create a bookmark PDF record.
 
 The optional, boolean args exclude certain attributes."
-  (let ((displayed-p (eq (current-buffer)
-                         (window-buffer))))
-    (cons (buffer-name)
-          (append (bookmark-make-record-default nil t 1)
-                  `(,(unless no-page
-                       (cons 'page (pdf-view-current-page)))
-                    ,(unless no-slice
-                       (cons 'slice (and displayed-p
-                                         (pdf-view-current-slice))))
-                    ,(unless no-size
-                       (cons 'size pdf-view-display-size))
-                    ,(unless no-origin
-                       (cons 'origin
-                             (and displayed-p
-                                  (let ((edges (pdf-util-image-displayed-edges 
nil t)))
-                                    (pdf-util-scale-pixel-to-relative
-                                     (cons (car edges) (cadr edges)) nil t)))))
-                    (handler . pdf-view-bookmark-jump-handler))))))
+  (or pdf-view--bookmark-to-restore
+      (let ((displayed-p (eq (current-buffer)
+                             (window-buffer))))
+        (cons (buffer-name)
+              (append (bookmark-make-record-default nil t 1)
+                      `(,(unless no-page
+                           (cons 'page (pdf-view-current-page)))
+                        ,(unless no-slice
+                           (cons 'slice (and displayed-p
+                                             (pdf-view-current-slice))))
+                        ,(unless no-size
+                           (cons 'size pdf-view-display-size))
+                        ,(unless no-origin
+                           (cons 'origin
+                                 (and displayed-p
+                                      (let ((edges 
(pdf-util-image-displayed-edges nil t)))
+                                        (pdf-util-scale-pixel-to-relative
+                                         (cons (car edges) (cadr edges)) nil 
t)))))
+                        (handler . pdf-view-bookmark-jump-handler)))))))
 
 ;;;###autoload
 (defun pdf-view-bookmark-jump-handler (bmk)
   "The bookmark handler-function interface for bookmark BMK.
 
 See also `pdf-view-bookmark-make-record'."
-  (let ((page (bookmark-prop-get bmk 'page))
-        (slice (bookmark-prop-get bmk 'slice))
-        (size (bookmark-prop-get bmk 'size))
-        (origin (bookmark-prop-get bmk 'origin))
-        (file (bookmark-prop-get bmk 'filename))
-        (show-fn-sym (make-symbol "pdf-view-bookmark-after-jump-hook")))
+  (let* ((file (bookmark-prop-get bmk 'filename))
+         (buf (or (find-buffer-visiting file)
+                  (find-file-noselect file)))
+         (buf-chg-fns-p (boundp 'window-buffer-change-functions))
+         (hook (if (and buf-chg-fns-p (not (get-buffer-window buf)))
+                   'window-buffer-change-functions
+                 'bookmark-after-jump-hook))
+         (show-fn-sym (make-symbol "pdf-show-buffer-function")))
     (fset show-fn-sym
-          (lambda ()
-            (remove-hook 'bookmark-after-jump-hook show-fn-sym)
-            (unless (derived-mode-p 'pdf-view-mode)
-              (pdf-view-mode))
-            (with-selected-window
-                (or (get-buffer-window (current-buffer) 0)
-                    (selected-window))
-              (when size
-                (setq-local pdf-view-display-size size))
-              (when slice
-                (apply 'pdf-view-set-slice slice))
-              (when (numberp page)
-                (pdf-view-goto-page page))
-              (when origin
-                (let ((size (pdf-view-image-size t)))
+          (lambda (&optional win)
+            (when (eq buf (current-buffer))
+              (with-selected-window
+                  (or win
+                      (get-buffer-window buf 0)
+                      (selected-window))
+                (remove-hook hook show-fn-sym buf-chg-fns-p)
+                (unless (derived-mode-p 'pdf-view-mode)
+                  (pdf-view-mode))
+                (when-let ((size (bookmark-prop-get
+                                  pdf-view--bookmark-to-restore 'size)))
+                  (setq-local pdf-view-display-size size))
+                (when-let ((slice (bookmark-prop-get
+                                   pdf-view--bookmark-to-restore 'slice)))
+                  (apply 'pdf-view-set-slice slice))
+                (when-let ((page (bookmark-prop-get
+                                  pdf-view--bookmark-to-restore 'page))
+                           ((numberp page)))
+                  (pdf-view-goto-page page win))
+                (when-let ((origin (bookmark-prop-get
+                                    pdf-view--bookmark-to-restore 'origin))
+                           (size (pdf-view-image-size t win)))
+
                   (image-set-window-hscroll
                    (round (/ (* (car origin) (car size))
                              (frame-char-width))))
@@ -1806,10 +1819,11 @@ See also `pdf-view-bookmark-make-record'."
                    (round (/ (* (cdr origin) (cdr size))
                              (if pdf-view-have-image-mode-pixel-vscroll
                                  1
-                               (frame-char-height))))))))))
-    (add-hook 'bookmark-after-jump-hook show-fn-sym)
-    (set-buffer (or (find-buffer-visiting file)
-                    (find-file-noselect file)))))
+                               (frame-char-height))))))
+                (setq-local pdf-view--bookmark-to-restore nil)))))
+    (set-buffer buf)
+    (setq-local pdf-view--bookmark-to-restore bmk)
+    (add-hook hook show-fn-sym nil buf-chg-fns-p)))
 
 (defun pdf-view-bookmark-jump (bmk)
   "Switch to bookmark BMK.

Reply via email to