diff options
| author | Vedang Manerikar <ved.manerikar@gmail.com> | 2025-12-31 13:48:11 +0530 |
|---|---|---|
| committer | Vedang Manerikar <ved.manerikar@gmail.com> | 2025-12-31 23:01:15 +0530 |
| commit | 2603233d2b3814c75c762783327f1fd633f82549 (patch) | |
| tree | 5f6594652fa12f107e8ed29f63c115eda1b2168e /lisp/pdf-links.el | |
| parent | d54ba6423d8cdc34b79ba20c899616ad21d4a5bc (diff) | |
feat: integrate pdf-view-roll-minor-mode with existing features
Update all pdf-tools features to work correctly when
pdf-view-roll-minor-mode is active:
- pdf-isearch: Search across all displayed pages simultaneously
- pdf-links: Link selection works with multiple visible pages
- pdf-annot: Annotations work on correct page, add pdf-annot-edit
command for avy-style annotation editing
- pdf-sync: SyncTeX jumps work with continuous scroll mode
- pdf-view: Display and navigation functions updated for multi-page
- pdf-util: Coordinate transformation updates for visible pages
- pdf-cache: Simplify prefetch (remove timer indirection)
- pdf-occur: Minor compatibility updates
The mode is experimental. Some features may not interact perfectly
with roll mode. Enable with M-x pdf-view-roll-minor-mode.
API changes:
- pdf-view-active-region now includes page information
- isearch results include page data for multi-page display
Co-authored-by: Daniel Nicolai <dalanicolai@gmail.com>
Co-authored-by: Rahguzar <aikrahguzar@zohomail.eu>
Co-authored-by: Ihor Radchenko <yantar92@gmail.com>
Co-authored-by: NightMachinery <feraidoonmehri@gmail.com>
Diffstat (limited to 'lisp/pdf-links.el')
| -rw-r--r-- | lisp/pdf-links.el | 96 |
1 files changed, 48 insertions, 48 deletions
diff --git a/lisp/pdf-links.el b/lisp/pdf-links.el index d54981e..3542085 100644 --- a/lisp/pdf-links.el +++ b/lisp/pdf-links.el @@ -29,6 +29,10 @@ (require 'let-alist) (require 'org) + + +(declare-function pdf-roll-page-overlay "pdf-roll") +(declare-function pdf-roll-displayed-pages "pdf-roll") ;;; Code: @@ -103,7 +107,7 @@ do something with it." ;;;###autoload (define-minor-mode pdf-links-minor-mode - "Handle links in PDF documents.\\<pdf-links-minor-mode-map> + "Handle links in PDF documents. If this mode is enabled, most links in the document may be activated by clicking on them or by pressing \\[pdf-links-action-perform] and selecting @@ -151,7 +155,7 @@ links via \\[pdf-links-isearch-link]. (nreverse hotspots))) (defun pdf-links-action-to-string (link) - "Return a string representation of ACTION." + "Return a string representation of action for LINK." (let-alist link (concat (cl-case .type @@ -208,17 +212,10 @@ scroll the current page." (with-selected-window window (when (derived-mode-p 'pdf-view-mode) (when (> .page 0) - (pdf-view-goto-page .page)) + (pdf-view-goto-page .page window)) (when .top - ;; Showing the tooltip delays displaying the page for - ;; some reason (sit-for/redisplay don't help), do it - ;; later. - (run-with-idle-timer 0.001 nil - (lambda () - (when (window-live-p window) - (with-selected-window window - (when (derived-mode-p 'pdf-view-mode) - (pdf-util-tooltip-arrow .top))))))))))) + (when (derived-mode-p 'pdf-view-mode) + (pdf-util-tooltip-arrow .top))))))) (uri (funcall pdf-links-browse-uri-function .uri)) (t @@ -231,44 +228,47 @@ scroll the current page." See `pdf-links-action-perform' for the interface." (pdf-util-assert-pdf-window) - (let* ((links (pdf-cache-pagelinks - (pdf-view-current-page))) + (let* ((win (selected-window)) + (pages (if pdf-view-roll-minor-mode + (reverse (image-mode-window-get 'displayed-pages win)) + (list (pdf-view-current-page)))) + (links (mapcar #'pdf-cache-pagelinks pages)) (keys (pdf-links-read-link-action--create-keys - (length links))) - (key-strings (mapcar (apply-partially 'apply 'string) - keys)) - (alist (cl-mapcar 'cons keys links)) - (size (pdf-view-image-size)) + (apply #'+ (mapcar #'length links)))) + (alist (cl-mapcar 'cons keys (apply #'append links))) (colors (pdf-util-face-colors - 'pdf-links-read-link pdf-view-dark-minor-mode)) - (args (list - :foreground (car colors) - :background (cdr colors) - :formats - `((?c . ,(lambda (_edges) (pop key-strings))) - (?P . ,(number-to-string - (max 1 (* (cdr size) - pdf-links-convert-pointsize-scale))))) - :commands pdf-links-read-link-convert-commands - :apply (pdf-util-scale-relative-to-pixel - (mapcar (lambda (l) (cdr (assq 'edges l))) - links))))) - (unless links - (error "No links on this page")) - (unwind-protect - (let ((image-data - (pdf-cache-get-image - (pdf-view-current-page) - (car size) (car size) 'pdf-links-read-link-action))) - (unless image-data - (setq image-data (apply 'pdf-util-convert-page args )) - (pdf-cache-put-image - (pdf-view-current-page) - (car size) image-data 'pdf-links-read-link-action)) - (pdf-view-display-image - (create-image image-data (pdf-view-image-type) t)) - (pdf-links-read-link-action--read-chars prompt alist)) - (pdf-view-redisplay)))) + 'pdf-links-read-link pdf-view-dark-minor-mode))) + (if (not links) + (error "No links on displayed pages") + (unwind-protect + (progn + (dolist (page pages) + (let* ((image (or (overlay-get (pdf-roll-page-overlay page win) 'display) + (pdf-view-current-image))) + (image (or (assoc 'image image) image)) + (height (cdr (image-size image t))) + (orig-image (create-image (plist-get (cdr image) :data) + (pdf-view-image-type) t))) + (pdf-view-display-image + (create-image (pdf-util-convert-image + orig-image + :foreground (car colors) + :background (cdr colors) + :formats + `((?c . ,(lambda (_edges) (apply #'string (pop keys)))) + (?P . ,(number-to-string + (max 1 (* height + pdf-links-convert-pointsize-scale))))) + :commands pdf-links-read-link-convert-commands + :apply (pdf-util-scale + (mapcar (lambda (l) (cdr (assq 'edges l))) + (pop links)) + (image-size orig-image t))) + (pdf-view-image-type) t + :height height) + page win))) + (pdf-links-read-link-action--read-chars prompt alist)) + (pdf-view-redisplay))))) (defun pdf-links-read-link-action--read-chars (prompt alist) (catch 'done |
