ipreliminary support for undo - gramscii - A simple editor for ASCII box-and-arrow charts Err bitreich.org 70 1Log /scm/gramscii/log.gph bitreich.org 70 1Files /scm/gramscii/files.gph bitreich.org 70 1Refs /scm/gramscii/refs.gph bitreich.org 70 1Tags /scm/gramscii/tag bitreich.org 70 1README /scm/gramscii/file/README.md.gph bitreich.org 70 1LICENSE /scm/gramscii/file/COPYING.gph bitreich.org 70 i--- Err bitreich.org 70 1commit 526ce3a130732d4a2374a6e36a689d9e0cf5cc34 /scm/gramscii/commit/526ce3a130732d4a2374a6e36a689d9e0cf5cc34.gph bitreich.org 70 1parent 6da2f3f89afda08eeba385da1c36414154113d47 /scm/gramscii/commit/6da2f3f89afda08eeba385da1c36414154113d47.gph bitreich.org 70 hAuthor: KatolaZ URL:mailto:katolaz@freaknet.org bitreich.org 70 iDate: Wed, 31 Jul 2019 00:10:35 +0100 Err bitreich.org 70 i Err bitreich.org 70 ipreliminary support for undo Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M TODO | 2 +- Err bitreich.org 70 i M draw.c | 55 ++++++++++++++++++++++++++++--- Err bitreich.org 70 i M gramscii.h | 13 ++++++++++++- Err bitreich.org 70 i M lineset.c | 43 ++++++++++++++++++++++++++++++ Err bitreich.org 70 i M main.c | 6 ++++++ Err bitreich.org 70 i M screen.c | 4 ++++ Err bitreich.org 70 i Err bitreich.org 70 i6 files changed, 117 insertions(+), 6 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/TODO b/TODO /scm/gramscii/file/TODO.gph bitreich.org 70 i@@ -1,4 +1,5 @@ Err bitreich.org 70 i + optimize redraws (redraw only the modified rectangle) Err bitreich.org 70 i++ undo (by storing lines changed across insert/remove operations) Err bitreich.org 70 i - fix bug with 'g' commands in arrow mode Err bitreich.org 70 i - add screen geometry option (-g 25x80?) Err bitreich.org 70 i - read file at point Err bitreich.org 70 i@@ -18,7 +19,6 @@ Err bitreich.org 70 i * yank Err bitreich.org 70 i * fill Err bitreich.org 70 i * cut Err bitreich.org 70 i-- undo (by storing lines changed across insert/remove operations) Err bitreich.org 70 i - manage special chars (DEL/CANC) during text insert Err bitreich.org 70 i (also do not print unmanaged chars!) Err bitreich.org 70 i - allow scrolling (both vertical and horizontal) Err bitreich.org 70 1diff --git a/draw.c b/draw.c /scm/gramscii/file/draw.c.gph bitreich.org 70 i@@ -1,4 +1,5 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i+#include Err bitreich.org 70 i Err bitreich.org 70 i #include "gramscii.h" Err bitreich.org 70 i #include "config.h" Err bitreich.org 70 i@@ -103,16 +104,19 @@ void draw_box(int x1, int y1, int fix){ Err bitreich.org 70 i int i; Err bitreich.org 70 i void (*f)(int, int, char); Err bitreich.org 70 i Err bitreich.org 70 i- if (fix == FIX) Err bitreich.org 70 i- f = set_xy; Err bitreich.org 70 i- else Err bitreich.org 70 i- f = draw_xy; Err bitreich.org 70 i Err bitreich.org 70 i xmin = MIN(x, x1); Err bitreich.org 70 i xmax = MAX(x, x1); Err bitreich.org 70 i ymin = MIN(y, y1); Err bitreich.org 70 i ymax = MAX(y, y1); Err bitreich.org 70 i Err bitreich.org 70 i+ if (fix == FIX){ Err bitreich.org 70 i+ f = set_xy; Err bitreich.org 70 i+ copy_lines_to_ring(ymin, ymax, CUR); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ else Err bitreich.org 70 i+ f = draw_xy; Err bitreich.org 70 i+ Err bitreich.org 70 i for(i=xmin+1; i<=xmax; i++){ Err bitreich.org 70 i f(i, ymin, line_h); Err bitreich.org 70 i f(i, ymax, line_h); Err bitreich.org 70 i@@ -125,6 +129,8 @@ void draw_box(int x1, int y1, int fix){ Err bitreich.org 70 i f(xmin, ymax, corner); Err bitreich.org 70 i f(xmax, ymin, corner); Err bitreich.org 70 i f(xmax, ymax, corner); Err bitreich.org 70 i+ if (fix == FIX) Err bitreich.org 70 i+ copy_lines_to_ring(ymin, ymax, LST); Err bitreich.org 70 i show_cursor(); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -157,6 +163,7 @@ update_box: Err bitreich.org 70 i Err bitreich.org 70 i void draw_arrow(int x, int y, char *a, int a_len, int fix){ Err bitreich.org 70 i Err bitreich.org 70 i+ /* FIXME: copy affected lines to undo */ Err bitreich.org 70 i int i, j, cur_dir; Err bitreich.org 70 i char line; Err bitreich.org 70 i void (*f)(int, int, char); Err bitreich.org 70 i@@ -266,6 +273,7 @@ void do_erase(int x1, int y1){ Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i void erase(FILE *fc){ Err bitreich.org 70 i+ /*FIXME: add affected lines to undo */ Err bitreich.org 70 i char c; Err bitreich.org 70 i int orig_x = x, orig_y = y; Err bitreich.org 70 i status_bar(); Err bitreich.org 70 i@@ -308,8 +316,11 @@ void visual_box(FILE *fc){ Err bitreich.org 70 i case 'x':/* erase */ Err bitreich.org 70 i if (c == 'x') Err bitreich.org 70 i yank_region(MIN(orig_x,x), MIN(orig_y,y), MAX(orig_x, x), MAX(orig_y, y)); Err bitreich.org 70 i+ copy_lines_to_ring(MIN(orig_y, y), MAX(orig_y, y), CUR); Err bitreich.org 70 i erase_box(orig_x, orig_y, f); Err bitreich.org 70 i erase_blank_lines(MIN(y,orig_y), MAX(y, orig_y)); Err bitreich.org 70 i+ copy_lines_to_ring(MIN(orig_y, y), MAX(orig_y, y), LST); Err bitreich.org 70 i+ Err bitreich.org 70 i modified = 1; Err bitreich.org 70 i goto vis_exit; Err bitreich.org 70 i break; Err bitreich.org 70 i@@ -331,6 +342,42 @@ vis_exit: Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void paste(){ Err bitreich.org 70 i+ int y2; Err bitreich.org 70 i+ Err bitreich.org 70 i+ y2 = y + cutbuf.num - 1; Err bitreich.org 70 i+ copy_lines_to_ring(y, y2, CUR); Err bitreich.org 70 i paste_region(x, y); Err bitreich.org 70 i+ copy_lines_to_ring(y, y2, LST); Err bitreich.org 70 i+ redraw(); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void put_lines(lineset_t *u){ Err bitreich.org 70 i+ int i, n; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (i=0; i< u->num; i++){ Err bitreich.org 70 i+ n = u->l[i].n; Err bitreich.org 70 i+ ensure_line_length(&(screen.l[i]), u->l[i].lst); Err bitreich.org 70 i+ strcpy(screen.l[n].s, u->l[i].s); Err bitreich.org 70 i+ screen.l[n].lst = u->l[i].lst; Err bitreich.org 70 i+ } Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+ Err bitreich.org 70 i+void undo_change(){ Err bitreich.org 70 i+ if (undo_cur >= 0){ Err bitreich.org 70 i+ put_lines(& (undo[undo_cur])); Err bitreich.org 70 i+ undo_cur --; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ redraw(); Err bitreich.org 70 i+ modified = 1; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void redo_change(){ Err bitreich.org 70 i+ if (undo_cur < undo_lst){ Err bitreich.org 70 i+ undo_cur ++; Err bitreich.org 70 i+ put_lines(& (undo[undo_cur])); Err bitreich.org 70 i+ } Err bitreich.org 70 i redraw(); Err bitreich.org 70 i+ modified = 1; Err bitreich.org 70 i } Err bitreich.org 70 i+ Err bitreich.org 70 1diff --git a/gramscii.h b/gramscii.h /scm/gramscii/file/gramscii.h.gph bitreich.org 70 i@@ -44,6 +44,9 @@ Err bitreich.org 70 i #define VIDEO_NRM 0 Err bitreich.org 70 i #define VIDEO_REV 7 Err bitreich.org 70 i Err bitreich.org 70 i+#define CUR 0x01 Err bitreich.org 70 i+#define LST 0x02 Err bitreich.org 70 i+ Err bitreich.org 70 i /** types **/ Err bitreich.org 70 i Err bitreich.org 70 i typedef struct{ Err bitreich.org 70 i@@ -59,6 +62,7 @@ typedef struct{ Err bitreich.org 70 i line_t *l; Err bitreich.org 70 i } lineset_t; Err bitreich.org 70 i Err bitreich.org 70 i+ Err bitreich.org 70 i /** MACROS **/ Err bitreich.org 70 i Err bitreich.org 70 i #define MIN(x,y) (x) < (y) ? (x) : (y) Err bitreich.org 70 i@@ -73,6 +77,11 @@ typedef struct{ Err bitreich.org 70 i Err bitreich.org 70 i lineset_t screen; Err bitreich.org 70 i lineset_t cutbuf; Err bitreich.org 70 i+lineset_t *undo; Err bitreich.org 70 i+ Err bitreich.org 70 i+int undo_sz; Err bitreich.org 70 i+int undo_cur; Err bitreich.org 70 i+int undo_lst; Err bitreich.org 70 i Err bitreich.org 70 i int WIDTH, HEIGHT; Err bitreich.org 70 i Err bitreich.org 70 i@@ -155,6 +164,8 @@ void ensure_line_length(line_t *l, int len); Err bitreich.org 70 i void ensure_num_lines(lineset_t *ls, int n); Err bitreich.org 70 i void yank_region(int x1, int y1, int x2, int y2); Err bitreich.org 70 i void paste_region(int x1, int y1); Err bitreich.org 70 i- Err bitreich.org 70 i+void copy_lines_to_ring(int y1, int y2, int which); Err bitreich.org 70 i+void undo_change(); Err bitreich.org 70 i+void redo_change(); Err bitreich.org 70 i Err bitreich.org 70 i #endif Err bitreich.org 70 1diff --git a/lineset.c b/lineset.c /scm/gramscii/file/lineset.c.gph bitreich.org 70 i@@ -58,6 +58,7 @@ void ensure_num_lines(lineset_t *ls, int n){ Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+ Err bitreich.org 70 i void dump_lines(lineset_t ls, FILE *f){ Err bitreich.org 70 i int i; Err bitreich.org 70 i for (i=0; i y2){ Err bitreich.org 70 i+ y1 ^= y2; Err bitreich.org 70 i+ y2 ^= y1; Err bitreich.org 70 i+ y1 ^= y2; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ if (which == CUR) Err bitreich.org 70 i+ idx = &undo_cur; Err bitreich.org 70 i+ else Err bitreich.org 70 i+ idx = &undo_lst; Err bitreich.org 70 i+ if (*idx == undo_sz - 1){ Err bitreich.org 70 i+ undo_sz += 10; Err bitreich.org 70 i+ tmp = realloc(undo, undo_sz * sizeof(lineset_t)); Err bitreich.org 70 i+ if (tmp == NULL){ Err bitreich.org 70 i+ fprintf(stderr, "Error allocating undo buffer"); Err bitreich.org 70 i+ exit(1); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ undo = tmp; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ (*idx) ++; Err bitreich.org 70 i+ ensure_num_lines(&(undo[*idx]), y2 - y1 + 1); Err bitreich.org 70 i+ for(i=y1; i<=y2; i++){ Err bitreich.org 70 i+ len = strlen(screen.l[i].s); Err bitreich.org 70 i+ ensure_line_length(&(undo[*idx].l[i-y1]), len); Err bitreich.org 70 i+ strcpy(undo[*idx].l[i-y1].s, screen.l[i].s); Err bitreich.org 70 i+ undo[*idx].l[i-y1].n = i; Err bitreich.org 70 i+ undo[*idx].l[i-y1].lst = screen.l[i].lst; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ undo[*idx].num = y2 - y1 + 1; Err bitreich.org 70 i+ if (which == CUR) Err bitreich.org 70 i+ undo_lst = undo_cur; Err bitreich.org 70 i+#ifdef DEBUG Err bitreich.org 70 i+ fprintf(stderr, "undo_ring: y1: %d y2: %d idx: %d\n", y1, y2, *idx); Err bitreich.org 70 i+ for(i=0; i