From 66bde3c43d543cbadd617f68240f4bd8c22d10d9 Mon Sep 17 00:00:00 2001 From: Robin Haberkorn Date: Tue, 13 Nov 2012 23:52:01 +0100 Subject: EF command to close a buffer can be rubbed out!!! this works because when a buffer is closed, it is not deallocated but transferred to the undo token object which then (if run) reinserts it into the ring list. if the undo token is destroyed before it is run (eg. pressed), the buffer will finally be deallocated. --- qbuffers.cpp | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) (limited to 'qbuffers.cpp') diff --git a/qbuffers.cpp b/qbuffers.cpp index e72c730..f4212d7 100644 --- a/qbuffers.cpp +++ b/qbuffers.cpp @@ -190,6 +190,22 @@ Buffer::close(void) "Removed unnamed file from the ring."); } +void +Ring::UndoTokenEdit::run(void) +{ + /* + * assumes that buffer still has correct prev/next + * pointers + */ + *buffer->buffers.le_prev = buffer; + if (buffer->next()) + buffer->next()->buffers.le_prev = &buffer->next(); + + ring->current = buffer; + buffer->edit(); + buffer = NULL; +} + Buffer * Ring::find(const gchar *filename) { @@ -283,12 +299,18 @@ Ring::close(void) { Buffer *buffer = current; + buffer->dot = editor_msg(SCI_GETCURRENTPOS); buffer->close(); current = buffer->next() ? : first(); - if (!current) - edit(NULL); + /* transfer responsibility to UndoToken object */ + undo.push(new UndoTokenEdit(this, buffer)); - delete buffer; + if (current) { + current->edit(); + } else { + edit(NULL); + undo_close(); + } } Ring::~Ring() -- cgit v1.2.3