Branch: refs/heads/master Author: Colomban Wendling ban@herbesfolles.org Committer: Colomban Wendling ban@herbesfolles.org Date: Thu, 23 Jun 2016 17:38:25 UTC Commit: 586e64b842b2a77958bafd8f8b443b2436997c49 https://github.com/geany/geany/commit/586e64b842b2a77958bafd8f8b443b2436997c...
Log Message: ----------- Merge pull request #527 from techee/eol_undo
Fix undo of line end type change
Modified Paths: -------------- src/callbacks.c src/document.c src/documentprivate.h
Modified: src/callbacks.c 7 lines changed, 7 insertions(+), 0 deletions(-) =================================================================== @@ -487,8 +487,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); }
Modified: src/document.c 50 lines changed, 42 insertions(+), 8 deletions(-) =================================================================== @@ -3036,12 +3036,29 @@ void document_undo(GeanyDocument *doc) document_redo_add(doc, UNDO_ENCODING, g_strdup(doc->encoding));
document_set_encoding(doc, (const gchar*)action->data); + g_free(action->data);
- ignore_callback = TRUE; - encodings_select_radio_item((const gchar*)action->data); - ignore_callback = FALSE; + ui_update_statusbar(doc, -1); + ui_document_show_hide(doc); + break; + } + case UNDO_EOL: + { + undo_action *next_action;
- g_free(action->data); + 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: @@ -3108,9 +3125,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: @@ -3127,12 +3153,20 @@ void document_redo(GeanyDocument *doc) document_undo_add_internal(doc, UNDO_ENCODING, g_strdup(doc->encoding));
document_set_encoding(doc, (const gchar*)action->data); + g_free(action->data);
- ignore_callback = TRUE; - encodings_select_radio_item((const gchar*)action->data); - ignore_callback = FALSE; + ui_update_statusbar(doc, -1); + ui_document_show_hide(doc); + break; + } + case UNDO_EOL: + { + document_undo_add_internal(doc, UNDO_EOL, GINT_TO_POINTER(sci_get_eol_mode(doc->editor->sci)));
- g_free(action->data); + 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:
Modified: src/documentprivate.h 1 lines changed, 1 insertions(+), 0 deletions(-) =================================================================== @@ -35,6 +35,7 @@ enum UNDO_ENCODING, UNDO_BOM, UNDO_RELOAD, + UNDO_EOL, UNDO_ACTIONS_MAX };
-------------- This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).