Introduction
Introduction Statistics Contact Development Disclaimer Help
tFix various issues with selection; fix escape key in normal mode - ledit - Tex…
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 b7dc5c71dceb3a26368fc7d027053378a5828463
parent 7f10c769894b662194bf2fd54bc159647e012bf9
Author: lumidify <[email protected]>
Date: Tue, 2 Nov 2021 11:05:18 +0100
Fix various issues with selection; fix escape key in normal mode
Diffstat:
D .buffer.c.swp | 0
D .keys_basic.c.swp | 0
M buffer.c | 57 ++++++++++++++++++-----------…
M keys_basic.c | 13 +++++++++----
M keys_basic_config.h | 2 +-
5 files changed, 43 insertions(+), 29 deletions(-)
---
diff --git a/.buffer.c.swp b/.buffer.c.swp
Binary files differ.
diff --git a/.keys_basic.c.swp b/.keys_basic.c.swp
Binary files differ.
diff --git a/buffer.c b/buffer.c
t@@ -13,6 +13,7 @@
#include <pango/pangoxft.h>
#include <X11/extensions/Xdbe.h>
+#include "pango-compat.h"
#include "memory.h"
#include "common.h"
#include "txtbuf.h"
t@@ -1608,21 +1609,24 @@ ledit_buffer_set_selection(ledit_buffer *buffer, int l…
ledit_buffer_wipe_line_cursor_attrs(buffer, i);
}
}
- if (l1_new == l2_new) {
- ledit_buffer_set_line_selection(buffer, l1_new, b1_new…
- } else {
- ledit_line *ll1 = ledit_buffer_get_line(buffer, l1_new…
- ledit_buffer_set_line_selection(buffer, l1_new, b1_new…
- ledit_buffer_set_line_selection(buffer, l2_new, 0, b2_…
- /* FIXME: optimize this */
- for (int i = l1_new + 1; i < l2_new; i++) {
- if (i <= buffer->sel.line1 || i >= buffer->sel…
- ledit_line *llx = ledit_buffer_get_lin…
- ledit_buffer_set_line_selection(buffer…
+ if (l1_new >= 0 && l2_new >= 0) {
+ if (l1_new == l2_new) {
+ ledit_buffer_set_line_selection(buffer, l1_new…
+ } else {
+ ledit_line *ll1 = ledit_buffer_get_line(buffer…
+ ledit_buffer_set_line_selection(buffer, l1_new…
+ ledit_buffer_set_line_selection(buffer, l2_new…
+ /* FIXME: optimize this */
+ for (int i = l1_new + 1; i < l2_new; i++) {
+ if (i <= buffer->sel.line1 || i >= buf…
+ ledit_line *llx = ledit_buffer…
+ ledit_buffer_set_line_selectio…
+ }
}
}
+ if (l1_new != l2_new || b1_new != b2_new)
+ copy_selection_to_x_primary(buffer, l1_new, b1…
}
- copy_selection_to_x_primary(buffer, l1_new, b1_new, l2_new, b2…
}
buffer->sel.line1 = line1;
buffer->sel.byte1 = byte1;
t@@ -1643,18 +1647,13 @@ ledit_buffer_button_handler(void *data, XEvent *event)…
int y = event->xbutton.y;
switch (event->type) {
case ButtonPress:
- ledit_xy_to_line_byte(buffer, x, y, 1, &l, &b);
- ledit_buffer_set_selection(buffer, l, b, l, b);
- if (buffer->common->mode == NORMAL) {
- ledit_buffer_wipe_line_cursor_attrs(buffer, buffer->cu…
- /* FIXME: only set mode after dragging/when something …
- /* -> return to old mode afterwards? */
- /* should change_mode_group even be called here? */
- ledit_buffer_set_mode(buffer, VISUAL);
- }
+ ledit_xy_to_line_byte(buffer, x, y, 0, &l, &b);
+ buffer->selecting = 1;
buffer->cur_line = l;
buffer->cur_index = b;
- buffer->selecting = 1;
+ ledit_buffer_set_selection(buffer, -1, -1, -1, -1);
+ if (buffer->common->mode == NORMAL)
+ ledit_buffer_set_line_cursor_attrs(buffer, l, b);
break;
case ButtonRelease:
buffer->selecting = 0;
t@@ -1663,7 +1662,17 @@ ledit_buffer_button_handler(void *data, XEvent *event) {
if (buffer->selecting) {
y = y >= 0 ? y : 0;
ledit_xy_to_line_byte(buffer, x, y, 1, &l, &b);
- ledit_buffer_set_selection(buffer, buffer->sel.line1, …
+ if (buffer->sel.line1 < 0 || buffer->sel.byte1 < 0) {
+ ledit_buffer_set_selection(buffer, l, b, l, b);
+ } else {
+ ledit_buffer_set_selection(buffer, buffer->sel…
+ }
+ if (buffer->common->mode == NORMAL) {
+ ledit_buffer_wipe_line_cursor_attrs(buffer, bu…
+ /* FIXME: return to old mode afterwards? */
+ /* should change_mode_group even be called her…
+ ledit_buffer_set_mode(buffer, VISUAL);
+ }
buffer->cur_line = l;
buffer->cur_index = b;
}
t@@ -1733,7 +1742,7 @@ ledit_buffer_redraw(ledit_buffer *buffer) {
int box_x = strong.x / PANGO_SCALE;
int box_w = 10;
/* determine where the box should be drawn */
- PangoDirection dir = PANGO_DIRECTION_RTL;
+ PangoDirection dir = PANGO_DIRECTION_LTR;
int tmp_index = buffer->cur_index;
if (buffer->cur_index >= cur_line->len)
tmp_index = cur_line->len - 1;
diff --git a/keys_basic.c b/keys_basic.c
t@@ -3,6 +3,10 @@
/* FIXME: use weak cursor */
/* FIXME: spaces at end of soft line are weird in bidi text
-> space is hidden when e.g. ltr text left and rtl text on right is wrapped…
+/* FIXME: some weird things still happen with selections staying as "ghosts"
+ and being deleted at some later time even though they're not shown anymore …
+/* FIXME: there seem to be some issues with undo, but I couldn't reproduce
+ them reliably yet */
#include <stdio.h>
#include <stdlib.h>
t@@ -1164,7 +1168,7 @@ move_cursor_in_line_dir(ledit_buffer *buffer, int moveme…
static void
move_cursor_logically(ledit_buffer *buffer, int movement_dir, int allow_illega…
- PangoDirection dir = PANGO_DIRECTION_RTL;
+ PangoDirection dir = PANGO_DIRECTION_LTR;
int tmp_index = buffer->cur_index;
ledit_line *cur_line = ledit_buffer_get_line(buffer, buffer->cur_line);
if (buffer->cur_index >= cur_line->len)
t@@ -1188,16 +1192,15 @@ static struct action
escape_key(ledit_buffer *buffer, char *text, int len) {
(void)text;
(void)len;
- clear_key_stack(); /* just in case... */
+ clear_key_stack();
if (buffer->common->mode == INSERT)
finalize_repetition_stack();
if (buffer->common->mode == INSERT &&
(buffer->sel.line1 != buffer->sel.line2 ||
buffer->sel.byte1 != buffer->sel.byte2)) {
ledit_buffer_set_mode(buffer, VISUAL);
- } else {
+ } else if (buffer->common->mode != NORMAL) {
ledit_buffer_set_mode(buffer, NORMAL);
- clear_key_stack();
move_cursor_logically(buffer, -1, 0);
if (buffer->sel.line1 != buffer->sel.line2) {
int min = buffer->sel.line1 < buffer->sel.line2 ? buff…
t@@ -1206,6 +1209,8 @@ escape_key(ledit_buffer *buffer, char *text, int len) {
ledit_buffer_wipe_line_cursor_attrs(buffer, i);
}
}
+ buffer->sel.line1 = buffer->sel.line2 = -1;
+ buffer->sel.byte1 = buffer->sel.byte2 = -1;
/* FIXME: optimize this to avoid first wiping and then setting…
ledit_buffer_set_line_cursor_attrs(buffer, buffer->cur_line, b…
}
diff --git a/keys_basic_config.h b/keys_basic_config.h
t@@ -79,7 +79,7 @@ static struct key keys_en[] = {
{NULL, 0, XK_Down, VISUAL|INSERT|NORMAL, KEY_ANY, KEY_ANY, &cursor_dow…
{NULL, 0, XK_Return, INSERT, KEY_ANY, KEY_ANY, &return_key},
{NULL, 0, XK_Delete, INSERT, KEY_ANY, KEY_ANY, &delete_key},
- {NULL, 0, XK_Escape, VISUAL|INSERT, KEY_ANY, KEY_ANY, &escape_key},
+ {NULL, 0, XK_Escape, NORMAL|VISUAL|INSERT, KEY_ANY, KEY_ANY, &escape_k…
{"i", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_ANY, &enter_insert},
{"h", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_MOTION | KEY_NUMBERALLOWED, &…
{"l", 0, 0, NORMAL|VISUAL, KEY_ANY, KEY_MOTION | KEY_NUMBERALLOWED, &…
You are viewing proxied material from lumidify.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.