diff options
author | Lars Ingebrigtsen <larsi@gnus.org> | 2022-06-07 18:34:20 +0200 |
---|---|---|
committer | Lars Ingebrigtsen <larsi@gnus.org> | 2022-06-07 18:34:20 +0200 |
commit | 17ed9a803987d7441c64ee1a205322d99766b1da (patch) | |
tree | ea954b4b8b735115caed3ea8bbce17315ae33b18 /lisp | |
parent | 00a0226ba53598bbe71d12d877121fdcb194e2c9 (diff) | |
download | emacs-17ed9a803987d7441c64ee1a205322d99766b1da.tar.gz emacs-17ed9a803987d7441c64ee1a205322d99766b1da.tar.bz2 emacs-17ed9a803987d7441c64ee1a205322d99766b1da.zip |
Allow posn-col-row to return data on a per-window basis
* doc/lispref/commands.texi (Accessing Mouse): Document it.
* lisp/subr.el (posn-col-row): Extend to use window data.
Diffstat (limited to 'lisp')
-rw-r--r-- | lisp/subr.el | 39 |
1 files changed, 24 insertions, 15 deletions
diff --git a/lisp/subr.el b/lisp/subr.el index 8afba2b341d..50ae357a136 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -1705,13 +1705,19 @@ pixels. POSITION should be a list of the form returned by (declare-function scroll-bar-scale "scroll-bar" (num-denom whole)) -(defun posn-col-row (position) +(defun posn-col-row (position &optional use-window) "Return the nominal column and row in POSITION, measured in characters. The column and row values are approximations calculated from the x and y coordinates in POSITION and the frame's default character width and default line height, including spacing. + +If USE-WINDOW is non-nil, use the typical width of a character in +the window indicated by POSITION instead of the frame. (This +makes a difference is a window has a zoom level.) + For a scroll-bar event, the result column is 0, and the row corresponds to the vertical position of the click in the scroll bar. + POSITION should be a list of the form returned by the `event-start' and `event-end' functions." (let* ((pair (posn-x-y position)) @@ -1729,20 +1735,23 @@ and `event-end' functions." ((eq area 'horizontal-scroll-bar) (cons (scroll-bar-scale pair (window-width window)) 0)) (t - ;; FIXME: This should take line-spacing properties on - ;; newlines into account. - (let* ((spacing (when (display-graphic-p frame) - (or (with-current-buffer - (window-buffer (frame-selected-window frame)) - line-spacing) - (frame-parameter frame 'line-spacing))))) - (cond ((floatp spacing) - (setq spacing (truncate (* spacing - (frame-char-height frame))))) - ((null spacing) - (setq spacing 0))) - (cons (/ (car pair) (frame-char-width frame)) - (/ (cdr pair) (+ (frame-char-height frame) spacing)))))))) + (if use-window + (cons (/ (car pair) (window-font-width window)) + (/ (cdr pair) (window-font-height window))) + ;; FIXME: This should take line-spacing properties on + ;; newlines into account. + (let* ((spacing (when (display-graphic-p frame) + (or (with-current-buffer + (window-buffer (frame-selected-window frame)) + line-spacing) + (frame-parameter frame 'line-spacing))))) + (cond ((floatp spacing) + (setq spacing (truncate (* spacing + (frame-char-height frame))))) + ((null spacing) + (setq spacing 0))) + (cons (/ (car pair) (frame-char-width frame)) + (/ (cdr pair) (+ (frame-char-height frame) spacing))))))))) (defun posn-actual-col-row (position) "Return the window row number in POSITION and character number in that row. |