Subject: Re: bug#50506: 28.0.50; display-line-numbers equivalent for linum-format?

From: Eli Zaretskii <[email-masked]>
Date: Wed, 15 Sep 2021 21:10:39 +0300

> From: Michael Gallagher - NOAA Affiliate <[email-masked]>
> Date: Wed, 15 Sep 2021 11:32:17 -0600
> Cc: Lars Ingebrigtsen <[email-masked]>, [email-masked]
> 
> Ok. Correct me if I'm wrong, but this is extremely ugly in that it requires a deep knowledge of how the glyphs
> are drawn and how move_it_by_lines operates on the glyphs.

move_it_by_lines is not relevant here.  The code to look at is
display_line and the few of the functions it calls.  display_line is
where the display engine generates screen lines, called "glyph rows".
A glyph row is just an array of 'struct glyph', or "glyphs" for short.
Each one of these glyphs describes a single "display element": a
character, an image, a stretch of whitespace, etc.  We are interested
in character glyphs here.

> Because, as it appears to me, once the line
> number glyphs are sent to what I will call the "glyph queue" via PRODUCE_GLYPHS you have very little
> (no?) information about what is responsible for those glyphs?

PRODUCE_GLYPHS is a macro that (on GUI frames) calls
gui_produce_glyphs.  It generates one glyph and adds it to the array
of glyphs of the glyph row.  At any point during the time display_line
works on a single glyph row (a.k.a. "screen line"), you can reach all
the glyphs produced upto that point by looking at the glyphs in the
it->glyph_row array indexed by their horizontal position.

A glyph row has 3 areas: 2 areas for the left and right margins, and
one area called TEXT_AREA, which is where the line numbers and the
text of the line are laid out.  So the i-th glyph in the text area of
the glyph row is it->glyph_row->glyphs[TEXT_AREA][i-1], and the last
glyph produced so far has its index in it->glyph_row->used[TEXT_AREA]-1.

> Actually. I don't fully understand where in the
> code the line numbers get moved to the right side. Because it should be, conceptually, easy to swap the last
> glyph to the first glyph if there is a separator character at that point in the code. But when I "M-s o" for
> occurences of R2L and then look for the place where the lnum glyphs are moved to the right side, I can't find
> it.  

When gui_produce_glyphs and its subroutines realize that the glyph row
has its reversed_p flag set, they start pushing (prepending) glyphs to
the glyphs already there, instead of appending them.  That's how the
line number winds up at the right edge of the screen line: it is
pushed there by the following glyphs when those are prepended.  Look
in append_glyph to see how this is done.

If what I told above and the code I pointed to leave something
unclear, please ask specific questions.