about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2023-09-15 08:52:39 -0700
committerKartik K. Agaram <vc@akkartik.com>2023-09-15 08:52:39 -0700
commitbafc45b028ad8db3d8be51cf1a09b7f118d75503 (patch)
tree28da99013b98a30b48783e72fc6c57d7db9c1f3f
parent0a12e4c733a2483eef840fb82aec4f4f6ec68b3c (diff)
downloadlines.love-bafc45b028ad8db3d8be51cf1a09b7f118d75503.tar.gz
bugfix: crash when using mouse wheel
All the Text functions assume the cursor is always on a text line. I was
violating that invariant.

* When scrolling up, I start the cursor at the top-most line below the
  screen top.

* When scrolling down, I start the cursor at the top-most line below the
  screen bottom.

  I think it would feel slightly more natural for it to be the
  bottom-most line above the screen bottom.

  However, the Text functions maintain an invariant that the bottom-most
  line in a buffer will be text. There's no such invariant for the
  top-most line.
-rw-r--r--edit.lua2
-rw-r--r--source_edit.lua2
2 files changed, 4 insertions, 0 deletions
diff --git a/edit.lua b/edit.lua
index 1ac2bd1..d30dbdc 100644
--- a/edit.lua
+++ b/edit.lua
@@ -343,11 +343,13 @@ end
 function edit.mouse_wheel_move(State, dx,dy)
   if dy > 0 then
     State.cursor1 = {line=State.screen_top1.line, pos=State.screen_top1.pos}
+    edit.put_cursor_on_next_text_line(State)
     for i=1,math.floor(dy) do
       Text.up(State)
     end
   elseif dy < 0 then
     State.cursor1 = {line=State.screen_bottom1.line, pos=State.screen_bottom1.pos}
+    edit.put_cursor_on_next_text_line(State)
     for i=1,math.floor(-dy) do
       Text.down(State)
     end
diff --git a/source_edit.lua b/source_edit.lua
index f949aa5..6dbf883 100644
--- a/source_edit.lua
+++ b/source_edit.lua
@@ -333,11 +333,13 @@ end
 function edit.mouse_wheel_move(State, dx,dy)
   if dy > 0 then
     State.cursor1 = {line=State.screen_top1.line, pos=State.screen_top1.pos}
+    edit.put_cursor_on_next_text_line(State)
     for i=1,math.floor(dy) do
       Text.up(State)
     end
   elseif dy < 0 then
     State.cursor1 = {line=State.screen_bottom1.line, pos=State.screen_bottom1.pos}
+    edit.put_cursor_on_next_text_line(State)
     for i=1,math.floor(-dy) do
       Text.down(State)
     end