URI:
       tFix positioning of cursor after deleting characters - ledit - Text editor (WIP)
  HTML git clone git://lumidify.org/ledit.git (fast, but not encrypted)
  HTML git clone https://lumidify.org/git/ledit.git (encrypted, but very slow)
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit b4ed6ddf9920d90814860156ed32a40404ece243
   DIR parent 3895a14f2fb3bcc35ba842e259074a67adddb8a1
  HTML Author: lumidify <nobody@lumidify.org>
       Date:   Fri, 14 May 2021 21:22:31 +0200
       
       Fix positioning of cursor after deleting characters
       
       Diffstat:
         M buffer.c                            |      28 +++++++++++++++++++---------
       
       1 file changed, 19 insertions(+), 9 deletions(-)
       ---
   DIR diff --git a/buffer.c b/buffer.c
       t@@ -494,15 +494,6 @@ ledit_delete_range(
                                }
                                delete_line_section(buffer, line_index1, b1, b2 - b1);
                                *new_line_ret = line_index1;
       -                        ledit_line *ll = ledit_get_line(buffer, line_index1);
       -                        /* FIXME: where should this be done? */
       -                        /* FIXME: also do this below in the else statement */
       -                        if (buffer->state->mode == NORMAL && b1 == ll->len && b1 > 0) {
       -                                /* FIXME: use grapheme instead of character! */
       -                                b1 = ll->len - 1;
       -                                while (b1 > 0 && ((ll->text[b1] & 0xC0) == 0x80))
       -                                        b1--;
       -                        }
                                *new_byte_ret = b1;
                        } else {
                                int l1, l2, b1, b2;
       t@@ -531,5 +522,24 @@ ledit_delete_range(
                                *new_byte_ret = b1;
                                ledit_delete_line_entries(buffer, l1 + 1, l2);
                        }
       +                /* move back one grapheme if at end of line and in normal mode */
       +                ledit_line *final_line = ledit_get_line(buffer, *new_line_ret);
       +                if (buffer->state->mode == NORMAL &&
       +                    *new_byte_ret == final_line->len &&
       +                    *new_byte_ret > 0) {
       +                        int nattrs;
       +                        const PangoLogAttr *attrs =
       +                            pango_layout_get_log_attrs_readonly(final_line->layout, &nattrs);
       +                        int cur = nattrs - 2;
       +                        (*new_byte_ret)--;
       +                        while (*new_byte_ret > 0 && ((final_line->text[*new_byte_ret] & 0xC0) == 0x80))
       +                                (*new_byte_ret)--;
       +                        while (*new_byte_ret > 0 && cur > 0 && !attrs[cur].is_cursor_position) {
       +                                cur--;
       +                                (*new_byte_ret)--;
       +                                while (*new_byte_ret > 0 && ((final_line->text[*new_byte_ret] & 0xC0) == 0x80))
       +                                        (*new_byte_ret)--;
       +                        }
       +                }
                }
        }