Pretty thin; perhaps we should put cursor management in words. But we don't
need every node in the list of words to know which word in the list the
cursor is at.
Fix the jarringness in the previous commit. Gap buffers now always occupy
the same width on screen regardless of where their cursor is. The price:
we sometimes have more whitespace between words. But that is perhaps a
good thing.
Not everything here is tested, but enough that I'm starting to feel confident.
We see our first divergence with apps/tile. In apps/tile we render everything,
then go back and figure out where to position the cursor. This relies on
some low-level smarts and is also quite klunky and complex.
In baremetal/shell I plan to do something simpler: maintain a tree of objects
where each level knows which sub-object under it has the cursor. Now I
can pass in the cursor object to each object, and if it detects that it
has the cursor it can recursively figure out which sub-object has the cursor.
The bottom-most objects (grapheme stacks) draw the cursor as they render
themselves. Single-pass algorithm, draw the cursor as you render, no low-level
smarts needed.
But there's a divergence. What in apps/tile used to look like this, with
a cursor ␣ at the end of the word 'abc':
abc␣def
..now looks like this:
abc␣ def
..with an extra space.
This could cause some jarring 'dancing' as you move the cursor through a
list of words.
When I'm also checking graphemes I assume that spaces can be in other bg
colors. However, if I want to closely check the bg color for a cell with
a space in it (ahem, cursor), I have to check the color in isolation.