diff options
| author | Rahguzar <aikrahguzar@zohomail.eu> | 2023-01-22 22:32:05 +0100 |
|---|---|---|
| committer | Vedang Manerikar <ved.manerikar@gmail.com> | 2025-12-29 10:32:55 +0530 |
| commit | 56645d7fdd9c5908645e385854766eac774d16f3 (patch) | |
| tree | ff91641d9a659ac4a9018e3cf486850ffd07eb4c /lisp | |
| parent | d89686e4e0b35d8a0deff5d8709b81edd5cd5630 (diff) | |
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
Diffstat (limited to 'lisp')
| -rw-r--r-- | lisp/pdf-view.el | 100 |
1 files changed, 57 insertions, 43 deletions
diff --git a/lisp/pdf-view.el b/lisp/pdf-view.el index dc2e0be..93cbe80 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. |
