diff --git a/edit.lua b/edit.lua index 107bd96..ae9c161 100644 --- a/edit.lua +++ b/edit.lua @@ -285,7 +285,7 @@ function edit.keychord_press(State, chord, key, readonly) State.cursor1 = State.search_backup.cursor State.screen_top1 = State.search_backup.screen_top State.search_backup = nil - Text.redraw_all(State) -- if we're scrolling, reclaim all fragments to avoid memory leaks + Text.redraw_all(State) -- if we're scrolling, reclaim all line caches to avoid memory leaks elseif chord == 'return' then State.search_term = nil State.search_backup = nil @@ -330,9 +330,7 @@ function edit.keychord_press(State, chord, key, readonly) State.cursor1 = deepcopy(src.cursor) State.selection1 = deepcopy(src.selection) patch(State.lines, event.after, event.before) - patch_placeholders(State.line_cache, event.after, event.before) - -- if we're scrolling, reclaim all fragments to avoid memory leaks - Text.redraw_all(State) + Text.redraw_all(State) -- if we're scrolling, reclaim all line caches to avoid memory leaks schedule_save(State) end elseif not readonly and chord == 'C-y' then @@ -343,8 +341,7 @@ function edit.keychord_press(State, chord, key, readonly) State.cursor1 = deepcopy(src.cursor) State.selection1 = deepcopy(src.selection) patch(State.lines, event.before, event.after) - -- if we're scrolling, reclaim all fragments to avoid memory leaks - Text.redraw_all(State) + Text.redraw_all(State) -- if we're scrolling, reclaim all line caches to avoid memory leaks schedule_save(State) end -- clipboard diff --git a/live.lua b/live.lua index d199045..c4c88dd 100644 --- a/live.lua +++ b/live.lua @@ -386,6 +386,7 @@ function live.handle_error(err) local callstack = debug.traceback('', --[[stack frame]]2) local cleaned_up_error = 'Error: ' .. cleaned_up_frame(tostring(err))..'\n'..cleaned_up_callstack(callstack) live.send_run_time_error_to_driver(cleaned_up_error) + love.graphics.setFont(love.graphics.newFont(20)) Error_message = 'Something is wrong. Sorry!\n\n'..cleaned_up_error..'\n\n'.. "(Note: function names above don't include outer tables. So functions like on.draw might show up as just 'draw', etc.)\n\n".. 'Options:\n'.. diff --git a/main.lua b/main.lua index 3f12142..2714e85 100644 --- a/main.lua +++ b/main.lua @@ -210,20 +210,20 @@ function App.mousefocus(in_focus) if on.mouse_focus then on.mouse_focus(in_focus) end end -function App.touchpressed(x,y, dx,dy, pressure) +function App.touchpressed(id, x,y, dx,dy, pressure) if Mode == 'error' then return end Cursor_time = 0 -- ensure cursor is visible immediately after it moves - if on.touch_press then on.touch_press(x,y, dx,dy, pressure) end + if on.touch_press then on.touch_press(id, x,y, dx,dy, pressure) end end -function App.touchreleased(x,y, dx,dy, pressure) +function App.touchreleased(id, x,y, dx,dy, pressure) if Mode == 'error' then return end Cursor_time = 0 -- ensure cursor is visible immediately after it moves - if on.touch_release then on.touch_release(x,y, dx,dy, pressure) end + if on.touch_release then on.touch_release(id, x,y, dx,dy, pressure) end end -function App.touchmoved(x,y, dx,dy, pressure) - if on.touch_move then on.touch_move(x,y, dx,dy, pressure) end +function App.touchmoved(id, x,y, dx,dy, pressure) + if on.touch_move then on.touch_move(id, x,y, dx,dy, pressure) end end function App.focus(in_focus) diff --git a/text.lua b/text.lua index 9c351ce..40891c3 100644 --- a/text.lua +++ b/text.lua @@ -242,7 +242,7 @@ function Text.keychord_press(State, chord, readonly) line=State.cursor1.line, pos=Text.pos_at_start_of_screen_line(State, State.cursor1), } - Text.redraw_all(State) -- if we're scrolling, reclaim all fragments to avoid memory leaks + Text.redraw_all(State) -- if we're scrolling, reclaim all line caches to avoid memory leaks end Text.refresh_screen_line_cache(State, State.cursor1.line) assert(Text.le1(State.screen_top1, State.cursor1), ('screen_top (line=%d,pos=%d) is below cursor (line=%d,pos=%d)'):format(State.screen_top1.line, State.screen_top1.pos, State.cursor1.line, State.cursor1.pos)) @@ -380,7 +380,7 @@ function Text.pageup(State) State.screen_top1 = Text.previous_screen_top1(State) State.cursor1 = deepcopy(State.screen_top1) Text.move_cursor_down_to_next_text_line_while_scrolling_again_if_necessary(State) - Text.redraw_all(State) -- if we're scrolling, reclaim all fragments to avoid memory leaks + Text.redraw_all(State) -- if we're scrolling, reclaim all line caches to avoid memory leaks end -- return the top y coordinate of a given line_index, @@ -418,7 +418,7 @@ function Text.pagedown(State) State.screen_top1 = Text.screen_bottom1(State) State.cursor1 = deepcopy(State.screen_top1) Text.move_cursor_down_to_next_text_line_while_scrolling_again_if_necessary(State) - Text.redraw_all(State) -- if we're scrolling, reclaim all fragments to avoid memory leaks + Text.redraw_all(State) -- if we're scrolling, reclaim all line caches to avoid memory leaks end -- return the location of the start of the bottom-most line on screen @@ -471,7 +471,7 @@ function Text.up(State) line=State.cursor1.line, pos=Text.pos_at_start_of_screen_line(State, State.cursor1), } - Text.redraw_all(State) -- if we're scrolling, reclaim all fragments to avoid memory leaks + Text.redraw_all(State) -- if we're scrolling, reclaim all line caches to avoid memory leaks end end @@ -600,7 +600,7 @@ function Text.left(State) line=State.cursor1.line, pos=Text.pos_at_start_of_screen_line(State, State.cursor1), } - Text.redraw_all(State) -- if we're scrolling, reclaim all fragments to avoid memory leaks + Text.redraw_all(State) -- if we're scrolling, reclaim all line caches to avoid memory leaks end end @@ -694,7 +694,7 @@ function Text.snap_cursor_to_bottom_of_screen(State) State.screen_top1 = Text.to1(State, top2) --? print('top1 finally:', State.screen_top1.line, State.screen_top1.pos) --? print('snap =>', State.screen_top1.line, State.screen_top1.pos, State.cursor1.line, State.cursor1.pos) - Text.redraw_all(State) -- if we're scrolling, reclaim all fragments to avoid memory leaks + Text.redraw_all(State) -- if we're scrolling, reclaim all line caches to avoid memory leaks end function Text.in_line(State, line_index, x,y) @@ -976,7 +976,7 @@ function Text.cursor_out_of_screen(State) end function Text.redraw_all(State) ---? print('clearing fragments') +--? print('clearing line caches') -- Perform some early sanity checking here, in hopes that we correctly call -- this whenever we change editor state. if State.right <= State.left then diff --git a/undo.lua b/undo.lua index a41ba38..08b867c 100644 --- a/undo.lua +++ b/undo.lua @@ -55,10 +55,8 @@ function snapshot(State, s,e) end_line=e, -- no filename; undo history is cleared when filename changes } - -- deep copy lines without cached stuff like text fragments for i=s,e do - local line = State.lines[i] - table.insert(event.lines, {data=line.data}) -- I've forgotten: should we deepcopy(line.data)? + table.insert(event.lines, deepcopy(State.lines[i])) end return event end @@ -81,17 +79,6 @@ function patch(lines, from, to) end end -function patch_placeholders(line_cache, from, to) - assert(from.start_line == to.start_line, 'failed to patch undo operation') - for i=from.end_line,from.start_line,-1 do - table.remove(line_cache, i) - end - assert(#to.lines == to.end_line-to.start_line+1, 'failed to patch undo operation') - for i=1,#to.lines do - table.insert(line_cache, to.start_line+i-1, {}) - end -end - -- https://stackoverflow.com/questions/640642/how-do-you-copy-a-lua-table-by-value/26367080#26367080 function deepcopy(obj, seen) if type(obj) ~= 'table' then return obj end