summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKatolaZ <katolaz@freaknet.org>2019-07-31 11:49:06 +0100
committerKatolaZ <katolaz@freaknet.org>2019-07-31 11:49:06 +0100
commit7f6e62f77bca73e49dfa260ff7ac75770d1363c8 (patch)
tree849cf803a7e804ab879d41e161b69daf22987090
parentf3100ddd486d6f39b0c97c9c492bb6020bf3caf1 (diff)
support line-by-line undo in text mode
-rw-r--r--draw.c7
-rw-r--r--gramscii.16
-rw-r--r--gramscii.h5
-rw-r--r--lineset.c5
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
<katolaz@freaknet.org>. 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;
+}