commit e860ee8e44d17a9446c26f2fb4a0bbfad50f33a5
Author: Jean-Marc Lasgouttes <[email protected]>
Date: Sat Aug 22 17:21:27 2026 +0200
Transfer PAINTING_ANALYSIS file to Development.lyx
---
development/PAINTING_ANALYSIS | 213 -------
lib/doc/Development.lyx | 1263 ++++++++++++++++++++++++++++++++++++++++-
2 files changed, 1258 insertions(+), 218 deletions(-)
diff --git a/development/PAINTING_ANALYSIS b/development/PAINTING_ANALYSIS
deleted file mode 100644
index 438d7ca9c3..0000000000
--- a/development/PAINTING_ANALYSIS
+++ /dev/null
@@ -1,213 +0,0 @@
-# -*- org -*-
-Understanding the painting process
-
-This file tries to describe the state of the metrics/painting
-mechanism, and identify the improvements that could be made. The first
-sections can be read alone, although the context for them is really
-given in the following ones.
-
-Please keep this file up to date as the code evolves!!!
-
-Abbreviations:
-bv: BufferView
-pm: ParagraphMetrics
-tm: TextMetrics
-
-* Questions / Ideas
-
-These questions are consequences of the description made in the
-following section. Some actions are proposed.
-
-** SinglePar update
-
-This flag only has an effect in the current BufferView, but I think it
-is useful in other views too. Doing this will require some work on the
-update pipeline, though.
-
-
-** Buffer::change issues
-
-When calling Buffer::changed outside of bv::processUpdateFlags,
-how do we know that the update strategy is set correctly? It is
-possible to reset the strategy at the end of bv::draw. What would be
-a good value? NoScreenUpdate?
-
-On a related note, what is the semantics of a call to
-Buffer::changed(false)? What does the caller mean?
-
-
-** How to avoid redraw with FitCursor when the cursor is already OK?
-
-In this case, we invoke Buffer::change(false) with drawing disabled
-and NoScreenUpdate strategy.
-
-In the draw phase, bv::checkCursorScrollOffset (the horizontal
-scrolling machinery) will change the strategy to FullScreenUpdate if
-the current row needs further scrolling.
-
-When the update strategy it kept to NoScreenUpdate, there is currently
-a no-draw full repaint, which should not be necessary. It would be
-possible to avoid that if the call to checkCursorScrollOffset was done
-in bv::processUpdateFlags instead of bv::draw.
-
-The global idea would be to extend FitCursor to cover also horizontal
-cursor.
-
-
-* TODO Clean-up of drawing code
-
-** Set Row::changed() in a finer way
-
-*** singleParUpdate
-
-When the height of the current paragraph changes, there is no need for
-a full screen update (at top level, at least). Only the rows after the
-current one need to have their position recomputed.
-
-
-*** redoParagraph
-
-It should be possible to check whether the new row is the same as the
-old one and keep its changed() status in this case. This would reduce
-a lot the amount of stuff to redraw.
-
-
-** Put labels and friends in the Row as elements
-
-It should not be necessary to access the Paragraph object to draw.
-Adding the static elements to Row is a lot of work, but worth it IMO.
-
-
-** When a paragraph ends with a newline, compute correctly the height of the
extra row.
-
-
-** Merging bv::updateMetrics and tm::metrics
-
-While the full metrics computation tries hard to limit the number of
-paragraphs that are rebroken, the version that is used for inner inset
-does not try any such optimization. This can be very bad for very tall
-insets. We should re-use the bv::updateMetrics logic:
- + transfer all the logic of bv::updateMetrics to tm.
- + Main InsetText should not be special.
-
-The difficulty for a tall table cell for example, is that it may be
-necessary to break the whole contents to know the width of the cell.
-Also, the anchor is relative to the outer paragraph, which means that
-for a very long inset it is necessary to rebreak until the contents
-that needs to be shown (to compute the heights).
-
-All in all, this is difficult to get right. This is less important now
-that SinglePar updates work in nested insets.
-
-
-* Description of current drawing mechanism
-
-** Three-stage drawing
-
-There are three parts to drawing the work area:
-
- + the metrics phase computes the size of insets and breaks the
- paragraphs into rows. It stores the dimension of insets (both
- normal and math) in bv::coordCache and the vertical position of the
- top-level paragraphs.
-
- + the nodraw drawing phase paints the screen (see below) with a null
- painter. The only useful effect is to store the positions of
- visible insets.
-
- + an update() signal is sent. This in turn will trigger a paint
- event, and the actual screen painting will happen then.
-
-The machinery is controlled via bv::processUpdateFlags. This method is
-called at the end of bv::mouseEventDispatch and in
-GuiApplication::dispatch, via the updateCurrentView method. There are
-also several calls in code related to dialogs. We should evaluate
-whether this is correct.
-
-Depending on the Update::flags passed to the method, it sets an update
-strategy in (NoScreenUpdate, SingleParUpdate, FullScreenUpdate,
-DecorationUpdate). It triggers a call to updateMetrics when either:
-
- + Update::Force has been specified
- + Update::FitCursor has been specified and there is a need to scroll
- the display.
- + Update::SinglePar has been specified and the current paragraph has
- changed height.
-
-If a computation of metrics has taken place, Force is removed from the
-flags and ForceDraw is added instead.
-
-It is OK to call processUpdateFlags several times before an update. In
-this case, the effects are cumulative. processUpdateFlags executes the
-metrics-related actions, but defers the actual drawing to the next
-paint event.
-
-The screen is drawn (with appropriate update strategy), except when
-update flag is Update::None.
-
-
-** Metrics computation (and nodraw drawing phase)
-
-This is done bv::updateMetrics. When the parameter 'force' of this
-method is true, that first thing that is done is to clear the metrics
-caches to start from a clean slate.
-
-Then, starting upwards then downwards from the anchor paragraph
-(anchor_pit_) and its vertical position (anchor_ypos_),
-tm::updateMetrics every visible paragraph whose metrics is not know
-(all of them when force==true) is recomputed using tm::redoParagraph.
-
-tm::redoParagraph will call Inset::metrics for each inset. In the case
-of text insets, this will invoke recursively tm::metrics, which redoes
-all the paragraphs of the inset. Then, a single big row is created in
-tm::tokenizeParagraph, which is later broken in multiple rows by
-tm::breakParagraph.
-
-If it turns out that the top or bottom margin are incorrect (paragraphs
-are too high/low), tm::updateMetrics will be called again with fixed
-values of anchor_ypos_ (this does not incur much extra work).
-
-At the end of bv::updateMetrics, bv::updatePosCache is called. It triggers
-a repaint of the document with a NullPainter (a painter that does
-nothing). This has the effect of caching all insets positions.
-
-This way of working means that scrolling can be achieved by just
-updating anchor_ypos_ and calling bv::processUpdateFlags(Update::ForceDraw).
-
-** Drawing the work area.
-
-This is done in bv::draw. This method is triggered by a paint event,
-mainly called through Buffer::changed, which draws all the work areas
-that show the given buffer.
-
-Note that, When Buffer::changed is called outside of
-bv::processUpdateFlags, it is not clear whether the update strategy
-has been set to a reasonable value beforehand.
-
-The action depends on the update strategy:
-
- + NoScreenUpdate: repaint the whole screen with drawing disabled.
- This is only needed to update the inset positions. I am not sure
- when this is necessary, actually. This is triggered when:
- - Update::FitCursor is set but the cursor is already visible. It is
- not clear why something needs to be done in this case, since this
- should be equivalent to Update::None.
- - this is also set when update flag is Update::None, but this value
- is AFAICS not acted on in the code (meaning that nothing happens
- at all in this case).
-
- + FullScreenUpdate: repaint the whole screen. This is set when:
- - updateMetrics has been invoked.
- - scroll value of current row has changed (although this should not
- be necessary).
-
- + DecorationUpdate: actually like FullScreenUpdate, although it is
- intended to only update inset decorations. This triggers when:
- - Update::Decoration is set (without Update::Force) as flag.
- - An hovered inset is detected.
-
- + SingleParUpdate: only tries to repaint current paragraph in a way
- that is not yet very clear to me.
-
-BufferView::draw can also be called with a null painter from
-BufferView::updateMetrics().
diff --git a/lib/doc/Development.lyx b/lib/doc/Development.lyx
index 25f82d3a4e..247c45e352 100644
--- a/lib/doc/Development.lyx
+++ b/lib/doc/Development.lyx
@@ -1,5 +1,5 @@
-#LyX 2.5 created this file. For more info see https://www.lyx.org/
-\lyxformat 640
+#LyX 2.6 created this file. For more info see https://www.lyx.org/
+\lyxformat 659
\begin_document
\begin_header
\save_transient_properties true
@@ -55,6 +55,7 @@ logicalmkup
\pdf_quoted_options "linkcolor=black, citecolor=black, urlcolor=blue,
filecolor=blue, pdfpagelayout=OneColumn, pdfnewwindow=true, pdfstartview=XYZ,
plainpages=false"
\papersize a4
\use_geometry false
+\use_package aligned-overset 0
\use_package amsmath 1
\use_package amssymb 1
\use_package cancel 1
@@ -72,7 +73,7 @@ logicalmkup
\use_indices false
\paperorientation portrait
\suppress_date false
-\justification true
+\justification default
\crossref_package prettyref
\use_formatted_ref 0
\use_minted 0
@@ -88,13 +89,14 @@ logicalmkup
\table_alt_row_colors_start 1
\index Index
\shortcut idx
-\color #008000
+\color #ff008000
\end_index
\spellchecker_ignore english namespaces
\secnumdepth 4
\tocdepth 2
\paragraph_separation indent
\paragraph_indentation default
+\parfillskip "default" ""
\is_math_indent 0
\math_numbering_side default
\quotes_style english
@@ -1779,7 +1781,7 @@ This way,
\end_deeper
\begin_layout Standard
-\begin_inset Newpage newpage
+\begin_inset Textbreak newpage
\end_inset
@@ -7375,6 +7377,1257 @@ while
that span more than a line
\end_layout
+\begin_layout Chapter
+Understanding the painting process
+\end_layout
+
+\begin_layout Standard
+This section tries to describe the state of the metrics/painting mechanism,
+ and identify the improvements that could be made.
+
+\end_layout
+
+\begin_layout Standard
+\align center
+
+\emph on
+Please keep this file up to date as the code evolves!!!
+\end_layout
+
+\begin_layout Paragraph*
+Abbreviations:
+\end_layout
+
+\begin_layout Standard
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+bv
+\end_layout
+
+\end_inset
+
+:
+
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+BufferView
+\end_layout
+
+\end_inset
+
+,
+
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+pm
+\end_layout
+
+\end_inset
+
+:
+
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+ParagraphMetrics
+\end_layout
+
+\end_inset
+
+,
+
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+tm
+\end_layout
+
+\end_inset
+
+:
+
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+TextMetrics
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Description of current drawing mechanism
+\end_layout
+
+\begin_layout Subsection
+Three-stage drawing
+\end_layout
+
+\begin_layout Standard
+There are three parts to drawing the work area:
+\end_layout
+
+\begin_layout Itemize
+the metrics phase computes the size of insets and breaks the paragraphs into
rows.
+ It stores the dimension of insets (both normal and math) in
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+bv::coordCache
+\end_layout
+
+\end_inset
+
+ and the vertical position of the top-level paragraphs.
+\end_layout
+
+\begin_layout Itemize
+the nodraw drawing phase paints the screen (see below) with a null painter.
+ The only useful effect is to store the positions of visible insets.
+\end_layout
+
+\begin_layout Itemize
+an
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+update()
+\end_layout
+
+\end_inset
+
+ signal is sent.
+ This in turn will trigger a paint event,
+ and the actual screen painting will happen then.
+\end_layout
+
+\begin_layout Standard
+The machinery is controlled via
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+bv::processUpdateFlags
+\end_layout
+
+\end_inset
+
+.
+ This method is called at the end of
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+bv::mouseEventDispatch
+\end_layout
+
+\end_inset
+
+ and in
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+GuiApplication::dispatch
+\end_layout
+
+\end_inset
+
+,
+ via the
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+updateCurrentView
+\end_layout
+
+\end_inset
+
+ method.
+ There are also several calls in code related to dialogs.
+ We should evaluate whether this is correct.
+\end_layout
+
+\begin_layout Standard
+Depending on the
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+Update::flags
+\end_layout
+
+\end_inset
+
+ passed to the method,
+ it sets an update strategy in (
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+NoScreenUpdate
+\end_layout
+
+\end_inset
+
+,
+
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+SingleParUpdate
+\end_layout
+
+\end_inset
+
+,
+
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+FullScreenUpdate
+\end_layout
+
+\end_inset
+
+,
+
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+DecorationUpdate
+\end_layout
+
+\end_inset
+
+).
+ It triggers a call to
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+updateMetrics
+\end_layout
+
+\end_inset
+
+ when either:
+\end_layout
+
+\begin_layout Itemize
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+Update::Force
+\end_layout
+
+\end_inset
+
+ has been specified
+\end_layout
+
+\begin_layout Itemize
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+Update::FitCursor
+\end_layout
+
+\end_inset
+
+ has been specified and there is a need to scroll the display.
+
+\end_layout
+
+\begin_layout Itemize
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+Update::SinglePar
+\end_layout
+
+\end_inset
+
+ has been specified and the current paragraph has changed height.
+\end_layout
+
+\begin_layout Standard
+If a computation of metrics has taken place,
+
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+Force
+\end_layout
+
+\end_inset
+
+ is removed from the flags and
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+ForceDraw
+\end_layout
+
+\end_inset
+
+ is added instead.
+\end_layout
+
+\begin_layout Standard
+It is OK to call
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+processUpdateFlags
+\end_layout
+
+\end_inset
+
+ several times before an update.
+ In this case,
+ the effects are cumulative.
+
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+processUpdateFlags
+\end_layout
+
+\end_inset
+
+ executes the metrics-related actions,
+ but defers the actual drawing to the next paint event.
+\end_layout
+
+\begin_layout Standard
+The screen is drawn (with appropriate update strategy),
+ except when update flag is
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+Update::None
+\end_layout
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Subsection
+Metrics computation (and nodraw drawing phase)
+\end_layout
+
+\begin_layout Standard
+This is triggered by
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+bv::updateMetrics
+\end_layout
+
+\end_inset
+
+.
+ When the parameter
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+force
+\end_layout
+
+\end_inset
+
+ of this method is true,
+ that first thing that is done is to clear the metrics caches to start from a
clean slate.
+\end_layout
+
+\begin_layout Standard
+Then,
+ starting upwards then downwards from the anchor paragraph (
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+anchor_pit_
+\end_layout
+
+\end_inset
+
+) and its vertical position (
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+anchor_ypos_
+\end_layout
+
+\end_inset
+
+),
+
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+tm::updateMetrics
+\end_layout
+
+\end_inset
+
+ recomputes every visible paragraph whose metrics is not known using
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+tm::redoParagraph
+\end_layout
+
+\end_inset
+
+ (all of them when
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+force==true
+\end_layout
+
+\end_inset
+
+).
+\end_layout
+
+\begin_layout Standard
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+tm::redoParagraph
+\end_layout
+
+\end_inset
+
+ will call
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+Inset::metrics
+\end_layout
+
+\end_inset
+
+ for each inset.
+ In the case of text insets,
+ this will invoke recursively
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+tm::metrics
+\end_layout
+
+\end_inset
+
+,
+ which redoes all the paragraphs of the inset.
+ Then,
+ a single big row is created in
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+tm::tokenizeParagraph
+\end_layout
+
+\end_inset
+
+,
+ which is later broken in multiple rows by
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+tm::breakParagraph
+\end_layout
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Standard
+If it turns out that the top or bottom margin are incorrect (paragraphs are
too high/low),
+
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+tm::updateMetrics
+\end_layout
+
+\end_inset
+
+ will be called again with fixed values of
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+anchor_ypos_
+\end_layout
+
+\end_inset
+
+ (this does not incur much extra work).
+\end_layout
+
+\begin_layout Standard
+At the end of
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+bv::updateMetrics
+\end_layout
+
+\end_inset
+
+,
+
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+bv::updatePosCache
+\end_layout
+
+\end_inset
+
+ is called.
+ It triggers a repaint of the document with a
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+NullPainter
+\end_layout
+
+\end_inset
+
+ (a painter that does nothing).
+ This has the effect of caching all insets positions.
+\end_layout
+
+\begin_layout Standard
+This way of working means that scrolling can be achieved by basically updating
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+anchor_ypos_
+\end_layout
+
+\end_inset
+
+ and calling
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+bv::processUpdateFlags(Update::ForceDraw)
+\end_layout
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Subsection
+Drawing the work area.
+\end_layout
+
+\begin_layout Standard
+This is done in
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+bv::draw
+\end_layout
+
+\end_inset
+
+.
+ This method is triggered by a paint event,
+ mainly called through
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+Buffer::changed
+\end_layout
+
+\end_inset
+
+,
+ which draws all the work areas that show the given buffer.
+\end_layout
+
+\begin_layout Standard
+Note that,
+ When
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+Buffer::changed
+\end_layout
+
+\end_inset
+
+ is called outside of
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+bv::processUpdateFlags
+\end_layout
+
+\end_inset
+
+,
+ it is not clear whether the update strategy has been set to a reasonable
value beforehand.
+\end_layout
+
+\begin_layout Standard
+The action depends on the update strategy:
+\end_layout
+
+\begin_layout Itemize
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+NoScreenUpdate
+\end_layout
+
+\end_inset
+
+:
+ repaint the whole screen with drawing disabled.
+ This is only needed to update the inset positions.
+ I am not sure when this is necessary,
+ actually.
+ This is triggered when:
+
+\end_layout
+
+\begin_deeper
+\begin_layout Itemize
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+Update::FitCursor
+\end_layout
+
+\end_inset
+
+ is set but the cursor is already visible.
+ It is not clear why something needs to be done in this case,
+ since this should be equivalent to
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+Update::None
+\end_layout
+
+\end_inset
+
+.
+
+\end_layout
+
+\begin_layout Itemize
+this is also set when update flag is
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+Update::None
+\end_layout
+
+\end_inset
+
+,
+ but this value is AFAICS not acted on in the code (meaning that nothing
happens at all in this case).
+\end_layout
+
+\end_deeper
+\begin_layout Itemize
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+FullScreenUpdate
+\end_layout
+
+\end_inset
+
+:
+ repaint the whole screen.
+ This is set when:
+
+\end_layout
+
+\begin_deeper
+\begin_layout Itemize
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+updateMetrics
+\end_layout
+
+\end_inset
+
+ has been invoked.
+
+\end_layout
+
+\begin_layout Itemize
+scroll value of current row has changed (although this should not be
necessary).
+\end_layout
+
+\end_deeper
+\begin_layout Itemize
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+DecorationUpdate
+\end_layout
+
+\end_inset
+
+:
+ actually like
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+FullScreenUpdate
+\end_layout
+
+\end_inset
+
+,
+ although it is intended eventually to only update inset decorations.
+ This triggers when:
+
+\end_layout
+
+\begin_deeper
+\begin_layout Itemize
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+Update::Decoration
+\end_layout
+
+\end_inset
+
+ is set (without
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+Update::Force
+\end_layout
+
+\end_inset
+
+) as flag.
+
+\end_layout
+
+\begin_layout Itemize
+An hovered inset is detected.
+\end_layout
+
+\end_deeper
+\begin_layout Itemize
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+SingleParUpdate
+\end_layout
+
+\end_inset
+
+:
+ only tries to repaint current paragraph in a way that is not yet very clear
to me.
+\end_layout
+
+\begin_layout Standard
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+BufferView::draw
+\end_layout
+
+\end_inset
+
+ can also be called with a null painter from BufferView::updateMetrics().
+
+\end_layout
+
+\begin_layout Section
+Questions / Ideas
+\end_layout
+
+\begin_layout Standard
+These questions are consequences of the description made in the following
section.
+ Some actions are proposed.
+\end_layout
+
+\begin_layout Subsection*
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+SinglePar
+\end_layout
+
+\end_inset
+
+ update
+\end_layout
+
+\begin_layout Standard
+This flag only has an effect in the current
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+BufferView
+\end_layout
+
+\end_inset
+
+,
+ but I think it is useful in other views too.
+ Doing this will require some work on the update pipeline,
+ though.
+\end_layout
+
+\begin_layout Subsection*
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+Buffer::change
+\end_layout
+
+\end_inset
+
+ issues
+\end_layout
+
+\begin_layout Standard
+When calling
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+Buffer::changed
+\end_layout
+
+\end_inset
+
+ outside of
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+bv::processUpdateFlags
+\end_layout
+
+\end_inset
+
+,
+ how do we know that the update strategy is set correctly?
+ It is possible to reset the strategy at the end of
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+bv::draw
+\end_layout
+
+\end_inset
+
+.
+ What would be a good value?
+
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+NoScreenUpdate
+\end_layout
+
+\end_inset
+
+?
+\end_layout
+
+\begin_layout Standard
+On a related note,
+ what is the semantics of a call to
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+Buffer::changed(false)
+\end_layout
+
+\end_inset
+
+?
+ What does the caller mean?
+\end_layout
+
+\begin_layout Subsection*
+How to avoid redraw with
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+FitCursor
+\end_layout
+
+\end_inset
+
+ when the cursor is already OK?
+\end_layout
+
+\begin_layout Standard
+In this case,
+ we invoke
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+Buffer::change(false)
+\end_layout
+
+\end_inset
+
+ with drawing disabled and
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+NoScreenUpdate
+\end_layout
+
+\end_inset
+
+ strategy.
+\end_layout
+
+\begin_layout Standard
+In the draw phase,
+
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+bv::checkCursorScrollOffset
+\end_layout
+
+\end_inset
+
+ (the horizontal scrolling machinery) will change the strategy to
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+FullScreenUpdate
+\end_layout
+
+\end_inset
+
+ if the current row needs further scrolling.
+\end_layout
+
+\begin_layout Standard
+When the update strategy it kept to
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+NoScreenUpdate
+\end_layout
+
+\end_inset
+
+,
+ there is currently a no-draw full repaint,
+ which should not be necessary.
+ It would be possible to avoid that if the call to
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+checkCursorScrollOffset
+\end_layout
+
+\end_inset
+
+ was done in
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+bv::processUpdateFlags
+\end_layout
+
+\end_inset
+
+ instead of
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+bv::draw
+\end_layout
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Standard
+The global idea would be to extend
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+FitCursor
+\end_layout
+
+\end_inset
+
+ to cover also horizontal cursor.
+\end_layout
+
+\begin_layout Section
+TODO:
+ clean-up of drawing code
+\end_layout
+
+\begin_layout Subsection
+Set
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+Row::changed()
+\end_layout
+
+\end_inset
+
+ in a finer way
+\end_layout
+
+\begin_layout Subsubsection*
+singleParUpdate
+\end_layout
+
+\begin_layout Standard
+When the height of the current paragraph changes,
+ there is no need for a full screen update (at top level,
+ at least).
+ Only the rows after the current one need to have their position recomputed.
+\end_layout
+
+\begin_layout Subsubsection*
+redoParagraph
+\end_layout
+
+\begin_layout Standard
+It should be possible to check whether the new row is the same as the old one
and keep its
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+changed()
+\end_layout
+
+\end_inset
+
+ status in this case.
+ This would reduce a lot the amount of stuff to redraw.
+\end_layout
+
+\begin_layout Subsubsection*
+Put labels and friends in the Row as elements
+\end_layout
+
+\begin_layout Standard
+It should not be necessary to access the Paragraph object to draw.
+ Adding the static elements to Row is a lot of work,
+ but worth it IMO.
+\end_layout
+
+\begin_layout Subsubsection*
+When a paragraph ends with a newline,
+ compute correctly the height of the extra row.
+\end_layout
+
+\begin_layout Standard
+It seems that it is not correct (check that)
+\end_layout
+
+\begin_layout Subsubsection*
+Merging
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+bv::updateMetrics
+\end_layout
+
+\end_inset
+
+ and
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+tm::metrics
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+While the full metrics computation tries hard to limit the number of
paragraphs that are rebroken,
+ the version that is used for inner inset does not try any such optimization.
+ This can be very bad for very tall insets.
+ We should re-use the
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+bv::updateMetrics logic
+\end_layout
+
+\end_inset
+
+:
+
+\end_layout
+
+\begin_layout Itemize
+transfer all the logic of
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+bv::updateMetrics
+\end_layout
+
+\end_inset
+
+ to
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+tm
+\end_layout
+
+\end_inset
+
+.
+
+\end_layout
+
+\begin_layout Itemize
+Main
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+InsetText
+\end_layout
+
+\end_inset
+
+ should not be special.
+\end_layout
+
+\begin_layout Standard
+The difficulty for a tall table cell for example,
+ is that it may be necessary to break the whole contents to know the width of
the cell.
+ Also,
+ the anchor is relative to the outer paragraph,
+ which means that for a very long inset it is necessary to rebreak until the
contents that needs to be shown (to compute the heights).
+\end_layout
+
+\begin_layout Standard
+All in all,
+ this is difficult to get right.
+ This is less important now that
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+SinglePar
+\end_layout
+
+\end_inset
+
+ updates work in nested insets.
+\end_layout
+
\begin_layout Chapter
\start_of_appendix
Notes
--
lyx-cvs mailing list
[email protected]
https://lists.lyx.org/mailman/listinfo/lyx-cvs