ledit

Text editor (WIP)
git clone git://lumidify.org/ledit.git (fast, but not encrypted)
git clone https://lumidify.org/git/ledit.git (encrypted, but very slow)
Log | Files | Refs | README | LICENSE

commit 7a93ac1c6f53c9464eb548bef555f22da0d9bbac
parent 9c2c62d13afcfb127994530a319c80897429f662
Author: lumidify <nobody@lumidify.org>
Date:   Sat, 23 Sep 2023 10:51:54 +0200

Fix crash; modify config slightly

Diffstat:
Mleditrc.example | 2+-
Mview.c | 33++++++++++++++++++++-------------
2 files changed, 21 insertions(+), 14 deletions(-)

diff --git a/leditrc.example b/leditrc.example @@ -24,7 +24,7 @@ theme = { bindings = { language = "English (US)" basic-keys = { - bind delete-chars-backwards-multiline keysym backspace modes insert + bind delete-chars-backwards-multiline keysym backspace modes insert mods any bind cursor-left keysym left modes visual|insert|normal bind cursor-right keysym right modes visual|insert|normal bind cursor-up keysym up modes visual|insert|normal diff --git a/view.c b/view.c @@ -255,12 +255,15 @@ view_notify_append_line(ledit_view *view, size_t line) { void view_notify_delete_lines(ledit_view *view, size_t index1, size_t index2) { + /* FIXME: this is needed to avoid some bugs, but maybe check if it breaks anything */ + int sel_valid = view->sel_valid; + view_wipe_selection(view); if (index2 < view->cur_line) { view->cur_line -= index2 - index1 + 1; } else if (index1 <= view->cur_line) { /* FIXME: set cur_index properly */ if (index2 < view->lines_num - 1) { - view->cur_line = index2 + 1; + view->cur_line = index1; view->cur_index = 0; } else if (index1 > 0) { view->cur_line = index1 - 1; @@ -274,7 +277,7 @@ view_notify_delete_lines(ledit_view *view, size_t index1, size_t index2) { if (vl->cursor_index_valid) view_set_line_cursor_attrs(view, view->cur_line, view->cur_index); } - if (view->sel_valid) + if (sel_valid) view_set_selection(view, view->cur_line, view->cur_index, view->cur_line, view->cur_index); cache_invalidate_from_line( view->cache, index1, view, @@ -1773,21 +1776,25 @@ view_set_selection(ledit_view *view, size_t line1, size_t byte1, size_t line2, s sort_range(&l1_new, &b1_new, &l2_new, &b2_new); sort_range(&view->sel.line1, &view->sel.byte1, &view->sel.line2, &view->sel.byte2); /* FIXME: make this a bit nicer and optimize it */ - if (view->sel.line1 > l2_new || view->sel.line2 < l1_new) { - for (size_t i = view->sel.line1; i <= view->sel.line2; i++) { - view_wipe_line_cursor_attrs(view, i); - } - } else { - for (size_t i = view->sel.line1; i < l1_new; i++) { - view_wipe_line_cursor_attrs(view, i); - } - for (size_t i = view->sel.line2; i > l2_new; i--) { - view_wipe_line_cursor_attrs(view, i); + /* FIXME: always reset view->sel so bugs like this can't happen where + a function forgets to check sel_valid */ + if (view->sel_valid) { + if (view->sel.line1 > l2_new || view->sel.line2 < l1_new) { + for (size_t i = view->sel.line1; i <= view->sel.line2; i++) { + view_wipe_line_cursor_attrs(view, i); + } + } else { + for (size_t i = view->sel.line1; i < l1_new; i++) { + view_wipe_line_cursor_attrs(view, i); + } + for (size_t i = view->sel.line2; i > l2_new; i--) { + view_wipe_line_cursor_attrs(view, i); + } } } for (size_t i = l1_new; i <= l2_new; i++) { /* only change the ones that were not already selected */ - if (i <= view->sel.line1 || i >= view->sel.line2) { + if (!view->sel_valid || i <= view->sel.line1 || i >= view->sel.line2) { ledit_view_line *vl = view_get_line(view, i); vl->highlight_dirty = 1; }