commit 83b89a49ef60e20a26a4d96a7606758de9192ed1
parent 87a254400e80fe0b03493cb894de0b673a7ecb69
Author: Benno Schulenberg <bensberg@justemail.net>
Date: Tue, 7 Jun 2016 11:52:57 +0200
text: remove a redundant undo element
Implement its single use case by making better use of another element.
Diffstat:
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/src/nano.h b/src/nano.h
@@ -357,13 +357,12 @@ typedef struct undo {
/* Copy of the cutbuffer. */
filestruct *cutbottom;
/* Copy of cutbottom. */
- bool mark_set;
- /* Was the marker set when we cut? */
ssize_t mark_begin_lineno;
- /* copy copy copy */
+ /* Mostly the line number of the current line; sometimes something else. */
size_t mark_begin_x;
- /* Another shadow variable. */
+ /* The x position corresponding to the above line number. */
struct undo *next;
+ /* A pointer to the undo item of the preceding action. */
} undo;
#endif /* !NANO_TINY */
@@ -574,8 +573,10 @@ enum
/* Some extra flags for the undo function. */
#define WAS_FINAL_BACKSPACE (1<<1)
-#define WAS_MARKED_FORWARD (1<<2)
-#define WAS_WHOLE_LINE (1<<3)
+#define WAS_WHOLE_LINE (1<<2)
+/* The flags for the mark need to be the highest. */
+#define MARK_WAS_SET (1<<3)
+#define WAS_MARKED_FORWARD (1<<4)
#endif /* !NANO_TINY */
/* The maximum number of entries displayed in the main shortcut list. */
diff --git a/src/text.c b/src/text.c
@@ -1156,7 +1156,7 @@ void add_undo(undo_type action)
* no cursor movement in between -- don't add a new undo item. */
if (u && u->mark_begin_lineno == openfile->current->lineno && action == openfile->last_action &&
((action == ADD && u->type == ADD && u->mark_begin_x == openfile->current_x) ||
- (action == CUT && u->type == CUT && !u->mark_set && keeping_cutbuffer())))
+ (action == CUT && u->type == CUT && u->xflags < MARK_WAS_SET && keeping_cutbuffer())))
return;
/* Blow away newer undo items if we add somewhere in the middle. */
@@ -1190,7 +1190,6 @@ void add_undo(undo_type action)
u->begin = openfile->current_x;
u->mark_begin_lineno = openfile->current->lineno;
u->mark_begin_x = openfile->current_x;
- u->mark_set = FALSE;
u->wassize = openfile->totsize;
u->xflags = 0;
u->grouping = NULL;
@@ -1244,10 +1243,10 @@ void add_undo(undo_type action)
break;
case CUT:
cutbuffer_reset();
- u->mark_set = openfile->mark_set;
- if (u->mark_set) {
+ if (openfile->mark_set) {
u->mark_begin_lineno = openfile->mark_begin->lineno;
u->mark_begin_x = openfile->mark_begin_x;
+ u->xflags = MARK_WAS_SET;
} else if (!ISSET(CUT_TO_END)) {
/* The entire line is being cut regardless of the cursor position. */
u->begin = 0;
@@ -1379,7 +1378,7 @@ fprintf(stderr, " >> Updating... action = %d, openfile->last_action = %d, openf
break;
free_filestruct(u->cutbuffer);
u->cutbuffer = copy_filestruct(cutbuffer);
- if (u->mark_set) {
+ if (u->xflags == MARK_WAS_SET) {
/* If the "marking" operation was from right-->left or
* bottom-->top, then swap the mark points. */
if ((u->lineno == u->mark_begin_lineno && u->begin < u->mark_begin_x)