diff --git a/src/document-undo.cpp b/src/document-undo.cpp
index 0462ff374a175fccd94e959c4958d1cda9e82a4c..81125833110313c50b78793bbadecf8b6ee35dde 100644 (file)
--- a/src/document-undo.cpp
+++ b/src/document-undo.cpp
#include "inkscape.h"
#include "debug/event-tracker.h"
#include "debug/simple-event.h"
+#include "debug/timestamp.h"
#include "event.h"
@@ -129,6 +130,38 @@ sp_document_reset_key (Inkscape::Application *inkscape, SPDesktop *desktop, GtkO
doc->actionkey = NULL;
}
+namespace {
+
+using Inkscape::Debug::Event;
+using Inkscape::Debug::SimpleEvent;
+using Inkscape::Util::share_static_string;
+using Inkscape::Debug::timestamp;
+using Inkscape::Verb;
+
+typedef SimpleEvent<Event::INTERACTION> InteractionEvent;
+
+class CommitEvent : public InteractionEvent {
+public:
+
+ CommitEvent(SPDocument *doc, const gchar *key, const unsigned int type)
+ : InteractionEvent(share_static_string("commit"))
+ {
+ _addProperty(share_static_string("timestamp"), timestamp());
+ gchar *serial = g_strdup_printf("%lu", doc->serial());
+ _addProperty(share_static_string("document"), serial);
+ g_free(serial);
+ Verb *verb = Verb::get(type);
+ if (verb) {
+ _addProperty(share_static_string("context"), verb->get_id());
+ }
+ if (key) {
+ _addProperty(share_static_string("merge-key"), key);
+ }
+ }
+};
+
+}
+
void
sp_document_maybe_done (SPDocument *doc, const gchar *key, const unsigned int event_type,
Glib::ustring event_description)
@@ -137,6 +170,8 @@ sp_document_maybe_done (SPDocument *doc, const gchar *key, const unsigned int ev
g_assert (doc->priv != NULL);
g_assert (doc->priv->sensitive);
+ Inkscape::Debug::EventTracker<CommitEvent> tracker(doc, key, event_type);
+
doc->collectOrphans();
sp_document_ensure_up_to_date (doc);
@@ -152,9 +187,8 @@ sp_document_maybe_done (SPDocument *doc, const gchar *key, const unsigned int ev
}
if (key && doc->actionkey && !strcmp (key, doc->actionkey) && doc->priv->undo) {
- doc->priv->undo->data =
- new Inkscape::Event(sp_repr_coalesce_log (((Inkscape::Event *)
- doc->priv->undo->data)->event, log));
+ ((Inkscape::Event *)doc->priv->undo->data)->event =
+ sp_repr_coalesce_log (((Inkscape::Event *)doc->priv->undo->data)->event, log);
} else {
Inkscape::Event *event = new Inkscape::Event(log, event_type, event_description);
doc->priv->undo = g_slist_prepend (doc->priv->undo, event);
sp_repr_begin_transaction (doc->rdoc);
}
-namespace {
-
-void finish_incomplete_transaction(SPDocument &doc) {
+static void finish_incomplete_transaction(SPDocument &doc) {
SPDocumentPrivate &priv=*doc.priv;
Inkscape::XML::Event *log=sp_repr_commit_undoable(doc.rdoc);
if (log || priv.partial) {
g_warning ("Incomplete undo transaction:");
priv.partial = sp_repr_coalesce_log(priv.partial, log);
sp_repr_debug_print_log(priv.partial);
- priv.undo = g_slist_prepend(priv.undo, priv.partial);
+ Inkscape::Event *event = new Inkscape::Event(priv.partial);
+ priv.undo = g_slist_prepend(priv.undo, event);
+ priv.undoStackObservers.notifyUndoCommitEvent(event);
priv.partial = NULL;
}
}
-}
-
gboolean
sp_document_undo (SPDocument *doc)
{
void
sp_document_clear_undo (SPDocument *doc)
{
+ if (doc->priv->undo)
+ doc->priv->undoStackObservers.notifyClearUndoEvent();
+
while (doc->priv->undo) {
GSList *current;
void
sp_document_clear_redo (SPDocument *doc)
{
+ if (doc->priv->redo)
+ doc->priv->undoStackObservers.notifyClearRedoEvent();
+
while (doc->priv->redo) {
GSList *current;