ltkx

GUI toolkit for X11 (WIP)
git clone git://lumidify.org/ltkx.git
Log | Files | Refs | README | LICENSE

commit 77153a68ac84bb58a6b1ce8328e279453c70eebe
parent aed6b7ca52af0f276ca91bcf4d156469baf999d7
Author: lumidify <nobody@lumidify.org>
Date:   Tue, 19 May 2020 21:44:44 +0200

Slightly fix position to index mapping (no, this still doesn't work very well)

Diffstat:
Mtext_buffer.c | 34+++++++++++++++++++---------------
Mtext_buffer.h | 2+-
Mtext_edit.c | 4++--
3 files changed, 22 insertions(+), 18 deletions(-)

diff --git a/text_buffer.c b/text_buffer.c @@ -313,12 +313,12 @@ ltk_render_text_line_new( } uint32_t -ltk_soft_line_get_index_from_pos(int x, struct ltk_soft_line *sl, hb_direction_t dir, int *found_pos) { +ltk_soft_line_get_index_from_pos(int x, struct ltk_text_line *tl, struct ltk_soft_line *sl, int *found_pos) { /* FIXME: need par dir! for better guess! */ /* also need it to determine if insert should be before or after char */ /* FIXME: should I be messing around with casting between uint32_t and size_t? */ /* FIXME: handle negative x */ - uint32_t guess = (int)(((double)x / sl->w) * (sl->len - 1)); + int guess = (int)(((double)x / sl->w) * (sl->len - 1)); guess = guess >= sl->len ? sl->len - 1 : guess; int delta = 0; int i = 0; @@ -336,22 +336,26 @@ ltk_soft_line_get_index_from_pos(int x, struct ltk_soft_line *sl, hb_direction_t i = guess - 1; last_dist = abs(sl->glyph_pos->buf[guess - 1] - x); } + int final_index; if (delta == 0) { - if (found_pos) - found_pos = sl->glyph_pos->buf[guess]; - return guess; - } - int new_dist; - for (; i >= 0 && i < sl->len; i += delta) { - new_dist = abs(sl->glyph_pos->buf[i] - x); - if (last_dist < new_dist) - break; - last_dist = new_dist; + final_index = guess; + } else { + int new_dist; + for (; i >= 0 && i < sl->len; i += delta) { + new_dist = abs(sl->glyph_pos->buf[i] - x); + if (last_dist < new_dist) + break; + last_dist = new_dist; + } + final_index = i - delta; } - i -= delta; if (found_pos) - *found_pos = sl->glyph_pos->buf[i]; - return sl->glyph_clusters->buf[i]; + *found_pos = sl->glyph_pos->buf[final_index]; + uint32_t cluster = sl->glyph_clusters->buf[final_index]; + if (FRIBIDI_LEVEL_IS_RTL(tl->bidi_levels->buf[cluster])) + return cluster >= tl->log_buf->len - 1 ? tl->log_buf->len - 1 : cluster + 1; + else + return cluster; } /* Begin stuff stolen from raqm */ diff --git a/text_buffer.h b/text_buffer.h @@ -100,7 +100,7 @@ struct ltk_text_buffer { void ltk_soft_line_destroy(struct ltk_soft_line *sl); struct ltk_array_line *ltk_render_text_line_new(struct ltk_text_line *tl, int max_width, Display *dpy, Window window, GC gc, Colormap colormap, XColor fg, XColor bg); -uint32_t ltk_soft_line_get_index_from_pos(int x, struct ltk_soft_line *sl, hb_direction_t dir, int *found_pos); +uint32_t ltk_soft_line_get_index_from_pos(int x, struct ltk_text_line *tl, struct ltk_soft_line *sl, int *found_pos); void ltk_text_line_insert_text(struct ltk_text_line *tl, uint32_t *text, size_t len); struct ltk_text_line *ltk_text_line_create(void); void ltk_text_line_destroy(struct ltk_text_line *tl); diff --git a/text_edit.c b/text_edit.c @@ -62,14 +62,14 @@ void ltk_text_edit_tmp(LtkTextEdit *te, XEvent event) { /* this should never be negative, but just to be sure... */ int local_y = abs(event.xbutton.y - te->widget.rect.y); - int i = ((double)local_y / te->tl->h) * te->soft_lines->len; + int i = ((double)local_y / (te->tl->h * te->soft_lines->len)) * te->soft_lines->len; i = i >= te->soft_lines->len ? te->soft_lines->len - 1 : i; int x = event.xbutton.x - te->widget.rect.x; if (te->tl->dir == HB_DIRECTION_RTL) x -= (te->widget.rect.w - te->soft_lines->buf[i]->img->width); int found_pos = 0; te->cursor = ltk_soft_line_get_index_from_pos( - x, te->soft_lines->buf[i], te->tl->dir, &found_pos); + x, te->tl, te->soft_lines->buf[i], &found_pos); } LtkTextEdit *