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.