iadd undo support for box, visual, cut/paste - 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 f3100ddd486d6f39b0c97c9c492bb6020bf3caf1 /scm/gramscii/commit/f3100ddd486d6f39b0c97c9c492bb6020bf3caf1.gph bitreich.org 70
1parent 526ce3a130732d4a2374a6e36a689d9e0cf5cc34 /scm/gramscii/commit/526ce3a130732d4a2374a6e36a689d9e0cf5cc34.gph bitreich.org 70
hAuthor: KatolaZ <katolaz@freaknet.org> URL:mailto:katolaz@freaknet.org bitreich.org 70
iDate: Wed, 31 Jul 2019 11:19:55 +0100 Err bitreich.org 70
i Err bitreich.org 70
iadd undo support for box, visual, cut/paste Err bitreich.org 70
i Err bitreich.org 70
iDiffstat: Err bitreich.org 70
i M TODO | 4 ++++ Err bitreich.org 70
i M draw.c | 32 +++++++++++++++++-------------- Err bitreich.org 70
i M gramscii.1 | 24 ++++++++++++++++++++++-- Err bitreich.org 70
i M gramscii.h | 4 ++-- Err bitreich.org 70
i M lineset.c | 38 +++++++++++++++++-------------- Err bitreich.org 70
i M screen.c | 4 ++-- Err bitreich.org 70
i Err bitreich.org 70
i6 files changed, 69 insertions(+), 37 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,5 +1,9 @@ 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+ * re-organise undo-ring management Err bitreich.org 70
i+ - add undo for arrow mode Err bitreich.org 70
i+ - add undo for text mode Err bitreich.org 70
i+ - add undo for erase mode 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
1diff --git a/draw.c b/draw.c /scm/gramscii/file/draw.c.gph bitreich.org 70
i@@ -112,7 +112,7 @@ void draw_box(int x1, int y1, int fix){ 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+ copy_lines_to_ring(ymin, ymax, PRV_STATE); Err bitreich.org 70
i } Err bitreich.org 70
i else Err bitreich.org 70
i f = draw_xy; Err bitreich.org 70
i@@ -130,7 +130,7 @@ void draw_box(int x1, int y1, int fix){ 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+ copy_lines_to_ring(ymin, ymax, NEW_STATE); Err bitreich.org 70
i show_cursor(); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i@@ -316,10 +316,10 @@ 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+ copy_lines_to_ring(MIN(orig_y, y), MAX(orig_y, y), PRV_STATE); 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+ copy_lines_to_ring(MIN(orig_y, y), MAX(orig_y, y), NEW_STATE); 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@@ -345,9 +345,9 @@ 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+ copy_lines_to_ring(y, y2, PRV_STATE); 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+ copy_lines_to_ring(y, y2, NEW_STATE); Err bitreich.org 70
i redraw(); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i@@ -356,28 +356,32 @@ void put_lines(lineset_t *u){ 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+ ensure_line_length(&(screen.l[i]), strlen(u->l[i].s)); 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+ screen.l[n].lst = strlen(u->l[i].s)-1; 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+ if (undo_cur > undo_lst) Err bitreich.org 70
i+ undo_cur = undo_lst; Err bitreich.org 70
i put_lines(& (undo[undo_cur])); Err bitreich.org 70
i- undo_cur --; Err bitreich.org 70
i+ undo_cur -= 2; Err bitreich.org 70
i+ modified = 1; 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+ if (undo_cur <= undo_lst-2){ Err bitreich.org 70
i+ if (undo_cur > 0) Err bitreich.org 70
i+ put_lines(& (undo[undo_cur+1])); Err bitreich.org 70
i+ undo_cur +=2; Err bitreich.org 70
i+ put_lines(& (undo[undo_cur+1])); Err bitreich.org 70
i+ modified = 1; 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.1 b/gramscii.1 /scm/gramscii/file/gramscii.1.gph bitreich.org 70
i@@ -63,6 +63,26 @@ buffer contains the rectangle yanked/cut in Err bitreich.org 70
i .B visual Err bitreich.org 70
i mode. Err bitreich.org 70
i .TP 5m Err bitreich.org 70
i+.BI u Err bitreich.org 70
i+Undo the last change. gramscii supports an undo history of indefinite Err bitreich.org 70
i+length. The command Err bitreich.org 70
i+.BI u Err bitreich.org 70
i+gets the last change from the history, and moves the history pointer Err bitreich.org 70
i+back by one change. See the related command Err bitreich.org 70
i+.BI U Err bitreich.org 70
i+below. Err bitreich.org 70
i+.TP 5m Err bitreich.org 70
i+.BI U Err bitreich.org 70
i+Redo, i.e., cancel a previous Err bitreich.org 70
i+.BI u Err bitreich.org 70
i+command. gramscii supports an undo history of indefinite length. The Err bitreich.org 70
i+command Err bitreich.org 70
i+.BI U Err bitreich.org 70
i+moves to the following change, if possible. For instance, the sequence Err bitreich.org 70
i+.BI uuU Err bitreich.org 70
i+will go back two changes, and then forward one, effectively resetting Err bitreich.org 70
i+the state of the screen to what it was before the last change occurred. Err bitreich.org 70
i+.TP 5m Err bitreich.org 70
i .BI q Err bitreich.org 70
i Quit gramscii, and prompt for a filename if the current screen contains Err bitreich.org 70
i unsaved changes. Err bitreich.org 70
i@@ -516,8 +536,8 @@ support scrolling and "virtual" screens of any (reasonable) size. Err bitreich.org 70
i .PP Err bitreich.org 70
i gramscii currently does Err bitreich.org 70
i .B not Err bitreich.org 70
i-provide an "undo" command. This requires a restructuring of buffer Err bitreich.org 70
i-management, and will most probably be implemented in a future release. Err bitreich.org 70
i+support "undo" commands for arrow, text, and erase mode. This will be Err bitreich.org 70
i+added soon. Err bitreich.org 70
i .SH AUTHORS Err bitreich.org 70
i gramscii is written and maintained by Vincenzo "KatolaZ" Nicosia Err bitreich.org 70
i <katolaz@freaknet.org>. You can use, copy, modify, and redistribute Err bitreich.org 70
1diff --git a/gramscii.h b/gramscii.h /scm/gramscii/file/gramscii.h.gph bitreich.org 70
i@@ -44,8 +44,8 @@ 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+#define PRV_STATE 0x01 Err bitreich.org 70
i+#define NEW_STATE 0x02 Err bitreich.org 70
i Err bitreich.org 70
i /** types **/ Err bitreich.org 70
i Err bitreich.org 70
1diff --git a/lineset.c b/lineset.c /scm/gramscii/file/lineset.c.gph bitreich.org 70
i@@ -127,19 +127,24 @@ void paste_region(int x1, int y1){ Err bitreich.org 70
i } 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- lineset_t *tmp; Err bitreich.org 70
i- int i, len, *idx; Err bitreich.org 70
i+ int i, len, idx; Err bitreich.org 70
i+ int offset; Err bitreich.org 70
i+ lineset_t *tmp; Err bitreich.org 70
i Err bitreich.org 70
i if (y1 > 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+ if (undo_cur > undo_lst) Err bitreich.org 70
i+ undo_cur = undo_lst; Err bitreich.org 70
i+ if (which == PRV_STATE){ /* adding a new previous state */ Err bitreich.org 70
i+ undo_cur += 2; Err bitreich.org 70
i+ idx = undo_cur; Err bitreich.org 70
i+ } 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+ idx = undo_cur + 1; 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@@ -148,22 +153,21 @@ void copy_lines_to_ring(int y1, int y2, int which){ 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+ 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+ 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[idx].num = y2 - y1 + 1; Err bitreich.org 70
i+ if (which == PRV_STATE) 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<undo[undo_cur].num; i++){ Err bitreich.org 70
i- fprintf(stderr, "UU: %d| %s\n", undo[*idx].l[i].n, undo[*idx].l[i].s); 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<undo[idx].num; i++){ Err bitreich.org 70
i+ fprintf(stderr, "UU: %d| %s\n", undo[idx].l[i].n, undo[idx].l[i].s); Err bitreich.org 70
i } Err bitreich.org 70
i #endif Err bitreich.org 70
i } Err bitreich.org 70
1diff --git a/screen.c b/screen.c /scm/gramscii/file/screen.c.gph bitreich.org 70
i@@ -410,8 +410,8 @@ void init_screen(){ Err bitreich.org 70
i cutbuf.num = 0; Err bitreich.org 70
i Err bitreich.org 70
i undo_sz = 0; Err bitreich.org 70
i- undo_cur = -1; Err bitreich.org 70
i- undo_lst = -1; Err bitreich.org 70
i+ undo_cur = -2; Err bitreich.org 70
i+ undo_lst = -2; Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i void find_nonblank_rect(int *x1, int *y1, int *x2, int *y2){ Err bitreich.org 70
.
Response:
text/plain