SMOLNET PORTAL home about changes
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
Original URLgopher://bitreich.org/0/scm/gramscii/commit/f3100ddd486d6...
Content-Typetext/plain; charset=utf-8