about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2023-09-16 22:40:46 -0700
committerKartik K. Agaram <vc@akkartik.com>2023-09-16 22:40:46 -0700
commit9241fedf3a098ceea1b4d5e408c59ae31d75be3f (patch)
tree759e8b5a1ce706611f6d67524c29f2c0a78ca07d
parent6e2137c5b6bde9c84e96cd919fce38581558b917 (diff)
downloadlines.love-9241fedf3a098ceea1b4d5e408c59ae31d75be3f.tar.gz
port an old fix to source editor
-rw-r--r--source_edit.lua12
1 files changed, 11 insertions, 1 deletions
diff --git a/source_edit.lua b/source_edit.lua
index 5c77758..d2cd7d9 100644
--- a/source_edit.lua
+++ b/source_edit.lua
@@ -111,7 +111,7 @@ function edit.check_locs(State)
   -- if State is inconsistent (i.e. file changed by some other program),
   --   throw away all cursor state entirely
   if edit.invalid1(State, State.screen_top1)
-      or edit.invalid1(State, State.cursor1)
+      or edit.invalid_cursor1(State)
       or not edit.cursor_on_text(State)
       or not Text.le1(State.screen_top1, State.cursor1) then
     State.screen_top1 = {line=1, pos=1}
@@ -127,6 +127,16 @@ function edit.invalid1(State, loc1)
   return loc1.pos > #State.lines[loc1.line].data
 end
 
+-- cursor loc in particular differs from other locs in one way:
+-- pos might occur just after end of line
+function edit.invalid_cursor1(State)
+  local cursor1 = State.cursor1
+  if cursor1.line > #State.lines then return true end
+  local l = State.lines[cursor1.line]
+  if l.mode ~= 'text' then return false end  -- pos is irrelevant to validity for a drawing line
+  return cursor1.pos > #State.lines[cursor1.line].data + 1
+end
+
 function edit.cursor_on_text(State)
   return State.cursor1.line <= #State.lines
       and State.lines[State.cursor1.line].mode == 'text'