Skip to content

Commit

Permalink
Merge branch 'highlight-selection'
Browse files Browse the repository at this point in the history
  • Loading branch information
Andreas Politz committed Oct 31, 2014
2 parents f7afa1f + 695b6b4 commit 98d979e
Show file tree
Hide file tree
Showing 6 changed files with 321 additions and 78 deletions.
20 changes: 20 additions & 0 deletions ChangeLog
@@ -1,3 +1,23 @@
2014-10-31 Andreas Politz <politza@hochschule-trier.de>

Highlight the selection of text.

* src/epdfinfo.c: Added new command getselection.
(print_annot): Removed suspicous type cast.
(cmd_gettext): Added selection-style argument.

* lisp/pdf-render.el (pdf-render-redraw--1): Added silent argument.
(pdf-render-redraw-document): Dito.
(pdf-render-momentarily-process): Dropped caching files.

* lisp/pdf-misc.el (pdf-misc-minor-mode-map): Added mouse
binding. C-w will now copy the selected region, if there is one.
(pdf-misc-selection-convert-commands): New variable.

* lisp/pdf-info.el: New function `pdf-info-getselection'.
(pdf-info-query--transform-response): Added getselection.
(pdf-info-gettext): Added selection-style argument.

2014-10-30 Andreas Politz <politza@hochschule-trier.de>

* Makefile.am:Create image directory in the package (Regression).
Expand Down
40 changes: 34 additions & 6 deletions lisp/pdf-info.el
Expand Up @@ -329,6 +329,11 @@ This is a no-op, if `pdf-info-log-buffer' is nil."
(cons 'modified (pop md))))))
(gettext
(or (caar response) ""))
(getselection
(mapcar (lambda (line)
(mapcar 'string-to-number
(split-string (car line) " " t)))
response))
(features (mapcar 'intern (car response)))
(pagesize
(setq response (car response))
Expand Down Expand Up @@ -657,20 +662,43 @@ the tree and ACTION has the same format as in
'outline
(pdf-info--normalize-file-or-buffer file-or-buffer)))

(defun pdf-info-gettext (page x0 y0 x1 y1 &optional file-or-buffer)
"On PAGE extract the text of the selection X0 Y0 X1 and Y1.
(defun pdf-info-gettext (page x0 y0 x1 y1 &optional selection-style
file-or-buffer)
"Get text on PAGE according to edges X0, Y0, X1 and Y1.
The coordinates of the selection are assumed to be relative,
The coordinates of the edges are assumed to be relative,
i.e. in the interval [0;1]. The selection may extend over
multiple lines, which works as usual \(e.g. like the region in
Emacs\).
multiple lines, which works similar to Emacs region.
Return the text contained in the selection."

(pdf-info-query
'gettext
(pdf-info--normalize-file-or-buffer file-or-buffer)
page x0 y0 x1 y1))
page x0 y0 x1 y1
(cl-case selection-style
(glyph 0)
(word 1)
(line 2)
(t 0))))

(defun pdf-info-getselection (page x0 y0 x1 y1 &optional selection-style
file-or-buffer)
"Return the edges of the selection on PAGE.
Arguments are the same as for `pdf-info-gettext'. Return a list
of edges corresponding to the text that would be a returned by
the aforementioned function when called with the same arguments."

(pdf-info-query
'getselection
(pdf-info--normalize-file-or-buffer file-or-buffer)
page x0 y0 x1 y1
(cl-case selection-style
(glyph 0)
(word 1)
(line 2)
(t 0))))

(defun pdf-info-pagesize (&optional page file-or-buffer)
"Return the size of PAGE as a cons \(WIDTH . HEIGHT\)
Expand Down
146 changes: 117 additions & 29 deletions lisp/pdf-misc.el
Expand Up @@ -28,8 +28,9 @@

(defvar pdf-misc-minor-mode-map
(let ((kmap (make-sparse-keymap)))
(define-key kmap [drag-mouse-1] 'pdf-misc-copy-selection)
(define-key kmap (kbd "C-w") 'pdf-misc-copy-page)
(define-key kmap [down-mouse-1] 'pdf-misc-mouse-set-region)
(define-key kmap (kbd "C-w") 'pdf-misc-copy-region)
(define-key kmap (kbd "M-w") 'pdf-misc-copy-region)
(define-key kmap (kbd "C-c C-d") 'pdf-misc-dark-mode)
(define-key kmap (kbd "I") 'pdf-misc-display-metadata)
(define-key kmap (kbd "s w") 'pdf-misc-crop-to-window)
Expand All @@ -39,37 +40,124 @@
kmap)
"Keymap used in `pdf-misc-minor-mode'.")


(defcustom pdf-misc-region-convert-commands
'("-fuzz" "30%%" "-region" "%g"
"-fill" "%b" "-draw" "color 0,-1 replace")
"The commands for highlighting the region.
See `pdf-isearch-convert-commands'."
:group 'pdf-misc
:type '(repeat string)
:link '(url-link "http://www.imagemagick.org/script/convert.php"))

(defface pdf-misc-region
'((((background dark))
:background "blue3")
(((background light))
:background "lightgoldenrod2"))
"Face used to determine the colors of the region."
;; :group 'pdf-isearch
:group 'pdf-tools-faces)

(defvar-local pdf-misc-current-region nil
"The active region, or nil.
\(PAGE . \(X1 Y1 X2 Y2\)")

;;;###autoload
(define-minor-mode pdf-misc-minor-mode
"Miscellanous smaller commands.
\\{pdf-misc-minor-mode-map}"
nil nil nil)

(defun pdf-misc-copy-selection (ev)
"Copy the selection represented by EV to the `kill-ring'.
EV should be a mouse-drag event, i.e. this command should be
bound to an appropriate event.
The selection works as usual, e.g. like the region in Emacs."
(interactive "@e")
nil nil nil
(cond
(pdf-misc-minor-mode
(add-hook 'deactivate-mark-hook 'pdf-misc-deactivate-region nil t)
(add-hook 'pdf-util-after-change-page-hook 'pdf-misc-deactivate-region nil t)
(add-hook 'kill-buffer-hook 'pdf-misc-deactivate-region nil t)
(pdf-render-register-layer-function 'pdf-misc-region-render))
(t
(pdf-misc-deactivate-region)
(remove-hook 'deactivate-mark-hook 'pdf-misc-deactivate-region t)
(remove-hook 'pdf-util-after-change-page-hook 'pdf-misc-deactivate-region t)
(remove-hook 'kill-buffer-hook 'pdf-misc-deactivate-region t)
(pdf-render-unregister-layer-function 'pdf-misc-region-render))))

(defun pdf-misc-deactivate-region ()
"Clears the region."
(interactive)
(pdf-util-assert-pdf-buffer)
(when pdf-misc-current-region
(let ((selpage (car pdf-misc-current-region)))
(setq pdf-misc-current-region nil)
(deactivate-mark)
(pdf-render-redraw-document nil (list selpage) t))))

(defun pdf-misc-mouse-set-region (ev)
"Selects a region of text using the mouse."
(interactive "@e")
(pdf-util-assert-pdf-window)
(unless (and (eventp ev)
(mouse-event-p ev)
(= (length ev) 3))
(error "This command must be bound to a mouse-drag event"))
(when (and (posn-image (car (cdr ev)))
(posn-image (car (cddr ev))))
(let* ((beg (posn-object-x-y (car (cdr ev))))
(end (posn-object-x-y (car (cddr ev))))
(txt (pdf-misc-selection-string
(min (car beg) (car end))
(min (cdr beg) (cdr end))
(max (car beg) (car end))
(max (cdr beg) (cdr end)))))
(message "%s" txt)
(mouse-event-p ev))
(signal 'wrong-type-argument (list 'mouse-event-p ev)))
(pdf-misc-deactivate-region)
(when (posn-image (event-start ev))
(let* ((window (selected-window))
(beg (posn-object-x-y (event-start ev)))
event)
(pdf-render-with-redraw
'pdf-misc-region-render
(while (eq 'mouse-movement
(event-basic-type
(setq event
(track-mouse (read-event)))))
(let* ((pos (event-start event))
(end (posn-object-x-y pos)))
(when (and (eq window (posn-window pos))
(posn-image pos)
(/= (car beg) (car end))
(/= (cdr beg) (cdr end)))
(setq pdf-misc-current-region
(list (doc-view-current-page)
(min (car beg) (car end))
(min (cdr beg) (cdr end))
(max (car beg) (car end))
(max (cdr beg) (cdr end))))
(redraw)))))
(if pdf-misc-current-region
(setq transient-mark-mode t))
(setq unread-command-events (list event)))))

(defun pdf-misc-region-render (page)
(when (and (eq page (car pdf-misc-current-region))
(pdf-util-page-displayed-p))
(let* ((size (pdf-util-image-size))
(ifsize (pdf-util-png-image-size))
(region (cdr pdf-misc-current-region))
(colors (pdf-util-face-colors 'pdf-misc-region
pdf-misc-dark-mode))
(selection
(apply 'pdf-info-getselection
(doc-view-current-page)
(pdf-util-scale-edges
region (cons (/ 1.0 (car size))
(/ 1.0 (cdr size)))))))
(list :commands
pdf-misc-region-convert-commands
:foreground (car colors)
:background (cdr colors)
:apply
(pdf-util-scale-edges selection ifsize)))))

(defun pdf-misc-copy-region ()
"Copy the region to the `kill-ring'."
(interactive)
(pdf-util-assert-pdf-window)
(if (null pdf-misc-current-region)
(pdf-misc-copy-page)
(let* ((txt (apply 'pdf-misc-selection-string
(cdr pdf-misc-current-region))))
(pdf-misc-deactivate-region)
(kill-new txt))))

(defun pdf-misc-copy-page ()
Expand Down Expand Up @@ -404,9 +492,9 @@ This tells `pdf-isearch-minor-mode' to use dark colors."

(define-key menu [sep-4] menu-bar-separator)

(define-key menu [copy-page]
'(menu-item "Copy page" pdf-misc-copy-page
:help "Copy the text of the page to the kill-ring"
(define-key menu [copy-region]
'(menu-item "Copy region" pdf-misc-copy-region
:help "Copy the text of the region to the kill-ring"
:visible (featurep 'pdf-misc)))

(define-key menu [occur]
Expand Down
69 changes: 36 additions & 33 deletions lisp/pdf-render.el
Expand Up @@ -183,7 +183,7 @@

(defvar-local pdf-render-pages-to-render nil)

(defun pdf-render-redraw--1 (&optional buffer)
(defun pdf-render-redraw--1 (&optional buffer silent)
"Only used internally."
;; Assumes no conversion (DocView + pdf-render) in progress.
(save-current-buffer
Expand Down Expand Up @@ -219,9 +219,10 @@
;; buffers are rendered.
(run-with-timer 0.05 nil 'pdf-render-redraw--1 buffer))
(t
(setq mode-line-process
(and pages (list (format ":Rendering (%d left)"
(length pages)))))
(unless silent
(setq mode-line-process
(and pages (list (format ":Rendering (%d left)"
(length pages))))))
(apply
'pdf-util-convert-asynch
in-file pdf-render-temp-file
Expand All @@ -230,12 +231,13 @@
(when (buffer-live-p buffer)
(with-current-buffer buffer
(if (not (equal status "finished\n"))
(setq mode-line-process
`(,(cond
((equal status "killed\n")
":*canceled*")
(t
":*convert error*"))))
(unless silent
(setq mode-line-process
`(,(cond
((equal status "killed\n")
":*canceled*")
(t
":*convert error*")))))
(pdf-render-set-state page cmds)
(copy-file pdf-render-temp-file out-file t)
(clear-image-cache out-file)
Expand All @@ -253,7 +255,7 @@
(setq n (1+ n))))
n))

(defun pdf-render-redraw-document (&optional buffer pages)
(defun pdf-render-redraw-document (&optional buffer pages silent)
(interactive)
(save-current-buffer
(when buffer (set-buffer buffer))
Expand All @@ -274,7 +276,7 @@
(cl-union (cl-remove-duplicates pages)
pdf-render-pages-to-render)
(number-sequence 1 (pdf-info-number-of-pages))))
(pdf-render-redraw--1)))))
(pdf-render-redraw--1 nil silent)))))

(defmacro pdf-render-with-redraw (render-fn &optional exclusive-p &rest body)
(declare (indent 1) (debug t))
Expand Down Expand Up @@ -374,35 +376,36 @@
img))
(clear-image-cache file))))))

(defvar pdf-render-momentarily-process nil)

(defun pdf-render-momentarily (&rest spec)
(pdf-util-assert-pdf-window)
(let* ((window (selected-window))
(image (doc-view-current-image))
(buffer (window-buffer window))
(page (doc-view-current-page))
(in-file (pdf-util-current-image-file))
(out-file (pdf-util-cache-make-filename
'pdf-render-momentarily
(pdf-util-fast-image-format)
(append spec (pdf-render-convert-commands page)))))
(cond
((file-exists-p out-file)
(pdf-render-display-image out-file)
nil)
((null spec)
(pdf-render-redisplay-current-page)
nil)
(t
(apply
'pdf-util-convert-asynch
in-file out-file
`(,@spec
,(lambda (_proc status)
(when (and (equal status "finished\n")
(window-live-p window)
(eq (window-buffer window) buffer)
(pdf-util-pdf-buffer-p buffer))
(with-selected-window window
(pdf-render-display-image out-file))))))))))
(pdf-util-fast-image-format))))

(when (processp pdf-render-momentarily-process)
(delete-process pdf-render-momentarily-process))
(setq pdf-render-momentarily-process
(apply
'pdf-util-convert-asynch
in-file out-file
`(,@spec
,(lambda (_proc status)
(when (and (equal status "finished\n")
(buffer-live-p buffer)
(pdf-util-pdf-buffer-p buffer)
(window-live-p window)
(eq (window-buffer window) buffer))
(with-selected-window window
(when (and (eq page (doc-view-current-page))
(eq image (doc-view-current-image)))
(pdf-render-display-image out-file))))))))))

;;
;; DocView Setup
Expand Down
2 changes: 1 addition & 1 deletion lisp/pdf-sync.el
Expand Up @@ -43,7 +43,7 @@ This key is added to `TeX-source-correlate-method', when

(defvar pdf-sync-minor-mode-map
(let ((kmap (make-sparse-keymap)))
(define-key kmap [down-mouse-1] 'ignore)
;; (define-key kmap [down-mouse-1] 'ignore)
(define-key kmap [double-mouse-1] 'pdf-sync-mouse-goto-tex)
kmap))

Expand Down

0 comments on commit 98d979e

Please sign in to comment.