update packages and add valign

This commit is contained in:
2026-04-05 20:00:27 +02:00
parent b062fb98e3
commit 03fb00e374
640 changed files with 109768 additions and 39311 deletions

View File

@@ -32,9 +32,22 @@
(require 'jka-compr)
(require 'bookmark)
(require 'password-cache)
(require 'cl-macs)
(declare-function cua-copy-region "cua-base")
(declare-function pdf-tools-pdf-buffer-p "pdf-tools")
(declare-function pdf-roll-scroll-forward "pdf-roll")
(declare-function pdf-roll-scroll-backward "pdf-roll")
(declare-function pdf-roll-next-page "pdf-roll")
(declare-function pdf-roll-redisplay "pdf-roll")
(declare-function pdf-roll-pre-redisplay "pdf-roll")
(declare-function pdf-roll-page-overlay "pdf-roll")
(declare-function pdf-roll-page-at-current-pos "pdf-roll")
(declare-function pdf-roll-display-image "pdf-roll")
(defvar pdf-view-roll-minor-mode nil)
;; * ================================================================== *
;; * Customizations
@@ -132,6 +145,29 @@ Nevertheless, this seems to work well in most cases."
:group 'pdf-view
:type 'boolean)
(defcustom pdf-view-midnight-gamma 1.0
"In midnight mode, nonlinearly scale lightness.
Values less than 1 increase lightness, values more than 1 decrease
lightness (unless `pdf-view-midnight-gamma-before-invert' is non-nil, in
which reverses the effect direction)."
:group 'pdf-view
:type 'float)
(defcustom pdf-view-midnight-gamma-before-invert nil
"In midnight mode, whether to scale lightness before inverting.
If non-nil, this inverts the direction of the effect of
`pdf-view-midnight-gamma', i.e. values more than 1 increase lightness
instead of decreasing it. This option is provided because it results in
different behaviors near the ends of the lightness scale. For example,
if this option is nil (the default), then a gamma values less than 1
significantly lighten colors very close to black. One gets a less
extreme effect by setting this option to non-nil and using gamma values
greater than 1."
:group 'pdf-view
:type 'boolean)
(defcustom pdf-view-change-page-hook nil
"Hook run after changing to another page, but before displaying it.
@@ -212,13 +248,23 @@ Must be one of `glyph', `word', or `line'."
(const word)
(const line)))
(defcustom pdf-view-mode-line-position-prefix "P"
"Prefix for page number shown in the mode line."
:group 'pdf-view
:type 'string)
(defcustom pdf-view-mode-line-position-use-labels nil
"Whether current page should come from page labels."
:group 'pdf-view
:type 'boolean)
;; * ================================================================== *
;; * Internal variables and macros
;; * ================================================================== *
(defvar-local pdf-view-active-region nil
"The active region as a list of edges.
"The active region as a cons cell of page and list of edges.
Edge values are relative coordinates.")
@@ -271,7 +317,7 @@ regarding display of the region in the later function.")
(defvar pdf-view-mode-map
(let ((map (make-sparse-keymap)))
(set-keymap-parent map image-mode-map)
(define-key map (kbd "Q") 'kill-this-buffer)
(define-key map (kbd "Q") 'kill-current-buffer)
;; Navigation in the document
(define-key map (kbd "n") 'pdf-view-next-page-command)
(define-key map (kbd "p") 'pdf-view-previous-page-command)
@@ -280,6 +326,8 @@ regarding display of the region in the later function.")
(define-key map [remap forward-page] 'pdf-view-next-page-command)
(define-key map [remap backward-page] 'pdf-view-previous-page-command)
(define-key map (kbd "SPC") 'pdf-view-scroll-up-or-next-page)
(define-key map [remap scroll-up-command] #'pdf-view-scroll-up-or-next-page)
(define-key map [remap scroll-down-command] #'pdf-view-scroll-down-or-previous-page)
(define-key map (kbd "S-SPC") 'pdf-view-scroll-down-or-previous-page)
(define-key map (kbd "DEL") 'pdf-view-scroll-down-or-previous-page)
(define-key map (kbd "C-n") 'pdf-view-next-line-or-next-page)
@@ -308,6 +356,7 @@ regarding display of the region in the later function.")
(define-key map (kbd "s m") 'pdf-view-set-slice-using-mouse)
(define-key map (kbd "s b") 'pdf-view-set-slice-from-bounding-box)
(define-key map (kbd "s r") 'pdf-view-reset-slice)
(define-key map (kbd "s c") 'pdf-view-set-slice-common-bounding-box)
;; Rotation.
(define-key map (kbd "R") #'pdf-view-rotate)
;; Reconvert
@@ -364,6 +413,14 @@ PNG images in Emacs buffers."
(setq-local mwheel-scroll-down-function
#'pdf-view-scroll-down-or-previous-page))
(if (boundp 'mwheel-scroll-left-function)
(setq-local mwheel-scroll-left-function
#'image-scroll-left))
(if (boundp 'mwheel-scroll-right-function)
(setq-local mwheel-scroll-right-function
#'image-scroll-right))
;; Disable pixel-scroll-precision-mode locally if enabled
(if (bound-and-true-p pixel-scroll-precision-mode)
(set (make-local-variable 'pixel-scroll-precision-mode) nil))
@@ -388,7 +445,13 @@ PNG images in Emacs buffers."
;; Setup other local variables.
(setq-local mode-line-position
'(" P" (:eval (number-to-string (pdf-view-current-page)))
'(" " pdf-view-mode-line-position-prefix
;; Show page label when enabled and available,
;; otherwise show numeric page. Guard against errors.
(:eval
(or (and pdf-view-mode-line-position-use-labels
(ignore-errors (pdf-view-current-pagelabel)))
(number-to-string (pdf-view-current-page))))
;; Avoid errors during redisplay.
"/" (:eval (or (ignore-errors
(number-to-string (pdf-cache-number-of-pages)))
@@ -500,7 +563,8 @@ PNG images in Emacs buffers."
This may be different from variable `buffer-file-name' when
operating on a local copy of a remote file."
(or pdf-view--buffer-file-name
(buffer-file-name)))
(buffer-file-name)
(buffer-file-name (buffer-base-buffer))))
(defun pdf-view--write-contents-function ()
"Function for `write-contents-functions' to save the buffer."
@@ -683,7 +747,10 @@ windows."
(setf (pdf-view-current-page window) page)
(run-hooks 'pdf-view-change-page-hook))
(when (window-live-p window)
(pdf-view-redisplay window))
(image-set-window-vscroll 0)
(if pdf-view-roll-minor-mode
(pdf-roll-pre-redisplay window)
(pdf-view-redisplay window)))
(when changing-p
(pdf-view-deactivate-region)
(force-mode-line-update)
@@ -809,7 +876,7 @@ to previous page only on typing DEL (ARG is nil)."
(image-set-window-hscroll hscroll)))
(image-scroll-down arg)))
(defun pdf-view-next-line-or-next-page (&optional arg)
(defun pdf-view--next-line-or-next-page (&optional arg)
"Scroll upward by ARG lines if possible, else go to the next page.
When `pdf-view-continuous' is non-nil, scrolling a line upward
@@ -820,14 +887,20 @@ at the bottom edge of the page moves to the next page."
(cur-page (pdf-view-current-page)))
(when (= (window-vscroll nil pdf-view-have-image-mode-pixel-vscroll)
(image-next-line arg))
(pdf-view-next-page)
(ignore-errors (pdf-view-next-page))
(when (/= cur-page (pdf-view-current-page))
(image-bob)
(image-bol 1))
(image-set-window-hscroll hscroll)))
(image-next-line arg)))
(defun pdf-view-previous-line-or-previous-page (&optional arg)
(defun pdf-view-next-line-or-next-page (&optional arg)
(interactive "p")
(if pdf-view-roll-minor-mode
(dotimes (_ (or arg 1)) (pdf-roll-scroll-forward))
(pdf-view--next-line-or-next-page arg)))
(defun pdf-view--previous-line-or-previous-page (&optional arg)
"Scroll downward by ARG lines if possible, else go to the previous page.
When `pdf-view-continuous' is non-nil, scrolling a line downward
@@ -838,13 +911,19 @@ at the top edge of the page moves to the previous page."
(cur-page (pdf-view-current-page)))
(when (= (window-vscroll nil pdf-view-have-image-mode-pixel-vscroll)
(image-previous-line arg))
(pdf-view-previous-page)
(ignore-errors (pdf-view-previous-page))
(when (/= cur-page (pdf-view-current-page))
(image-eob)
(image-bol 1))
(image-set-window-hscroll hscroll)))
(image-previous-line arg)))
(defun pdf-view-previous-line-or-previous-page (&optional arg)
(interactive "p")
(if pdf-view-roll-minor-mode
(dotimes (_ (or arg 1)) (pdf-roll-scroll-backward))
(pdf-view--previous-line-or-previous-page arg)))
(defun pdf-view-goto-label (label)
"Go to the page corresponding to LABEL.
@@ -928,6 +1007,16 @@ dragging it to its bottom-right corner. See also
(cons (/ 1.0 (float (car size)))
(/ 1.0 (float (cdr size))))))))
(defun pdf-view--bounding-box-to-slice (bb)
"Convert bounding box BB to slice format for `pdf-view-set-slice'.
BB is a list (LEFT TOP RIGHT BOTTOM).
Returns a list (X Y WIDTH HEIGHT)."
(let* ((margin (max 0 (or pdf-view-bounding-box-margin 0)))
(halfmargin (/ margin 2)))
(cl-destructuring-bind (left top right bottom) bb
(list (- left halfmargin) (- top halfmargin)
(+ (- right left) margin) (+ (- bottom top) margin)))))
(defun pdf-view-set-slice-from-bounding-box (&optional window)
"Set the slice from the page's bounding-box.
@@ -940,18 +1029,38 @@ much more accurate than could be done manually using
See also `pdf-view-bounding-box-margin'."
(interactive)
(let* ((bb (pdf-cache-boundingbox (pdf-view-current-page window)))
(margin (max 0 (or pdf-view-bounding-box-margin 0)))
(slice (list (- (nth 0 bb)
(/ margin 2.0))
(- (nth 1 bb)
(/ margin 2.0))
(+ (- (nth 2 bb) (nth 0 bb))
margin)
(+ (- (nth 3 bb) (nth 1 bb))
margin))))
(slice (pdf-view--bounding-box-to-slice bb)))
(apply 'pdf-view-set-slice
(append slice (and window (list window))))))
(defun pdf-document-common-bounding-box (&optional file-or-buffer)
"Return the common bounding box for all pages in FILE-OR-BUFFER.
Returns a list (LEFT TOP RIGHT BOTTOM)."
(let ((left 1.0)
(top 1.0)
(right 0.0)
(bottom 0.0))
(dotimes (i (pdf-info-number-of-pages file-or-buffer))
(cl-destructuring-bind (b-left b-top b-right b-bottom) (pdf-info-boundingbox (1+ i) file-or-buffer)
(setq left (min left b-left)
top (min top b-top)
right (max right b-right)
bottom (max bottom b-bottom))))
(list left top right bottom)))
(defun pdf-view-set-slice-common-bounding-box (&optional window)
"Set the slice from the common bounding box of all pages.
WINDOW specifies which document to use; defaults to `selected-window'.
A margin is added from `pdf-view-bounding-box-margin'."
(interactive)
(let* ((bb (pdf-document-common-bounding-box))
(slice (pdf-view--bounding-box-to-slice bb)))
(when window
(push slice window))
(message (prin1-to-string slice))
(apply 'pdf-view-set-slice slice)))
(defun pdf-view-reset-slice (&optional window)
"Reset the current slice and redisplay WINDOW.
@@ -1038,17 +1147,23 @@ See also `pdf-view-use-imagemagick'."
:map hotspots
:pointer 'arrow)))
(defun pdf-view-image-size (&optional displayed-p window)
;; TODO: add WINDOW to docstring.
"Return the size in pixel of the current image.
(defun pdf-view-image-size (&optional displayed-p window page)
"Return the size in pixel of the current image in WINDOW.
If DISPLAYED-P is non-nil, return the size of the displayed
image. These values may be different, if slicing is used."
(if displayed-p
(with-selected-window (or window (selected-window))
(image-display-size
(image-get-display-property) t))
(image-size (pdf-view-current-image window) t)))
image. These values may be different, if slicing is used.
If PAGE is non-nil return its size instead of current page."
(let ((display-prop (if pdf-view-roll-minor-mode
(progn (setq window (if (windowp window) window (selected-window)))
(setq page (or page (pdf-view-current-page window)))
(unless (memq page (image-mode-window-get 'displayed-pages window))
(pdf-view-display-page page window))
(overlay-get (pdf-roll-page-overlay page window) 'display))
(image-get-display-property))))
(if displayed-p
(image-display-size display-prop t)
(image-size display-prop t))))
(defun pdf-view-image-offset (&optional window)
;; TODO: add WINDOW to docstring.
@@ -1068,47 +1183,49 @@ It is equal to \(LEFT . TOP\) of the current slice in pixel."
"Display page PAGE in WINDOW."
(setf (pdf-view-window-needs-redisplay window) nil)
(pdf-view-display-image
(pdf-view-create-page page window)
window))
(pdf-view-create-page page window) page window))
(defun pdf-view-display-image (image &optional window inhibit-slice-p)
(defun pdf-view-display-image (image page &optional window inhibit-slice-p)
;; TODO: write documentation!
(let ((ol (pdf-view-current-overlay window)))
(when (window-live-p (overlay-get ol 'window))
(let* ((size (image-size image t))
(slice (if (not inhibit-slice-p)
(pdf-view-current-slice window)))
(displayed-width (floor
(if slice
(* (nth 2 slice)
(car (image-size image)))
(car (image-size image))))))
(setf (pdf-view-current-image window) image)
(move-overlay ol (point-min) (point-max))
;; In case the window is wider than the image, center the image
;; horizontally.
(overlay-put ol 'before-string
(when (> (window-width window)
displayed-width)
(propertize " " 'display
`(space :align-to
,(/ (- (window-width window)
displayed-width) 2)))))
(overlay-put ol 'display
(if slice
(list (cons 'slice
(pdf-util-scale slice size 'round))
image)
image))
(let* ((win (overlay-get ol 'window))
(hscroll (image-mode-window-get 'hscroll win))
(vscroll (image-mode-window-get 'vscroll win)))
;; Reset scroll settings, in case they were changed.
(if hscroll (set-window-hscroll win hscroll))
(if vscroll (set-window-vscroll
win vscroll pdf-view-have-image-mode-pixel-vscroll)))))))
(if pdf-view-roll-minor-mode
(pdf-roll-display-image
image page (or window (selected-window)) inhibit-slice-p)
(let ((ol (pdf-view-current-overlay window)))
(when (window-live-p (overlay-get ol 'window))
(let* ((size (image-size image t))
(slice (if (not inhibit-slice-p)
(pdf-view-current-slice window)))
(displayed-width (floor
(if slice
(* (nth 2 slice)
(car (image-size image)))
(car (image-size image))))))
(setf (pdf-view-current-image window) image)
(move-overlay ol (point-min) (point-max))
;; In case the window is wider than the image, center the image
;; horizontally.
(overlay-put ol 'before-string
(when (> (window-width window)
displayed-width)
(propertize " " 'display
`(space :align-to
,(/ (- (window-width window)
displayed-width) 2)))))
(overlay-put ol 'display
(if slice
(list (cons 'slice
(pdf-util-scale slice size 'round))
image)
image))
(let* ((win (overlay-get ol 'window))
(hscroll (image-mode-window-get 'hscroll win))
(vscroll (image-mode-window-get 'vscroll win)))
;; Reset scroll settings, in case they were changed.
(if hscroll (set-window-hscroll win hscroll))
(if vscroll (set-window-vscroll
win vscroll pdf-view-have-image-mode-pixel-vscroll))))))))
(defun pdf-view-redisplay (&optional window)
(defun pdf-view--redisplay (&optional window)
"Redisplay page in WINDOW.
If WINDOW is t, redisplay pages in all windows."
@@ -1129,12 +1246,18 @@ If WINDOW is t, redisplay pages in all windows."
(setf (pdf-view-window-needs-redisplay window) t)))))
(force-mode-line-update)))
(defun pdf-view-redisplay (&optional window)
(if pdf-view-roll-minor-mode
(pdf-roll-redisplay window)
(pdf-view--redisplay window)))
(defun pdf-view-redisplay-pages (&rest pages)
"Redisplay PAGES in all windows."
(pdf-util-assert-pdf-buffer)
(dolist (window (get-buffer-window-list nil nil t))
(when (memq (pdf-view-current-page window)
pages)
(when (cl-some (lambda (page) (memq page pages))
(or (image-mode-window-get 'displayed-pages window)
(list (pdf-view-current-page window))))
(pdf-view-redisplay window))))
(defun pdf-view-maybe-redisplay-resized-windows ()
@@ -1180,7 +1303,7 @@ If WINDOW is t, redisplay pages in all windows."
;; `window' property is only effective if its value is a window).
(cl-assert (eq t (car winprops)))
(delete-overlay ol))
(image-mode-window-put 'overlay ol winprops)
(image-mode-window-put 'overlay ol)
;; Clean up some overlays.
(dolist (ov (overlays-in (point-min) (point-max)))
(when (and (windowp (overlay-get ov 'window))
@@ -1283,6 +1406,8 @@ The colors are determined by the variable
(pdf-info-setoptions
:render/foreground (or (car pdf-view-midnight-colors) "black")
:render/background (or (cdr pdf-view-midnight-colors) "white")
:render/gamma pdf-view-midnight-gamma
:render/gammabeforeinvert pdf-view-midnight-gamma-before-invert
:render/usecolors
(if pdf-view-midnight-invert
;; If midnight invert is enabled, pass "2" indicating
@@ -1323,7 +1448,7 @@ current theme's colors."
(pdf-util-assert-pdf-buffer)
(pdf-cache-clear-images)
(when get-theme
(pdf-view-set-theme-background))
(pdf-view-set-theme-background))
(pdf-view-redisplay t))
(define-minor-mode pdf-view-themed-minor-mode
@@ -1404,7 +1529,7 @@ supersede hotspots in lower ones."
(setq deactivate-mark nil))
(defun pdf-view-active-region (&optional deactivate-p)
"Return the active region, a list of edges.
"Return the active region, as a cons cell of page number and list of edges.
Deactivate the region if DEACTIVATE-P is non-nil."
(pdf-view-assert-active-region)
@@ -1454,9 +1579,14 @@ Stores the region in `pdf-view-active-region'."
(setq begin-inside-image-p nil)
(posn-x-y pos)))
(abs-begin (posn-x-y pos))
(page (if pdf-view-roll-minor-mode
(/ (+ 3 (posn-point pos)) 4)
(pdf-view-current-page)))
(margin (frame-char-height))
(selection-style (or selection-style pdf-view-selection-style))
pdf-view-continuous
region)
(setq pdf-view-active-region (list page))
(when (pdf-util-track-mouse-dragging (event 0.05)
(let* ((pos (event-start event))
(end (posn-object-x-y pos))
@@ -1496,23 +1626,33 @@ Stores the region in `pdf-view-active-region'."
(+ (car begin) (car dxy))))
(max 0 (min (cdr size)
(+ (cdr begin) (cdr dxy)))))))))
(let ((iregion (if rectangle-p
(list (min (car begin) (car end))
(min (cdr begin) (cdr end))
(max (car begin) (car end))
(max (cdr begin) (cdr end)))
(list (car begin) (cdr begin)
(car end) (cdr end)))))
(let* ((iregion (if rectangle-p
(list (min (car begin) (car end))
(min (cdr begin) (cdr end))
(max (car begin) (car end))
(max (cdr begin) (cdr end)))
(list (car begin) (cdr begin)
(car end) (cdr end))))
(y (cdr (posn-x-y pos)))
(dy (- y (cdr abs-begin))))
(setq region
(pdf-util-scale-pixel-to-relative iregion))
(pdf-view-display-region
(cons region pdf-view-active-region)
(cons page (cons region (cdr pdf-view-active-region)))
rectangle-p
selection-style)
(pdf-util-scroll-to-edges iregion)))))
(setq pdf-view-active-region
(append pdf-view-active-region
(list region)))
(if pdf-view-roll-minor-mode
(cond
((and (> dy 0) (< (- (window-text-height window t) y) margin))
(pdf-roll-scroll-forward
(min margin
(or (nth 3 (pos-visible-in-window-p (posn-point pos) window t)) 0))))
((and (< dy 0) (< (- y (window-header-line-height window)) margin))
(pdf-roll-scroll-backward
(min margin
(or (nth 2 (pos-visible-in-window-p (posn-point pos) window t)) 0)))))
(pdf-util-scroll-to-edges iregion))))))
(cl-callf append (cdr pdf-view-active-region) (list region))
(pdf-view--push-mark))))
(defun pdf-view-mouse-extend-region (event)
@@ -1539,18 +1679,19 @@ This is more useful for commands like
(let ((colors (pdf-util-face-colors
(if rectangle-p 'pdf-view-rectangle 'pdf-view-region)
(bound-and-true-p pdf-view-dark-minor-mode)))
(page (pdf-view-current-page))
(page (car region))
(width (car (pdf-view-image-size))))
(pdf-view-display-image
(pdf-view-create-image
(if rectangle-p
(pdf-info-renderpage-highlight
page width nil
`(,(car colors) ,(cdr colors) 0.35 ,@region))
`(,(car colors) ,(cdr colors) 0.35 ,@(cdr region)))
(pdf-info-renderpage-text-regions
page width nil selection-style nil
`(,(car colors) ,(cdr colors) ,@region)))
:width width))))
`(,(car colors) ,(cdr colors) ,@(cdr region))))
:width width)
(when pdf-view-roll-minor-mode page))))
(defun pdf-view-kill-ring-save ()
"Copy the region to the `kill-ring'."
@@ -1565,7 +1706,7 @@ This is more useful for commands like
(interactive)
(pdf-view-deactivate-region)
(setq pdf-view-active-region
(list (list 0 0 1 1)))
(cons (pdf-view-current-page) (list (list 0 0 1 1))))
(pdf-view--push-mark)
(pdf-view-display-region))
@@ -1575,10 +1716,10 @@ This is more useful for commands like
(mapcar
(lambda (edges)
(pdf-info-gettext
(pdf-view-current-page)
(car pdf-view-active-region)
edges
pdf-view-selection-style))
pdf-view-active-region))
(cdr pdf-view-active-region)))
(defun pdf-view-extract-region-image (regions &optional page size
output-buffer no-display-p)
@@ -1600,11 +1741,11 @@ the `convert' program is used."
(interactive
(list (if (pdf-view-active-region-p)
(pdf-view-active-region t)
'((0 0 1 1)))))
'(,(pdf-view-current-page) (0 0 1 1)))))
(unless page
(setq page (pdf-view-current-page)))
(setq page (car regions)))
(unless size
(setq size (pdf-view-image-size)))
(setq size (pdf-view-image-size nil nil page)))
(unless output-buffer
(setq output-buffer (get-buffer-create "*PDF image*")))
(let* ((images (mapcar (lambda (edges)
@@ -1616,7 +1757,7 @@ the `convert' program is used."
:crop-to edges)
nil file nil 'no-message)
file))
regions))
(cdr regions)))
result)
(unwind-protect
(progn
@@ -1667,57 +1808,71 @@ 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 ((win (car (cl-find-if #'window-live-p image-mode-winprops-alist
:key #'car-safe))))
(cons (buffer-name)
(append (bookmark-make-record-default
nil t (if pdf-view-roll-minor-mode (point) 1))
`(,(unless no-page
(cons 'page (pdf-view-current-page win)))
,(unless no-slice
(cons 'slice (and win (pdf-view-current-slice win))))
,(unless no-size
(cons 'size pdf-view-display-size))
,(unless no-origin
(cons 'origin
(and win
(let* ((edges (pdf-util-image-displayed-edges
win (eq (window-buffer win) (current-buffer)))))
(pdf-util-scale-pixel-to-relative
(cons (car edges) (cadr edges)) nil
(eq (current-buffer) (window-buffer)) win)))))
(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))))
@@ -1725,10 +1880,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.
@@ -1746,21 +1902,22 @@ works only with bookmarks created by
(pdf-view-bookmark-jump-handler bmk)
(run-hooks 'bookmark-after-jump-hook))))
(defun pdf-view-registerv-make ()
"Create a PDF register entry of the current position."
(registerv-make
(pdf-view-bookmark-make-record nil t t)
:print-func 'pdf-view-registerv-print-func
:jump-func 'pdf-view-bookmark-jump
:insert-func (lambda (bmk)
(insert (format "%S" bmk)))))
;; Register support using cl-defstruct (replaces obsolete registerv-make)
(cl-defstruct (pdf-view-register
(:constructor nil)
(:constructor pdf-view-register--make (bookmark))
(:copier nil))
"A PDF position register entry."
bookmark)
(defun pdf-view-registerv-print-func (bmk)
"Print a textual representation of bookmark BMK.
(cl-defmethod register-val-jump-to ((val pdf-view-register) _arg)
"Jump to the PDF position stored in VAL."
(pdf-view-bookmark-jump (pdf-view-register-bookmark val)))
This function is used as the `:print-func' property with
`registerv-make'."
(let* ((file (bookmark-prop-get bmk 'filename))
(cl-defmethod register-val-describe ((val pdf-view-register) _verbose)
"Print a description of the PDF position stored in VAL."
(let* ((bmk (pdf-view-register-bookmark val))
(file (bookmark-prop-get bmk 'filename))
(buffer (find-buffer-visiting file))
(page (bookmark-prop-get bmk 'page))
(origin (bookmark-prop-get bmk 'origin)))
@@ -1773,6 +1930,15 @@ This function is used as the `:print-func' property with
(round (* 100 (cdr origin)))
0)))))
(cl-defmethod register-val-insert ((val pdf-view-register))
"Insert the PDF bookmark stored in VAL."
(insert (format "%S" (pdf-view-register-bookmark val))))
(defun pdf-view-registerv-make ()
"Create a PDF register entry of the current position."
(pdf-view-register--make
(pdf-view-bookmark-make-record nil t t)))
(defmacro pdf-view-with-register-alist (&rest body)
"Setup the proper binding for `register-alist' in BODY.