Introduction
Introduction Statistics Contact Development Disclaimer Help
tImplement Ctrl-u and Ctrl-d - 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 1055b60d3977134356fbeb8f0d1abfff4d05f3f9
parent 00de6deacf3f962dbf3b3d89926fe69798ad2893
Author: lumidify <[email protected]>
Date: Mon, 1 Nov 2021 09:37:26 +0100
Implement Ctrl-u and Ctrl-d
Diffstat:
M keys_basic.c | 72 ++++++++++++++++++++++++++++-…
M keys_basic_config.h | 4 ++++
2 files changed, 70 insertions(+), 6 deletions(-)
---
diff --git a/keys_basic.c b/keys_basic.c
t@@ -26,7 +26,8 @@
#include "keys_basic_config.h"
/* this is supposed to be global for all buffers */
-txtbuf *paste_buffer = NULL;
+static txtbuf *paste_buffer = NULL;
+static int last_lines_scrolled = -1;
struct repetition_stack_elem {
char *key_text;
t@@ -347,7 +348,10 @@ delete_selection(ledit_buffer *buffer) {
invalid was on the stack - this is for commands that just take a repeat
count and nothing else (cursor movement keys are different because they
can use other elements on the key stack too, for instance call a callback
- as is done for deletion */
+ as is done for deletion
+ Note that an empty stack leads to 0 being returned even though most commands
+ use 1 as repeat then so the caller can distinguish between empty stack and
+ a repetition count of 1 */
static int
get_key_repeat(void) {
int num = 1;
t@@ -363,12 +367,68 @@ get_key_repeat(void) {
element under it on the stack -> error */
num = -1;
}
+ } else {
+ num = 0;
}
clear_key_stack();
return num;
}
static void
+scroll_lines(ledit_buffer *buffer, int lines, int dir) {
+ int final_lines;
+ int text_w, text_h;
+ PangoRectangle strong, weak;
+ ledit_line *ll = ledit_buffer_get_line(buffer, buffer->cur_line);
+ pango_layout_get_cursor_pos(ll->layout, buffer->cur_index, &strong, &w…
+ long abs_pos = ll->y_offset + strong.y / PANGO_SCALE;
+ ledit_window_get_textview_size(buffer->window, &text_w, &text_h);
+ if (lines > 0)
+ final_lines = last_lines_scrolled = lines;
+ else if (last_lines_scrolled > 0)
+ final_lines = last_lines_scrolled;
+ else
+ final_lines = text_h / (strong.height / PANGO_SCALE);
+ ledit_buffer_wipe_line_cursor_attrs(buffer, buffer->cur_line);
+ get_new_line_softline(
+ buffer, buffer->cur_line, buffer->cur_index,
+ dir < 0 ? -final_lines : final_lines,
+ &buffer->cur_line, &buffer->cur_index
+ );
+ ll = ledit_buffer_get_line(buffer, buffer->cur_line);
+ pango_layout_get_cursor_pos(ll->layout, buffer->cur_index, &strong, &w…
+ long new_abs_pos = ll->y_offset + strong.y / PANGO_SCALE;
+ ledit_buffer_scroll(buffer, buffer->display_offset + (new_abs_pos - ab…
+ ledit_buffer_set_line_cursor_attrs(buffer, buffer->cur_line, buffer->c…
+}
+
+static struct action
+scroll_lines_up(ledit_buffer *buffer, char *text, int len) {
+ (void)text;
+ (void)len;
+ int repeat = get_key_repeat();
+ if (repeat >= 0)
+ scroll_lines(buffer, repeat, -1);
+ else
+ ledit_window_show_message(buffer->window, "Invalid key", -1);
+ discard_repetition_stack();
+ return (struct action){ACTION_NONE, NULL};
+}
+
+static struct action
+scroll_lines_down(ledit_buffer *buffer, char *text, int len) {
+ (void)text;
+ (void)len;
+ int repeat = get_key_repeat();
+ if (repeat >= 0)
+ scroll_lines(buffer, repeat, 1);
+ else
+ ledit_window_show_message(buffer->window, "Invalid key", -1);
+ discard_repetition_stack();
+ return (struct action){ACTION_NONE, NULL};
+}
+
+static void
scroll_with_cursor(ledit_buffer *buffer, int movement) {
PangoRectangle strong, weak;
ledit_line *ll = ledit_buffer_get_line(buffer, buffer->cur_line);
t@@ -404,7 +464,7 @@ scroll_with_cursor_up(ledit_buffer *buffer, char *text, in…
(void)len;
int repeat = get_key_repeat();
if (repeat >= 0)
- scroll_with_cursor(buffer, -repeat);
+ scroll_with_cursor(buffer, -(repeat == 0 ? 1 : repeat));
else
ledit_window_show_message(buffer->window, "Invalid key", -1);
discard_repetition_stack();
t@@ -417,7 +477,7 @@ scroll_with_cursor_down(ledit_buffer *buffer, char *text, …
(void)len;
int repeat = get_key_repeat();
if (repeat >= 0)
- scroll_with_cursor(buffer, repeat);
+ scroll_with_cursor(buffer, repeat == 0 ? 1 : repeat);
else
ledit_window_show_message(buffer->window, "Invalid key", -1);
discard_repetition_stack();
t@@ -463,7 +523,7 @@ screen_up(ledit_buffer *buffer, char *text, int len) {
(void)len;
int repeat = get_key_repeat();
if (repeat >= 0)
- move_screen(buffer, -repeat);
+ move_screen(buffer, -(repeat == 0 ? 1 : repeat));
else
ledit_window_show_message(buffer->window, "Invalid key", -1);
discard_repetition_stack();
t@@ -476,7 +536,7 @@ screen_down(ledit_buffer *buffer, char *text, int len) {
(void)len;
int repeat = get_key_repeat();
if (repeat >= 0)
- move_screen(buffer, repeat);
+ move_screen(buffer, repeat == 0 ? 1 : repeat);
else
ledit_window_show_message(buffer->window, "Invalid key", -1);
discard_repetition_stack();
diff --git a/keys_basic_config.h b/keys_basic_config.h
t@@ -61,6 +61,8 @@ static struct action screen_up(ledit_buffer *buffer, char *t…
static struct action screen_down(ledit_buffer *buffer, char *text, int len);
static struct action scroll_with_cursor_up(ledit_buffer *buffer, char *text, i…
static struct action scroll_with_cursor_down(ledit_buffer *buffer, char *text,…
+static struct action scroll_lines_up(ledit_buffer *buffer, char *text, int len…
+static struct action scroll_lines_down(ledit_buffer *buffer, char *text, int l…
/* FIXME: maybe sort these and use binary search
-> but that would mess with the catch-all keys */
t@@ -110,6 +112,8 @@ static struct key keys_en[] = {
{"f", ControlMask, 0, NORMAL, KEY_ANY, KEY_NUMBERALLOWED, &screen_dow…
{"e", ControlMask, 0, NORMAL, KEY_ANY, KEY_NUMBERALLOWED, &scroll_wit…
{"y", ControlMask, 0, NORMAL, KEY_ANY, KEY_NUMBERALLOWED, &scroll_wit…
+ {"d", ControlMask, 0, NORMAL, KEY_ANY, KEY_NUMBERALLOWED, &scroll_lin…
+ {"u", ControlMask, 0, NORMAL, KEY_ANY, KEY_NUMBERALLOWED, &scroll_lin…
{"", 0, 0, INSERT, KEY_ANY, KEY_ANY, &insert_mode_insert_text}
};
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.