update packages and add valign
This commit is contained in:
@@ -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.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user