- When undoing a cut, set cutbuffer to NULL after freeing the current one
- When updating a normal consecutive ^K cut, bail from add_undo since it's not an add, and in update_undo free the old cutbuffer before copying it again. git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@4287 35c25a1d-7b9e-4130-9fde-d3aeb78583b8master
parent
1f37c4514d
commit
8f76112084
13
src/text.c
13
src/text.c
|
@ -451,6 +451,7 @@ void do_undo(void)
|
||||||
do_gotolinecolumn(u->lineno, u->begin+1, FALSE, FALSE, FALSE, FALSE);
|
do_gotolinecolumn(u->lineno, u->begin+1, FALSE, FALSE, FALSE, FALSE);
|
||||||
do_uncut_text();
|
do_uncut_text();
|
||||||
free_filestruct(cutbuffer);
|
free_filestruct(cutbuffer);
|
||||||
|
cutbuffer = NULL;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
undidmsg = _("wtf?");
|
undidmsg = _("wtf?");
|
||||||
|
@ -731,9 +732,15 @@ bool execute_command(const char *command)
|
||||||
/* Add a new undo struct to the top of the current pile */
|
/* Add a new undo struct to the top of the current pile */
|
||||||
void add_undo(undo_type current_action, openfilestruct *fs)
|
void add_undo(undo_type current_action, openfilestruct *fs)
|
||||||
{
|
{
|
||||||
undo *u = nmalloc(sizeof(undo));
|
undo *u;
|
||||||
char *data;
|
char *data;
|
||||||
|
|
||||||
|
/* Ugh, if we were called while cutting not-to-end, non-marked and on the same lineno,
|
||||||
|
we need to abort here */
|
||||||
|
u = fs->current_undo;
|
||||||
|
if (u && u->type == CUT && !u->mark_set && u->lineno == fs->current->lineno)
|
||||||
|
return;
|
||||||
|
|
||||||
/* Blow away the old undo stack if we are starting from the middle */
|
/* Blow away the old undo stack if we are starting from the middle */
|
||||||
while (fs->undotop != NULL && fs->undotop != fs->current_undo) {
|
while (fs->undotop != NULL && fs->undotop != fs->current_undo) {
|
||||||
undo *u2 = fs->undotop;
|
undo *u2 = fs->undotop;
|
||||||
|
@ -748,6 +755,8 @@ void add_undo(undo_type current_action, openfilestruct *fs)
|
||||||
free(u2);
|
free(u2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Allocate and initialize a new undo type */
|
||||||
|
u = nmalloc(sizeof(undo));
|
||||||
u->type = current_action;
|
u->type = current_action;
|
||||||
u->lineno = fs->current->lineno;
|
u->lineno = fs->current->lineno;
|
||||||
u->begin = fs->current_x;
|
u->begin = fs->current_x;
|
||||||
|
@ -895,6 +904,8 @@ void update_undo(undo_type action, openfilestruct *fs)
|
||||||
case CUT:
|
case CUT:
|
||||||
case CUTTOEND:
|
case CUTTOEND:
|
||||||
case UNCUT:
|
case UNCUT:
|
||||||
|
if (u->cutbuffer)
|
||||||
|
free(u->cutbuffer);
|
||||||
u->cutbuffer = copy_filestruct(cutbuffer);
|
u->cutbuffer = copy_filestruct(cutbuffer);
|
||||||
u->cutbottom = cutbottom;
|
u->cutbottom = cutbottom;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue