SMOLNET PORTAL home about changes
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 <katolaz@freaknet.org>	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 <stdlib.h>	Err	bitreich.org	70
i+#include <string.h>	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<ls.num ;i++){	Err	bitreich.org	70
i@@ -124,3 +125,45 @@ void paste_region(int x1, int y1){	Err	bitreich.org	70
i         }	Err	bitreich.org	70
i         redraw();	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+	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+        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<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+        }	Err	bitreich.org	70
i+#endif        	Err	bitreich.org	70
i+}	Err	bitreich.org	70
1diff --git a/main.c b/main.c	/scm/gramscii/file/main.c.gph	bitreich.org	70
i@@ -122,6 +122,12 @@ void commands(FILE *fc){	Err	bitreich.org	70
i                                 case 'p':	Err	bitreich.org	70
i                                         paste();	Err	bitreich.org	70
i                                         break;	Err	bitreich.org	70
i+                                case 'u':	Err	bitreich.org	70
i+                                        undo_change();	Err	bitreich.org	70
i+                                        break;	Err	bitreich.org	70
i+                                case 'U':	Err	bitreich.org	70
i+                                        redo_change();	Err	bitreich.org	70
i+                                        break;	Err	bitreich.org	70
i                                 case 'q':	Err	bitreich.org	70
i                                         check_modified(fc);/** FALLTHROUGH **/	Err	bitreich.org	70
i                                 case 'Q':	Err	bitreich.org	70
1diff --git a/screen.c b/screen.c	/scm/gramscii/file/screen.c.gph	bitreich.org	70
i@@ -408,6 +408,10 @@ void init_screen(){	Err	bitreich.org	70
i         cutbuf.sz = 0;	Err	bitreich.org	70
i         cutbuf.l = NULL;	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 }	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/526ce3a130732...
Content-Typetext/plain; charset=utf-8