commit 593315dc549190dd7ed38194fce885cae741c216
parent 824365813f86fcdc01434477f39a8734183a8b18
Author: lumidify <nobody@lumidify.org>
Date: Wed, 14 Apr 2021 21:04:32 +0200
Somewhat fix up and down cursor movement
Diffstat:
A | IDEAS | | | 2 | ++ |
M | buffer.c | | | 5 | +++-- |
M | ledit.c | | | 103 | ++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------- |
3 files changed, 73 insertions(+), 37 deletions(-)
diff --git a/IDEAS b/IDEAS
@@ -0,0 +1,2 @@
+* allow editing same file in multiple places at same time (like in acme)
+* add different (more basic) text backend
diff --git a/buffer.c b/buffer.c
@@ -144,6 +144,7 @@ init_line(ledit_buffer *buffer, ledit_line *line) {
line->dirty = 1;
/* FIXME: does this set line height reasonably when no text yet? */
pango_layout_get_pixel_size(line->layout, &line->w, &line->h);
+ line->w = buffer->state->w - 10;
line->y_offset = 0;
}
@@ -206,7 +207,7 @@ recalc_single_line_size(ledit_buffer *buffer, int line_index) {
int w, h;
ledit_line *line = &buffer->lines[line_index];
pango_layout_get_pixel_size(line->layout, &w, &h);
- line->w = w;
+ /*line->w = w;*/
/* if height changed, set height of current line
* and adjust offsets of all lines following it */
if (line->h != h) {
@@ -232,7 +233,7 @@ recalc_line_size_absolute(ledit_buffer *buffer) {
buffer->lines[i].y_offset = buffer->total_height;
pango_layout_get_pixel_size(buffer->lines[i].layout, &w, &h);
buffer->total_height += h;
- buffer->lines[i].w = w;
+ /*buffer->lines[i].w = w;*/
buffer->lines[i].h = h;
}
}
diff --git a/ledit.c b/ledit.c
@@ -1,3 +1,4 @@
+/* FIXME: Fix cursor movement, especially buffer->trailing and writing at end of line */
/* FIXME: horizontal scrolling (also need cache to avoid too large pixmaps) */
/* FIXME: sort out types for indices (currently just int, but that might overflow) */
#include <math.h>
@@ -511,7 +512,7 @@ resize_window(int w, int h) {
pango_layout_set_width(line->layout, (w - 10) * PANGO_SCALE);
pango_layout_get_pixel_size(line->layout, &tmp_w, &tmp_h);
line->h = tmp_h;
- line->w = tmp_w;
+ line->w = w - 10;
line->y_offset = buffer->total_height;
line->dirty = 1;
buffer->total_height += tmp_h;
@@ -649,11 +650,23 @@ i_key(void) {
static void
line_down(void) {
- int lineno, x;
+ int lineno, x, trailing = 0;
ledit_line *cur_line = ledit_get_line(buffer, buffer->cur_line);
pango_layout_index_to_line_x(
cur_line->layout, buffer->cur_index, 0, &lineno, &x
);
+ PangoLayoutLine *cur_pango_line =
+ pango_layout_get_line_readonly(cur_line->layout, lineno);
+ if (cur_pango_line->resolved_dir == PANGO_DIRECTION_RTL) {
+ PangoRectangle rect;
+ pango_layout_line_get_extents(cur_pango_line, NULL, &rect);
+ x += (cur_line->w * PANGO_SCALE - rect.width);
+ }
+ if (state.mode == NORMAL) {
+ PangoRectangle pos;
+ pango_layout_index_to_pos(cur_line->layout, buffer->cur_index, &pos);
+ x += pos.width / 2;
+ }
int maxlines = pango_layout_get_line_count(cur_line->layout);
if (lineno == maxlines - 1) {
ledit_wipe_line_cursor_attrs(buffer, buffer->cur_line);
@@ -663,40 +676,57 @@ line_down(void) {
cur_line = ledit_get_line(buffer, buffer->cur_line);
PangoLayoutLine *nextline =
pango_layout_get_line_readonly(cur_line->layout, 0);
- if (pango_layout_line_x_to_index(
- nextline, x, &buffer->cur_index,
- &buffer->trailing) == FALSE) {
- /* set it to *after* the last index of the line */
- buffer->cur_index =
- nextline->start_index + nextline->length;
+ if (nextline->resolved_dir == PANGO_DIRECTION_RTL) {
+ PangoRectangle rect;
+ pango_layout_line_get_extents(nextline, NULL, &rect);
+ x -= (cur_line->w * PANGO_SCALE - rect.width);
}
+ pango_layout_line_x_to_index(
+ nextline, x, &buffer->cur_index, &trailing
+ );
+ if (state.mode == INSERT)
+ buffer->cur_index += trailing;
}
} else {
/* move to the next soft line */
PangoLayoutLine *nextline =
pango_layout_get_line_readonly(cur_line->layout, lineno + 1);
- if (pango_layout_line_x_to_index(
- nextline, x, &buffer->cur_index,
- &buffer->trailing) == FALSE) {
- /* set it to *after* the last index of the line */
- buffer->cur_index =
- nextline->start_index + nextline->length;
+ if (nextline->resolved_dir == PANGO_DIRECTION_RTL) {
+ PangoRectangle rect;
+ pango_layout_line_get_extents(nextline, NULL, &rect);
+ x -= (cur_line->w * PANGO_SCALE - rect.width);
}
+ pango_layout_line_x_to_index(
+ nextline, x, &buffer->cur_index, &trailing
+ );
+ if (state.mode == INSERT)
+ buffer->cur_index += trailing;
}
- if (buffer->cur_index > 0 &&
- state.mode == NORMAL &&
- buffer->cur_index >= cur_line->len)
- cursor_left();
ledit_set_line_cursor_attrs(buffer, buffer->cur_line, buffer->cur_index);
}
static void
line_up(void) {
- int lineno, x;
+ int lineno, x, trailing = 0;
ledit_line *cur_line = ledit_get_line(buffer, buffer->cur_line);
pango_layout_index_to_line_x(
cur_line->layout, buffer->cur_index, 0, &lineno, &x
);
+ PangoLayoutLine *cur_pango_line =
+ pango_layout_get_line_readonly(cur_line->layout, lineno);
+ /* FIXME: do these lines need to be unref'd? */
+ if (cur_pango_line->resolved_dir == PANGO_DIRECTION_RTL) {
+ PangoRectangle rect;
+ pango_layout_line_get_extents(cur_pango_line, NULL, &rect);
+ /* FIXME: don't store w in each line because it is now the same for all */
+ x += (cur_line->w * PANGO_SCALE - rect.width);
+ }
+ if (state.mode == NORMAL) {
+ PangoRectangle pos;
+ pango_layout_index_to_pos(cur_line->layout, buffer->cur_index, &pos);
+ x += pos.width / 2;
+ }
+ /* FIXME: clean this up (if and else are very similar) */
if (lineno == 0) {
ledit_wipe_line_cursor_attrs(buffer, buffer->cur_line);
/* move to the previous hard line */
@@ -706,30 +736,33 @@ line_up(void) {
int maxlines = pango_layout_get_line_count(cur_line->layout);
PangoLayoutLine *prevline =
pango_layout_get_line_readonly(cur_line->layout, maxlines - 1);
- if (pango_layout_line_x_to_index(
- prevline, x, &buffer->cur_index,
- &buffer->trailing) == FALSE) {
- /* set it to *after* the last index of the line */
- buffer->cur_index =
- prevline->start_index + prevline->length;
+ if (prevline->resolved_dir == PANGO_DIRECTION_RTL) {
+ PangoRectangle rect;
+ pango_layout_line_get_extents(prevline, NULL, &rect);
+ x -= (cur_line->w * PANGO_SCALE - rect.width);
}
+ pango_layout_line_x_to_index(
+ prevline, x, &buffer->cur_index, &trailing
+ );
+ /* FIXME: also in visual? */
+ if (state.mode == INSERT)
+ buffer->cur_index += trailing;
}
} else {
/* move to the previous soft line */
PangoLayoutLine *prevline =
pango_layout_get_line_readonly(cur_line->layout, lineno - 1);
- if (pango_layout_line_x_to_index(
- prevline, x, &buffer->cur_index,
- &buffer->trailing) == FALSE) {
- /* set it to *after* the last index of the line */
- buffer->cur_index =
- prevline->start_index + prevline->length;
+ if (prevline->resolved_dir == PANGO_DIRECTION_RTL) {
+ PangoRectangle rect;
+ pango_layout_line_get_extents(prevline, NULL, &rect);
+ x -= (cur_line->w * PANGO_SCALE - rect.width);
}
+ pango_layout_line_x_to_index(
+ prevline, x, &buffer->cur_index, &trailing
+ );
+ if (state.mode == INSERT)
+ buffer->cur_index += trailing;
}
- if (buffer->cur_index > 0 &&
- state.mode == NORMAL &&
- buffer->cur_index >= cur_line->len)
- cursor_left();
ledit_set_line_cursor_attrs(buffer, buffer->cur_line, buffer->cur_index);
}