Skip to content

Commit

Permalink
Fix undo of line end type change
Browse files Browse the repository at this point in the history
At the moment undo of line end type change only undos the changes made
in the document but the different line ending settings remains active.

This patch fixes the issue by combining the line end scintilla undo action
with a new UNDO_EOL action responsible for updating the line ending
settings.

Fixes #409
  • Loading branch information
techee committed Jun 23, 2016
1 parent f427a3a commit 6a3a53f
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 0 deletions.
7 changes: 7 additions & 0 deletions src/callbacks.c
Expand Up @@ -497,8 +497,15 @@ static void convert_eol(gint mode)

g_return_if_fail(doc != NULL);

/* sci_convert_eols() adds UNDO_SCINTILLA action in on_editor_notify().
* It is added to the undo stack before sci_convert_eols() finishes
* so after adding UNDO_EOL, UNDO_EOL will be at the top of the stack
* and UNDO_SCINTILLA below it. */
sci_convert_eols(doc->editor->sci, mode);
document_undo_add(doc, UNDO_EOL, GINT_TO_POINTER(sci_get_eol_mode(doc->editor->sci)));

sci_set_eol_mode(doc->editor->sci, mode);

ui_update_statusbar(doc, -1);
}

Expand Down
38 changes: 38 additions & 0 deletions src/document.c
Expand Up @@ -2953,6 +2953,25 @@ void document_undo(GeanyDocument *doc)
g_free(action->data);
break;
}
case UNDO_EOL:
{
undo_action *next_action;

document_redo_add(doc, UNDO_EOL, GINT_TO_POINTER(sci_get_eol_mode(doc->editor->sci)));

sci_set_eol_mode(doc->editor->sci, GPOINTER_TO_INT(action->data));

ui_update_statusbar(doc, -1);
ui_document_show_hide(doc);

/* When undoing, UNDO_EOL is always followed by UNDO_SCINTILLA
* which undos the line endings in the editor and should be
* performed together with UNDO_EOL. */
next_action = g_trash_stack_peek(&doc->priv->undo_actions);
if (next_action && next_action->type == UNDO_SCINTILLA)
document_undo(doc);
break;
}
case UNDO_RELOAD:
{
UndoReloadData *data = (UndoReloadData*)action->data;
Expand Down Expand Up @@ -3017,9 +3036,18 @@ void document_redo(GeanyDocument *doc)
{
case UNDO_SCINTILLA:
{
undo_action *next_action;

document_undo_add_internal(doc, UNDO_SCINTILLA, NULL);

sci_redo(doc->editor->sci);

/* When redoing an EOL change, the UNDO_SCINTILLA which changes
* the line ends in the editor is followed by UNDO_EOL
* which should be performed together with UNDO_SCINTILLA. */
next_action = g_trash_stack_peek(&doc->priv->redo_actions);
if (next_action != NULL && next_action->type == UNDO_EOL)
document_redo(doc);
break;
}
case UNDO_BOM:
Expand All @@ -3044,6 +3072,16 @@ void document_redo(GeanyDocument *doc)
g_free(action->data);
break;
}
case UNDO_EOL:
{
document_undo_add_internal(doc, UNDO_EOL, GINT_TO_POINTER(sci_get_eol_mode(doc->editor->sci)));

sci_set_eol_mode(doc->editor->sci, GPOINTER_TO_INT(action->data));

ui_update_statusbar(doc, -1);
ui_document_show_hide(doc);
break;
}
case UNDO_RELOAD:
{
UndoReloadData *data = (UndoReloadData*)action->data;
Expand Down
1 change: 1 addition & 0 deletions src/documentprivate.h
Expand Up @@ -35,6 +35,7 @@ enum
UNDO_ENCODING,
UNDO_BOM,
UNDO_RELOAD,
UNDO_EOL,
UNDO_ACTIONS_MAX
};

Expand Down

0 comments on commit 6a3a53f

Please sign in to comment.