diff options
Diffstat (limited to 'src/undo.cpp')
-rw-r--r-- | src/undo.cpp | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/src/undo.cpp b/src/undo.cpp new file mode 100644 index 0000000..8072540 --- /dev/null +++ b/src/undo.cpp @@ -0,0 +1,78 @@ +#include <stdio.h> +#include <string.h> +#include <bsd/sys/queue.h> + +#include <glib.h> +#include <glib/gstdio.h> + +#include <Scintilla.h> + +#include "sciteco.h" +#include "interface.h" +#include "undo.h" + +//#define DEBUG + +UndoStack undo; + +void +UndoTokenMessage::run(void) +{ + interface.ssm(iMessage, wParam, lParam); +} + +void +UndoStack::push(UndoToken *token) +{ + if (enabled) { +#ifdef DEBUG + g_printf("UNDO PUSH %p\n", token); +#endif + token->pos = strlen(cmdline); + SLIST_INSERT_HEAD(&head, token, tokens); + } else { + delete token; + } +} + +void +UndoStack::push_msg(unsigned int iMessage, uptr_t wParam, sptr_t lParam) +{ + push(new UndoTokenMessage(iMessage, wParam, lParam)); +} + +void +UndoStack::pop(gint pos) +{ + while (!SLIST_EMPTY(&head) && SLIST_FIRST(&head)->pos >= pos) { + UndoToken *top = SLIST_FIRST(&head); +#ifdef DEBUG + g_printf("UNDO POP %p\n", top); + fflush(stdout); +#endif + + top->run(); + + SLIST_REMOVE_HEAD(&head, tokens); + delete top; + } +} + +void +UndoStack::clear(void) +{ + UndoToken *cur; + + while ((cur = SLIST_FIRST(&head))) { + SLIST_REMOVE_HEAD(&head, tokens); + delete cur; + } +} + +UndoStack::~UndoStack() +{ + UndoToken *token, *next; + + SLIST_FOREACH_SAFE(token, &head, tokens, next) + delete token; +} |