tSomewhat fix up and down cursor movement - 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 593315dc549190dd7ed38194fce885cae741c216 | |
parent 824365813f86fcdc01434477f39a8734183a8b18 | |
Author: lumidify <[email protected]> | |
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 | |
t@@ -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 | |
t@@ -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; | |
} | |
t@@ -206,7 +207,7 @@ recalc_single_line_size(ledit_buffer *buffer, int line_ind… | |
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) { | |
t@@ -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 | |
t@@ -1,3 +1,4 @@ | |
+/* FIXME: Fix cursor movement, especially buffer->trailing and writing at end … | |
/* FIXME: horizontal scrolling (also need cache to avoid too large pixmaps) */ | |
/* FIXME: sort out types for indices (currently just int, but that might overf… | |
#include <math.h> | |
t@@ -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; | |
t@@ -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,… | |
+ 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); | |
t@@ -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 lin… | |
- buffer->cur_index = | |
- nextline->start_index + nextline->length; | |
+ if (nextline->resolved_dir == PANGO_DIRECTION_RTL) { | |
+ PangoRectangle rect; | |
+ pango_layout_line_get_extents(nextline, NULL, … | |
+ 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 + … | |
- 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_inde… | |
} | |
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 sam… | |
+ 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,… | |
+ 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 */ | |
t@@ -706,30 +736,33 @@ line_up(void) { | |
int maxlines = pango_layout_get_line_count(cur_line->l… | |
PangoLayoutLine *prevline = | |
pango_layout_get_line_readonly(cur_line->layout, m… | |
- if (pango_layout_line_x_to_index( | |
- prevline, x, &buffer->cur_index, | |
- &buffer->trailing) == FALSE) { | |
- /* set it to *after* the last index of the lin… | |
- buffer->cur_index = | |
- prevline->start_index + prevline->length; | |
+ if (prevline->resolved_dir == PANGO_DIRECTION_RTL) { | |
+ PangoRectangle rect; | |
+ pango_layout_line_get_extents(prevline, NULL, … | |
+ 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 - … | |
- 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_inde… | |
} | |