> > Before you modify display_line, you need to decide how will the > vertical-layout display produce glyphs. Can you please expand more on this? How to produce glyphs in a column wise order? I looked at gui_produce_glyphs and that led me to append_glyph, but I could not figure out how the glyphs are produced. There is also draw_glyphs but I think working with that will require editing the low level *term files (if it even is the right function) Thanks On Sat, Sep 10, 2022 at 9:47 PM Eli Zaretskii wrote: > > From: समीर सिंह Sameer Singh > > Date: Sat, 10 Sep 2022 21:23:32 +0530 > > Cc: emacs-devel@gnu.org > > > > In order to find the "real meat" of the display_line function I started > to slowly remove most of the lines of the > > function as long as it does not break emacs and text can be typed. > > > > In the end I was left with this a 20-25 lines function (excluding > comments and spaces): > > (I have attached this function too) > > > > static bool > > display_line (struct it *it, int cursor_vpos) > > { > > struct glyph_row *row = it->glyph_row; > > > > /* Clear the result glyph row and enable it. */ > > prepare_desired_row (it->w, row, false); > > > > row->y = it->current_y; > > > > /* Loop generating characters. The loop is left with IT on the next > > character to display. */ > > while (true) > > { > > > > /* Retrieve the next thing to display. Value is false if end of > > buffer reached. */ > > if (!get_next_display_element (it)) > > { > > break; > > } > > > > PRODUCE_GLYPHS (it); > > > > at_end_of_line: > > /* Is this a line end? If yes, we're also done, after making > > sure that a non-default face is extended up to the right > > margin of the window. */ > > if (ITERATOR_AT_END_OF_LINE_P (it)) > > { > > /* Consume the line end. This skips over invisible lines. */ > > set_iterator_to_next (it, true); > > break; > > } > > > > set_iterator_to_next (it, true); > > } > > > > /* Compute pixel dimensions of this line. */ > > compute_line_metrics (it); > > > > /* Prepare for the next line. This line starts horizontally at (X > > HPOS) = (0 0). Vertical positions are incremented. As a > > convenience for the caller, IT->glyph_row is set to the next > > row to be used. */ > > > > it->current_y += row->height; > > ++it->glyph_row; > > return MATRIX_ROW_DISPLAYS_TEXT_P (row); > > } > > > > Obviously most of the things do not work such as bidi, word wrapping, > displaying cursor and line numbers but > > still text is being shown > > in rows one after the other and it can be scrolled, but now there are no > lines mentioning the hpos, the > > x-coordinate, first_visible_x or > > last_visible_x, does that mean I do not understand the display_line > function? I thought its function was to fill a > > row with glyphs in the desired matrix > > to display it on the glass but now I cannot find a line which fills the > matrix. > > That hides behind the PRODUCE_GLYPHS macro. > > > You had advised to swap the x and y > > coordinates, but here there > > is no x coordinate present! How can the redisplay still work? > > display_line also makes the decisions when the screen line is full and > the rest should be on the next screen line this is one of its most > important roles. But you have removed that code, so you don't see it > in what's left. The parts that deal with the X coordinate that > exceeds last_visible_x are those which make that decision. >