[Xfce4-commits] <mousepad:master> * mousepad/mousepad-undo.c: Don't store a string (or even prepend it in a GString) when the user is inserting text. This saves a whole bunch of relocations (Bug #2737). We also flush the insert buffer after a redo and don't copy strings when inverting a delete step. This should bring the memory usage of the undo manager to a minimum. * TODO: Add some undo manager reminders. * mousepad/mousepad-window.c: Fix compiler warning when debugging is enabled. * mousepad/mousepad-application.c: Change from append to prepend.
Nick Schermer
noreply at xfce.org
Sat May 5 21:30:32 CEST 2012
Updating branch refs/heads/master
to 23c7b01c285078e6346e1b65afcb611273ce3c2f (commit)
from a4f297b08aa19d2aa06c969d821af3590a231a2a (commit)
commit 23c7b01c285078e6346e1b65afcb611273ce3c2f
Author: Nick Schermer <nick at xfce.org>
Date: Thu May 10 16:13:39 2007 +0000
* mousepad/mousepad-undo.c: Don't store a string (or even
prepend it in a GString) when the user is inserting text.
This saves a whole bunch of relocations (Bug #2737). We also
flush the insert buffer after a redo and don't copy strings
when inverting a delete step. This should bring the memory
usage of the undo manager to a minimum.
* TODO: Add some undo manager reminders.
* mousepad/mousepad-window.c: Fix compiler warning when
debugging is enabled.
* mousepad/mousepad-application.c: Change from append to
prepend.
(Old svn revision: 25700)
ChangeLog | 14 +++++++++++
TODO | 9 +++++++
mousepad/mousepad-application.c | 2 +-
mousepad/mousepad-undo.c | 50 +++++++++++++++++++++++++++++---------
mousepad/mousepad-window.c | 2 +-
5 files changed, 63 insertions(+), 14 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index ea45543..f82103a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2007-05-10 Nick Schermer <nick at xfce.org>
+ * mousepad/mousepad-undo.c: Don't store a string (or even
+ prepend it in a GString) when the user is inserting text.
+ This saves a whole bunch of relocations (Bug #2737). We also
+ flush the insert buffer after a redo and don't copy strings
+ when inverting a delete step. This should bring the memory
+ usage of the undo manager to a minimum.
+ * TODO: Add some undo manager reminders.
+ * mousepad/mousepad-window.c: Fix compiler warning when
+ debugging is enabled.
+ * mousepad/mousepad-application.c: Change from append to
+ prepend.
+
+
2007-05-08 Nick Schermer <nick at xfce.org>
* mousepad/mousepad-window.c: Rename function so it matches
the standard mousepad_window_* names.
diff --git a/TODO b/TODO
index fe0db97..8f30a10 100644
--- a/TODO
+++ b/TODO
@@ -35,6 +35,15 @@ Text View
- Maybe a match whole word option.
+Undo Manager
+============
+- Replace g_list_append with g_list_prepend in the undo manager. See
+ glib manual why.
+- We erase the GString in the undo manager, but this buffer will be
+ (very) large when a large bunch of text is deleted. Maybe not a big
+ problem, but we could shrink it after erasing.
+
+
Saving and loading
==================
- Save All option.
diff --git a/mousepad/mousepad-application.c b/mousepad/mousepad-application.c
index 7054862..dcb0bc9 100644
--- a/mousepad/mousepad-application.c
+++ b/mousepad/mousepad-application.c
@@ -204,7 +204,7 @@ mousepad_application_take_window (MousepadApplication *application,
g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (mousepad_application_window_destroyed), application);
/* add the window to our internal list */
- application->windows = g_slist_append (application->windows, window);
+ application->windows = g_slist_prepend (application->windows, window);
}
diff --git a/mousepad/mousepad-undo.c b/mousepad/mousepad-undo.c
index 3fa6fba..1477bf2 100644
--- a/mousepad/mousepad-undo.c
+++ b/mousepad/mousepad-undo.c
@@ -272,6 +272,10 @@ mousepad_undo_preform_step (MousepadUndo *undo,
/* get the end iter */
gtk_text_buffer_get_iter_at_offset (undo->buffer, &end_iter, info->end);
+ /* set the string */
+ if (info->string == NULL)
+ info->string = gtk_text_buffer_get_slice (undo->buffer, &start_iter, &end_iter, TRUE);
+
/* delete the inserted text */
gtk_text_buffer_delete (undo->buffer, &start_iter, &end_iter);
@@ -281,6 +285,14 @@ mousepad_undo_preform_step (MousepadUndo *undo,
/* insert the deleted text */
gtk_text_buffer_insert (undo->buffer, &start_iter, info->string, -1);
+ /* cleanup the buffer if the user did a redo step (so an inverted insert step) */
+ if (!undo_step)
+ {
+ /* free and reset */
+ g_free (info->string);
+ info->string = NULL;
+ }
+
break;
default:
@@ -295,7 +307,7 @@ mousepad_undo_preform_step (MousepadUndo *undo,
undo->steps_position++;
}
- /* set the can_undo boolean */
+ /* whether we can undo and redo */
undo->can_undo = (undo->steps_position > 0);
undo->can_redo = (undo->steps_position < g_list_length (undo->steps));
@@ -338,10 +350,17 @@ mousepad_undo_new_step (MousepadUndo *undo)
/* allocate a new slice */
info = g_slice_new0 (MousepadUndoInfo);
- /* copy the data from the existing step */
- info->string = g_strdup (existing->string);
- info->start = existing->start;
- info->end = existing->end;
+ /* copy the data from the existing step, ignore delete
+ * action string since they will be inverted to insert
+ * actions*/
+ if (existing->action == INSERT)
+ info->string = g_strdup (existing->string);
+ else
+ info->string = NULL;
+
+ /* set the start and end position */
+ info->start = existing->start;
+ info->end = existing->end;
/* set the inverted action */
info->action = (existing->action == INSERT ? DELETE : INSERT);
@@ -353,12 +372,18 @@ mousepad_undo_new_step (MousepadUndo *undo)
/* allocate the slice */
info = g_slice_new0 (MousepadUndoInfo);
- /* set the info */
- info->string = g_strdup (undo->step_buffer->str);
+ /* set the action, start- and end-position */
info->action = undo->step_action;
info->start = undo->step_start;
info->end = undo->step_end;
+ /* only set the string if we delete text. if we insert text the
+ * string will be set before we delete it when undoing */
+ if (undo->step_action == INSERT)
+ info->string = NULL;
+ else
+ info->string = g_strdup (undo->step_buffer->str);
+
/* append to the steps list */
undo->steps = g_list_append (undo->steps, info);
@@ -428,10 +453,8 @@ mousepad_undo_handle_step (const gchar *text,
/* check if we can append (insert action) */
if (undo->step_action == action && action == INSERT && undo->step_end == start)
{
- /* append the inserted string */
- undo->step_buffer = g_string_append_len (undo->step_buffer, text, length);
-
- /* update the end position */
+ /* update the end position. we don't have to prepend the inserted text since
+ * we don't store this when creating a new step */
undo->step_end = end;
}
/* check if we can prepend (delete action) */
@@ -456,8 +479,11 @@ new_step:
/* only start a new step when the char was not a space */
if (create_new_step)
{
+ /* start building a new string if we delete text */
+ if (action == DELETE)
+ undo->step_buffer = g_string_append_len (undo->step_buffer, text, length);
+
/* set the new info */
- undo->step_buffer = g_string_append_len (undo->step_buffer, text, ABS (start - end));
undo->step_action = action;
undo->step_start = start;
undo->step_end = end;
diff --git a/mousepad/mousepad-window.c b/mousepad/mousepad-window.c
index 4f50997..d981df2 100644
--- a/mousepad/mousepad-window.c
+++ b/mousepad/mousepad-window.c
@@ -1359,7 +1359,7 @@ mousepad_window_notebook_button_press_event (GtkNotebook *notebook,
guint page_num = 0;
gint x_root;
- _mousepad_return_if_fail (MOUSEPAD_IS_WINDOW (window));
+ _mousepad_return_val_if_fail (MOUSEPAD_IS_WINDOW (window), FALSE);
if (event->type == GDK_BUTTON_PRESS && event->button == 3)
{
More information about the Xfce4-commits
mailing list