Subject: Re: bug#75168: 31.0.50; text-scale confuses ruler-mode when display-line-number-mode is active

From: Arsen Arsenović <[email-masked]>
Date: Sat, 11 Jan 2025 14:16:24 +0100

Hi,

Arsen Arsenović <[email-masked]> writes:

> I've just dug through the Elisp manual a little and I think (elisp)
> Specified Space is precisely what's needed here.  I've tried the
> following:
>
> modified   lisp/ruler-mode.el
> @@ -632,12 +632,7 @@ ruler-mode-ruler
>    (let* ((w (ruler-mode-text-scaled-window-width))
>           (m (window-margins))
>           (f (window-fringes))
> -         (i (if display-line-numbers
> -                ;; FIXME: ruler-mode relies on I being an integer, so
> -                ;; the column numbers might be slightly off if the
> -                ;; line-number face is customized.
> -                (round (line-number-display-width 'columns))
> -              0))
> +         (i 0)
>           (j (ruler-mode-text-scaled-window-hscroll))
>           ;; Setup the scrollbar, fringes, and margins areas.
>           (lf (ruler-mode-space
> @@ -739,7 +734,13 @@ ruler-mode-ruler
>        (setq i (1+ i)
>              j (1+ j)))
>  
> -    (let ((ruler-str (concat ruler))
> +    (let ((ruler-indent
> +           (if (not display-line-numbers)
> +               ""
> +             (propertize " " 'display
> +                         `(space :width
> +                                 (,(- (line-number-display-width t) 1))))))
> +          (ruler-str (concat ruler))
>            (len (length ruler)))
>        (add-text-properties 0 len ruler-wide-props ruler-str)
>        (dolist (p (nreverse props))
> @@ -747,13 +748,14 @@ ruler-mode-ruler
>  
>        ;; Return the ruler propertized string.  Using list here,
>        ;; instead of concat visually separate the different areas.
> -      (if (nth 2 (window-fringes))
> -          ;; fringes outside margins.
> -          (list "" (and (eq 'left sbvt) sb) lf lm
> -                ruler-str rm rf (and (eq 'right sbvt) sb))
> -        ;; fringes inside margins.
> -        (list "" (and (eq 'left sbvt) sb) lm lf
> -              ruler-str rf rm (and (eq 'right sbvt) sb))))))
> +      (let ((ruler-str-ind (concat ruler-indent ruler-str)))
> +            (if (nth 2 (window-fringes))
> +            ;; fringes outside margins.
> +            (list "" (and (eq 'left sbvt) sb) lf lm
> +                  ruler-str-ind rm rf (and (eq 'right sbvt) sb))
> +          ;; fringes inside margins.
> +          (list "" (and (eq 'left sbvt) sb) lm lf
> +                ruler-str-ind rf rm (and (eq 'right sbvt) sb)))))))
>  
>  (provide 'ruler-mode)
>  
> This is almost perfect. The (- ... 1) in the :width pixel spec is
> obviously a hack (and breaks this patch in emacs -nw).  I have no idea
> why an extra pixel is inserted in GUI mode.  If you apply the above but
> remove (- ... 1), you'll see the following: [...]

I've refined the patch:

diff --git a/lisp/ruler-mode.el b/lisp/ruler-mode.el
index 003dcae560f..64568e06cc9 100644
--- a/lisp/ruler-mode.el
+++ b/lisp/ruler-mode.el
@@ -632,12 +632,7 @@ ruler-mode-ruler
   (let* ((w (ruler-mode-text-scaled-window-width))
          (m (window-margins))
          (f (window-fringes))
-         (i (if display-line-numbers
-                ;; FIXME: ruler-mode relies on I being an integer, so
-                ;; the column numbers might be slightly off if the
-                ;; line-number face is customized.
-                (round (line-number-display-width 'columns))
-              0))
+         (i 0)
          (j (ruler-mode-text-scaled-window-hscroll))
          ;; Setup the scrollbar, fringes, and margins areas.
          (lf (ruler-mode-space
@@ -745,6 +740,12 @@ ruler-mode-ruler
       (dolist (p (nreverse props))
         (add-text-properties (nth 0 p) (nth 1 p) (nthcdr 2 p) ruler-str))
 
+      ;; Attach an alignment indent.
+      (if display-line-numbers
+          (setq ruler-str
+                (concat (ruler-mode-space `(,(line-number-display-width t)))
+                        ruler-str)))
+
       ;; Return the ruler propertized string.  Using list here,
       ;; instead of concat visually separate the different areas.
       (if (nth 2 (window-fringes))

This works perfectly on PGTK (and with -nw) - that extra pixel I
mentioned seems to be an artifact, or perhaps a bug, of the Lucid
toolkit.

What do you think of the above?

Have a lovely day.
-- 
Arsen Arsenović