diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-12-04 17:29:01 +0100 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-12-04 22:07:08 +0100 |
commit | d8a316514c03d85b771a9dce4a8a51b875d955b3 (patch) | |
tree | 8966c29db767a155848f6d90f76771ce5b9de32e /src/undo.cpp | |
parent | b120616b6da52e951097f69ad267de06081d218a (diff) | |
download | sciteco-d8a316514c03d85b771a9dce4a8a51b875d955b3.tar.gz |
autoconf preparation: move everything into src/ subdir
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; +} |