From 7f6e62f77bca73e49dfa260ff7ac75770d1363c8 Mon Sep 17 00:00:00 2001 From: KatolaZ Date: Wed, 31 Jul 2019 11:49:06 +0100 Subject: support line-by-line undo in text mode --- draw.c | 7 +++++++ gramscii.1 | 6 +++--- gramscii.h | 5 +++-- lineset.c | 5 +++++ 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/draw.c b/draw.c index e4c3250..1e73719 100644 --- a/draw.c +++ b/draw.c @@ -77,10 +77,13 @@ void get_text(FILE *fc){ int orig_x = x; redraw(); + copy_lines_to_ring(y, y, PRV_STATE); while((c=fgetc(fc))!=EOF && c != 27){ if(c=='\n'){ set_cur(BG); + copy_lines_to_ring(y,y, NEW_STATE); y += 1; + copy_lines_to_ring(y, y, PRV_STATE); x = orig_x; } else { @@ -95,6 +98,8 @@ void get_text(FILE *fc){ status_bar(); show_cursor(); } + if (modified) + copy_lines_to_ring(y, y, NEW_STATE); mode=MOVE; } @@ -245,6 +250,7 @@ update_arrow: show_cursor(); } if (c == 'a' || c == '\n'){ + invalidate_undo(); draw_arrow(orig_x, orig_y, arrow, arrow_len, FIX); modified = 1; } @@ -278,6 +284,7 @@ void erase(FILE *fc){ int orig_x = x, orig_y = y; status_bar(); show_cursor(); + invalidate_undo(); while((c=fgetc(fc))!=EOF && c!=27 && c!= 'x' && c != '\n'){ if (!move_around(c, fc)) continue; check_bound(); diff --git a/gramscii.1 b/gramscii.1 index aa88386..f3ec80e 100644 --- a/gramscii.1 +++ b/gramscii.1 @@ -534,10 +534,10 @@ gramscii currently manages only a fixed screen of the same size of the screen where it starts from. This will be changed in a future release to support scrolling and "virtual" screens of any (reasonable) size. .PP -gramscii currently does +Undo commands are only available in box, visual (cut, fill), and text +mode, and for copy/paste operations. gramscii currently does .B not -support "undo" commands for arrow, text, and erase mode. This will be -added soon. +support undo commands for arrow and erase mode. This will be fixed soon. .SH AUTHORS gramscii is written and maintained by Vincenzo "KatolaZ" Nicosia . You can use, copy, modify, and redistribute diff --git a/gramscii.h b/gramscii.h index cadde2d..7aa9f62 100644 --- a/gramscii.h +++ b/gramscii.h @@ -149,6 +149,8 @@ void get_arrow(FILE *fc); void erase(FILE *fc); void visual_box(FILE *fc); void paste(); +void undo_change(); +void redo_change(); /** file-related functions **/ void write_file(FILE *fc); @@ -165,7 +167,6 @@ void ensure_num_lines(lineset_t *ls, int n); void yank_region(int x1, int y1, int x2, int y2); void paste_region(int x1, int y1); void copy_lines_to_ring(int y1, int y2, int which); -void undo_change(); -void redo_change(); +void invalidate_undo(); #endif diff --git a/lineset.c b/lineset.c index 75ae1d3..4b5ad8c 100644 --- a/lineset.c +++ b/lineset.c @@ -171,3 +171,8 @@ void copy_lines_to_ring(int y1, int y2, int which){ } #endif } + +void invalidate_undo(){ + if (undo_lst > undo_cur) + undo_lst = undo_cur; +} -- cgit v1.2.3