Function: posn-col-row

posn-col-row is a byte-compiled function defined in subr.el.gz.

Signature

(posn-col-row POSITION &optional USE-WINDOW)

Documentation

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.

View in manual

Probably introduced at or before Emacs version 23.3.

Source Code

;; Defined in /usr/src/emacs/lisp/subr.el.gz
(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."
  (declare (side-effect-free t))
  (let* ((pair            (posn-x-y position))
         (frame-or-window (posn-window position))
         (frame           (if (framep frame-or-window)
                              frame-or-window
                            (window-frame frame-or-window)))
         (window          (when (windowp frame-or-window) frame-or-window))
         (area            (posn-area position)))
    (cond
     ((null frame-or-window)
      '(0 . 0))
     ((eq area 'vertical-scroll-bar)
      (cons 0 (scroll-bar-scale pair (1- (window-height window)))))
     ((eq area 'horizontal-scroll-bar)
      (cons (scroll-bar-scale pair (window-width window)) 0))
     (t
      (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)))))))))