This patch enables experimental scintilla changebar for geany. For testing only.

Signed-off-by: Jiří Techet <tec...@gmail.com>
---
 scintilla/CellBuffer.cxx          |  366 ++++++++++++++++++++++++++++++++++---
 scintilla/CellBuffer.h            |   94 +++++++++-
 scintilla/Document.cxx            |   48 +++++-
 scintilla/Document.h              |   13 ++-
 scintilla/Editor.cxx              |   76 ++++++++-
 scintilla/RunStyles.cxx           |   42 +++++
 scintilla/RunStyles.h             |    6 +
 scintilla/include/Scintilla.h     |   15 ++-
 scintilla/include/Scintilla.iface |    9 +-
 src/editor.c                      |    2 +-
 src/highlighting.c                |   21 ++-
 src/sciwrappers.c                 |   10 +-
 12 files changed, 649 insertions(+), 53 deletions(-)

diff --git a/scintilla/CellBuffer.cxx b/scintilla/CellBuffer.cxx
index 064ef1a..0a47249 100644
--- a/scintilla/CellBuffer.cxx
+++ b/scintilla/CellBuffer.cxx
@@ -21,6 +21,88 @@
 using namespace Scintilla;
 #endif
 
+/* CHANGEBAR begin */
+LineChanges::LineChanges() : collecting(0), edition(0) {
+}
+
+LineChanges::~LineChanges() {
+}
+
+void LineChanges::AdvanceEdition() {
+    edition = (edition + 1) % 0x40000000;
+}
+
+int LineChanges::GetEdition() const {
+    return edition;
+}
+
+char *LineChanges::PersistantForm() const {
+    if (collecting)
+        return state.PersistantForm();
+    else
+        return 0;
+}
+
+void LineChanges::SetChanges(const char *changesState) {
+    if (collecting && changesState) {
+        state.FromPersistant(changesState);
+        AdvanceEdition();
+    }
+}
+
+void LineChanges::InsertText(int line, int edition, bool undoing) {
+    if (collecting && !undoing) {
+        int position = line;
+        int fillLength = 1;
+        if (state.FillRange(position, edition, fillLength)) {
+            if (fillLength > 0) {
+                AdvanceEdition();
+            }
+        }
+    }
+}
+
+void LineChanges::InsertLine(int line, int edition, bool undoing) {
+    if (collecting && !undoing) {
+        state.InsertSpace(line, 1);
+        int linePosition = line;
+        int fillLength = 1;
+        if (state.FillRange(linePosition, edition, fillLength))
+            AdvanceEdition();
+    }
+}
+
+void LineChanges::RemoveLine(int line, bool undoing) {
+    if (collecting && !undoing) {
+        state.DeleteRange(line, 1);
+        AdvanceEdition();
+    }
+}
+
+void LineChanges::EnableChangeCollection(bool collecting_, int lines) {
+    collecting = collecting_;
+    if (collecting) {
+        state.InsertSpace(0, lines);
+    }
+}
+
+void LineChanges::ClearChanged() {
+    if (collecting) {
+        int position = 0;
+        int length = state.Length();
+        if (state.FillRange(position, 0, length))
+            AdvanceEdition();
+    }
+}
+
+int LineChanges::GetChanged(int line) const {
+    if (collecting) {
+        return state.ValueAt(line);
+    }
+    return 0;
+}
+/* CHANGEBAR end */
+
 LineVector::LineVector() : starts(256), perLine(0) {
        Init();
 }
@@ -40,33 +122,78 @@ void LineVector::SetPerLine(PerLine *pl) {
        perLine = pl;
 }
 
-void LineVector::InsertText(int line, int delta) {
+/* CHANGEBAR begin */
+void LineVector::InsertText(int line, int delta, int edition, bool undoing) {
+/* CHANGEBAR end */
        starts.InsertText(line, delta);
+/* CHANGEBAR begin */
+    changes.InsertText(line, edition, undoing);
+/* CHANGEBAR end */
 }
 
-void LineVector::InsertLine(int line, int position, bool lineStart) {
+/* CHANGEBAR begin */
+void LineVector::InsertLine(int line, int position, bool lineStart, int 
edition, bool undoing) {
+/* CHANGEBAR end */
        starts.InsertPartition(line, position);
        if (perLine) {
                if ((line > 0) && lineStart)
                        line--;
                perLine->InsertLine(line);
        }
+/* CHANGEBAR begin */
+    changes.InsertLine(line, edition, undoing);
+/* CHANGEBAR end */
 }
 
 void LineVector::SetLineStart(int line, int position) {
        starts.SetPartitionStartPosition(line, position);
 }
 
-void LineVector::RemoveLine(int line) {
+/* CHANGEBAR begin */
+void LineVector::RemoveLine(int line, bool undoing) {
+/* CHANGEBAR end */
        starts.RemovePartition(line);
        if (perLine) {
                perLine->RemoveLine(line);
        }
+/* CHANGEBAR begin */
+    changes.RemoveLine(line, undoing);
+/* CHANGEBAR end */
 }
 
 int LineVector::LineFromPosition(int pos) const {
        return starts.PartitionFromPosition(pos);
 }
+/* CHANGEBAR begin */
+void LineVector::EnableChangeCollection(bool changesCollecting_) {
+    DeleteChangeCollection();
+    changes.EnableChangeCollection(changesCollecting_, Lines());
+}
+
+void LineVector::DeleteChangeCollection() {
+    changes.ClearChanged();
+}
+
+int LineVector::GetChanged(int line) const {
+    return changes.GetChanged(line);
+}
+
+int LineVector::GetChangesEdition() const {
+    return changes.GetEdition();
+}
+
+void LineVector::SetSavePoint() {
+    changes.AdvanceEdition();
+}
+
+char *LineVector::PersistantForm() const {
+    return changes.PersistantForm();
+}
+
+void LineVector::SetChanges(const char *changesState) {
+    changes.SetChanges(changesState);
+}
+/* CHANGEBAR end */
 
 Action::Action() {
        at = startAction;
@@ -137,11 +264,19 @@ UndoHistory::UndoHistory() {
        currentAction = 0;
        undoSequenceDepth = 0;
        savePoint = 0;
+/* CHANGEBAR begin */
+    savePointEffective = 0;
+
+    changeActions = 0;
+/* CHANGEBAR end */
 
        actions[currentAction].Create(startAction);
 }
 
 UndoHistory::~UndoHistory() {
+/* CHANGEBAR begin */
+    DeleteChangeHistory();
+/* CHANGEBAR end */
        delete []actions;
        actions = 0;
 }
@@ -152,6 +287,20 @@ void UndoHistory::EnsureUndoRoom() {
        if (currentAction >= (lenActions - 2)) {
                // Run out of undo nodes so extend the array
                int lenActionsNew = lenActions * 2;
+
+/* CHANGEBAR begin */
+        if (changeActions) {
+            int **changeActionsNew = new int *[lenActionsNew];
+            if (!changeActionsNew)
+                return;
+            for (int i=0;i<lenActionsNew;i++) {
+                changeActionsNew[i] = (i < lenActions) ? changeActions[i] : 0;
+            }
+            delete []changeActions;
+            changeActions = changeActionsNew;
+        }
+/* CHANGEBAR end */
+
                Action *actionsNew = new Action[lenActionsNew];
                for (int act = 0; act <= currentAction; act++)
                        actionsNew[act].Grab(&actions[act]);
@@ -161,13 +310,18 @@ void UndoHistory::EnsureUndoRoom() {
        }
 }
 
+/* CHANGEBAR begin */
 void UndoHistory::AppendAction(actionType at, int position, char *data, int 
lengthData,
-       bool &startSequence, bool mayCoalesce) {
+       bool &startSequence, char *persistantChanges, bool mayCoalesce) {
+/* CHANGEBAR end */
        EnsureUndoRoom();
        //Platform::DebugPrintf("%% %d action %d %d %d\n", at, position, 
lengthData, currentAction);
        //Platform::DebugPrintf("^ %d action %d %d\n", actions[currentAction - 
1].at,
        //      actions[currentAction - 1].position, actions[currentAction - 
1].lenData);
        if (currentAction < savePoint) {
+/* CHANGEBAR begin */
+        savePointEffective = currentAction;
+/* CHANGEBAR end */
                savePoint = -1;
        }
        int oldCurrentAction = currentAction;
@@ -226,6 +380,14 @@ void UndoHistory::AppendAction(actionType at, int 
position, char *data, int leng
        }
        startSequence = oldCurrentAction != currentAction;
        actions[currentAction].Create(at, position, data, lengthData, 
mayCoalesce);
+
+/* CHANGEBAR begin */
+    if (changeActions) {
+        delete []changeActions[currentAction];
+        changeActions[currentAction] = (int *)persistantChanges;
+    }
+/* CHANGEBAR end */
+
        currentAction++;
        actions[currentAction].Create(startAction);
        maxAction = currentAction;
@@ -269,16 +431,53 @@ void UndoHistory::DeleteUndoHistory() {
        currentAction = 0;
        actions[currentAction].Create(startAction);
        savePoint = 0;
-}
+/* CHANGEBAR begin */
+    savePointEffective = 0;
+/* CHANGEBAR end */
+}
+
+/* CHANGEBAR begin */
+void UndoHistory::DeleteChangeHistory() {
+    if (changeActions) {
+        for (int i=0;i<lenActions;i++) {
+            delete []changeActions[i];
+        }
+        delete []changeActions;
+        changeActions = 0;
+    }
+}
+
+void UndoHistory::EnableChangeHistory(bool enable) {
+    if (enable) {
+        if (!changeActions) {
+            changeActions = new int *[lenActions];
+            for (int i=0;i<lenActions;i++) {
+                changeActions[i] = 0;
+            }
+        }
+    } else {
+        DeleteChangeHistory();
+    }
+}
+/* CHANGEBAR end */
 
 void UndoHistory::SetSavePoint() {
        savePoint = currentAction;
+/* CHANGEBAR begin */
+    savePointEffective = currentAction;
+/* CHANGEBAR end */
 }
 
 bool UndoHistory::IsSavePoint() const {
        return savePoint == currentAction;
 }
 
+/* CHANGEBAR begin */
+bool UndoHistory::BeforeSavePointEffective(int action) const {
+    return action <= savePointEffective;
+}
+/* CHANGEBAR end */
+
 bool UndoHistory::CanUndo() const {
        return (currentAction > 0) && (maxAction > 0);
 }
@@ -304,6 +503,12 @@ void UndoHistory::CompletedUndoStep() {
        currentAction--;
 }
 
+/* CHANGEBAR begin */
+char *UndoHistory::GetChangesStep() const {
+    return changeActions ? (char *)changeActions[currentAction] : 0;
+}
+/* CHANGEBAR end */
+
 bool UndoHistory::CanRedo() const {
        return maxAction > currentAction;
 }
@@ -329,6 +534,12 @@ void UndoHistory::CompletedRedoStep() {
        currentAction++;
 }
 
+/* CHANGEBAR begin */
+int UndoHistory::Edition() const {
+    return currentAction;
+}
+/* CHANGEBAR end */
+
 CellBuffer::CellBuffer() {
        readOnly = false;
        collectingUndo = true;
@@ -377,10 +588,15 @@ const char *CellBuffer::InsertString(int position, const 
char *s, int insertLeng
                        for (int i = 0; i < insertLength; i++) {
                                data[i] = s[i];
                        }
-                       uh.AppendAction(insertAction, position, data, 
insertLength, startSequence);
+/* CHANGEBAR begin */
+            char *persistantForm = lv.PersistantForm();
+            uh.AppendAction(insertAction, position, data, insertLength, 
startSequence, persistantForm);
+/* CHANGEBAR end */
                }
 
-               BasicInsertString(position, s, insertLength);
+/* CHANGEBAR begin */
+        BasicInsertString(position, s, insertLength, false);
+/* CHANGEBAR end */
        }
        return data;
 }
@@ -423,10 +639,15 @@ const char *CellBuffer::DeleteChars(int position, int 
deleteLength, bool &startS
                        for (int i = 0; i < deleteLength; i++) {
                                data[i] = substance.ValueAt(position + i);
                        }
-                       uh.AppendAction(removeAction, position, data, 
deleteLength, startSequence);
+/* CHANGEBAR begin */
+            char *persistantForm = lv.PersistantForm();
+            uh.AppendAction(removeAction, position, data, deleteLength, 
startSequence, persistantForm);
+/* CHANGEBAR end */
                }
 
-               BasicDeleteChars(position, deleteLength);
+/* CHANGEBAR begin */
+        BasicDeleteChars(position, deleteLength, false);
+/* CHANGEBAR end */
        }
        return data;
 }
@@ -467,23 +688,48 @@ void CellBuffer::SetReadOnly(bool set) {
 
 void CellBuffer::SetSavePoint() {
        uh.SetSavePoint();
+/* CHANGEBAR begin */
+    lv.SetSavePoint();
+/* CHANGEBAR end */
 }
 
 bool CellBuffer::IsSavePoint() {
        return uh.IsSavePoint();
 }
 
+/* CHANGEBAR begin */
+int CellBuffer::GetChanged(int line) const {
+    int changed = lv.GetChanged(line);
+    if (changed == 0)
+        return 0;
+    else if (uh.BeforeSavePointEffective(changed))
+        return 2;
+    else
+        return 1;
+}
+
+int CellBuffer::GetChangesEdition() const {
+    return lv.GetChangesEdition();
+}
+/* CHANGEBAR end */
+
 // Without undo
 
-void CellBuffer::InsertLine(int line, int position, bool lineStart) {
-       lv.InsertLine(line, position, lineStart);
+/* CHANGEBAR begin */
+void CellBuffer::InsertLine(int line, int position, bool lineStart, int 
edition, bool undoing) {
+    lv.InsertLine(line, position, lineStart, edition, undoing);
+/* CHANGEBAR end */
 }
 
-void CellBuffer::RemoveLine(int line) {
-       lv.RemoveLine(line);
+/* CHANGEBAR begin */
+void CellBuffer::RemoveLine(int line, bool undoing) {
+    lv.RemoveLine(line, undoing);
+/* CHANGEBAR end */
 }
 
-void CellBuffer::BasicInsertString(int position, const char *s, int 
insertLength) {
+/* CHANGEBAR begin */
+void CellBuffer::BasicInsertString(int position, const char *s, int 
insertLength, bool undoing) {
+/* CHANGEBAR end */
        if (insertLength == 0)
                return;
        PLATFORM_ASSERT(insertLength > 0);
@@ -494,26 +740,34 @@ void CellBuffer::BasicInsertString(int position, const 
char *s, int insertLength
        int lineInsert = lv.LineFromPosition(position) + 1;
        bool atLineStart = lv.LineStart(lineInsert-1) == position;
        // Point all the lines after the insertion point further along in the 
buffer
-       lv.InsertText(lineInsert-1, insertLength);
+/* CHANGEBAR begin */
+    lv.InsertText(lineInsert-1, insertLength, uh.Edition(), undoing);
+/* CHANGEBAR end */
        char chPrev = substance.ValueAt(position - 1);
        char chAfter = substance.ValueAt(position + insertLength);
        if (chPrev == '\r' && chAfter == '\n') {
                // Splitting up a crlf pair at position
-               InsertLine(lineInsert, position, false);
+/* CHANGEBAR begin */
+        InsertLine(lineInsert, position, false, uh.Edition(), undoing);
+/* CHANGEBAR end */
                lineInsert++;
        }
        char ch = ' ';
        for (int i = 0; i < insertLength; i++) {
                ch = s[i];
                if (ch == '\r') {
-                       InsertLine(lineInsert, (position + i) + 1, atLineStart);
+/* CHANGEBAR begin */
+            InsertLine(lineInsert, (position + i) + 1, atLineStart, 
uh.Edition(), undoing);
+/* CHANGEBAR end */
                        lineInsert++;
                } else if (ch == '\n') {
                        if (chPrev == '\r') {
                                // Patch up what was end of line
                                lv.SetLineStart(lineInsert - 1, (position + i) 
+ 1);
                        } else {
-                               InsertLine(lineInsert, (position + i) + 1, 
atLineStart);
+/* CHANGEBAR begin */
+                InsertLine(lineInsert, (position + i) + 1, atLineStart, 
uh.Edition(), undoing);
+/* CHANGEBAR end */
                                lineInsert++;
                        }
                }
@@ -523,12 +777,16 @@ void CellBuffer::BasicInsertString(int position, const 
char *s, int insertLength
        if (chAfter == '\n') {
                if (ch == '\r') {
                        // End of line already in buffer so drop the newly 
created one
-                       RemoveLine(lineInsert - 1);
+/* CHANGEBAR begin */
+            RemoveLine(lineInsert - 1, undoing);
+/* CHANGEBAR end */
                }
        }
 }
 
-void CellBuffer::BasicDeleteChars(int position, int deleteLength) {
+/* CHANGEBAR begin */
+void CellBuffer::BasicDeleteChars(int position, int deleteLength, bool 
undoing) {
+/* CHANGEBAR end */
        if (deleteLength == 0)
                return;
 
@@ -541,7 +799,9 @@ void CellBuffer::BasicDeleteChars(int position, int 
deleteLength) {
                // to work out which lines have been removed
 
                int lineRemove = lv.LineFromPosition(position) + 1;
-               lv.InsertText(lineRemove-1, - (deleteLength));
+/* CHANGEBAR begin */
+        lv.InsertText(lineRemove-1, - (deleteLength), uh.Edition(), undoing);
+/* CHANGEBAR end */
                char chPrev = substance.ValueAt(position - 1);
                char chBefore = chPrev;
                char chNext = substance.ValueAt(position);
@@ -558,13 +818,17 @@ void CellBuffer::BasicDeleteChars(int position, int 
deleteLength) {
                        chNext = substance.ValueAt(position + i + 1);
                        if (ch == '\r') {
                                if (chNext != '\n') {
-                                       RemoveLine(lineRemove);
+/* CHANGEBAR begin */
+                    RemoveLine(lineRemove, undoing);
+/* CHANGEBAR end */
                                }
                        } else if (ch == '\n') {
                                if (ignoreNL) {
                                        ignoreNL = false;       // Further \n 
are real deletions
                                } else {
-                                       RemoveLine(lineRemove);
+/* CHANGEBAR begin */
+                    RemoveLine(lineRemove, undoing);
+/* CHANGEBAR end */
                                }
                        }
 
@@ -575,7 +839,9 @@ void CellBuffer::BasicDeleteChars(int position, int 
deleteLength) {
                char chAfter = substance.ValueAt(position + deleteLength);
                if (chBefore == '\r' && chAfter == '\n') {
                        // Using lineRemove-1 as cr ended line before start of 
deletion
-                       RemoveLine(lineRemove - 1);
+/* CHANGEBAR begin */
+            RemoveLine(lineRemove - 1, undoing);
+/* CHANGEBAR end */
                        lv.SetLineStart(lineRemove - 1, position + 1);
                }
        }
@@ -603,13 +869,36 @@ void CellBuffer::EndUndoAction() {
 
 void CellBuffer::AddUndoAction(int token, bool mayCoalesce) {
        bool startSequence;
-       uh.AppendAction(containerAction, token, 0, 0, startSequence, 
mayCoalesce);
+/* CHANGEBAR begin */
+       char *persistantForm = lv.PersistantForm();
+       uh.AppendAction(containerAction, token, 0, 0, startSequence, 
persistantForm, mayCoalesce);
+/* CHANGEBAR end */
 }
 
-void CellBuffer::DeleteUndoHistory() {
+/* CHANGEBAR begin */
+void CellBuffer::DeleteUndoHistory(bool collectChangeHistory) {
+/* CHANGEBAR end */
        uh.DeleteUndoHistory();
+/* CHANGEBAR begin */
+    uh.EnableChangeHistory(collectChangeHistory);
+    lv.EnableChangeCollection(collectChangeHistory);
+/* CHANGEBAR end */
+}
+
+/* CHANGEBAR begin */
+bool CellBuffer::SetChangeCollection(bool collectChange) {
+       uh.EnableChangeHistory(collectChange);
+       lv.EnableChangeCollection(collectChange);
+       return collectChange;
 }
 
+void CellBuffer::DeleteChangeCollection() {
+    uh.DeleteChangeHistory();
+    lv.DeleteChangeCollection();
+}
+/* CHANGEBAR end */
+
+
 bool CellBuffer::CanUndo() {
        return uh.CanUndo();
 }
@@ -623,11 +912,19 @@ const Action &CellBuffer::GetUndoStep() const {
 }
 
 void CellBuffer::PerformUndoStep() {
+/* CHANGEBAR begin */
+    const char *changesState = uh.GetChangesStep();
+    lv.SetChanges(changesState);
+/* CHANGEBAR end */
        const Action &actionStep = uh.GetUndoStep();
        if (actionStep.at == insertAction) {
-               BasicDeleteChars(actionStep.position, actionStep.lenData);
+/* CHANGEBAR begin */
+        BasicDeleteChars(actionStep.position, actionStep.lenData, true);
+/* CHANGEBAR end */
        } else if (actionStep.at == removeAction) {
-               BasicInsertString(actionStep.position, actionStep.data, 
actionStep.lenData);
+/* CHANGEBAR begin */
+        BasicInsertString(actionStep.position, actionStep.data, 
actionStep.lenData, true);
+/* CHANGEBAR end */
        }
        uh.CompletedUndoStep();
 }
@@ -647,10 +944,19 @@ const Action &CellBuffer::GetRedoStep() const {
 void CellBuffer::PerformRedoStep() {
        const Action &actionStep = uh.GetRedoStep();
        if (actionStep.at == insertAction) {
-               BasicInsertString(actionStep.position, actionStep.data, 
actionStep.lenData);
+/* CHANGEBAR begin */
+        BasicInsertString(actionStep.position, actionStep.data, 
actionStep.lenData, false);
+/* CHANGEBAR end */
        } else if (actionStep.at == removeAction) {
-               BasicDeleteChars(actionStep.position, actionStep.lenData);
+/* CHANGEBAR begin */
+        BasicDeleteChars(actionStep.position, actionStep.lenData, false);
+/* CHANGEBAR end */
        }
        uh.CompletedRedoStep();
+/* CHANGEBAR begin */
+    if (IsSavePoint()) {
+        lv.SetSavePoint();
+    }
+/* CHANGEBAR end */
 }
 
diff --git a/scintilla/CellBuffer.h b/scintilla/CellBuffer.h
index 78f586e..05098d9 100644
--- a/scintilla/CellBuffer.h
+++ b/scintilla/CellBuffer.h
@@ -21,6 +21,29 @@ public:
        virtual void RemoveLine(int)=0;
 };
 
+/* CHANGEBAR begin */
+#include "RunStyles.h" 
+class LineChanges { 
+    bool collecting; 
+    RunStyles state; 
+    int edition; 
+public: 
+    LineChanges(); 
+    ~LineChanges(); 
+    void AdvanceEdition(); 
+    int GetEdition() const; 
+    char *PersistantForm() const; 
+    void SetChanges(const char *changesState); 
+    void InsertText(int line, int edition, bool undoing); 
+    void InsertLine(int line, int edition, bool undoing);
+    void RemoveLine(int line, bool undoing); 
+    void EnableChangeCollection(bool collecting_, int lines); 
+    void ClearChanged(); 
+    int GetChanged(int line) const; 
+}; 
+/* CHANGEBAR end */
+ 
+
 /**
  * The line vector contains information about each of the lines in a cell 
buffer.
  */
@@ -28,6 +51,9 @@ class LineVector {
 
        Partitioning starts;
        PerLine *perLine;
+/* CHANGEBAR begin */
+    LineChanges changes; 
+/* CHANGEBAR end */
 
 public:
 
@@ -36,10 +62,14 @@ public:
        void Init();
        void SetPerLine(PerLine *pl);
 
-       void InsertText(int line, int delta);
-       void InsertLine(int line, int position, bool lineStart);
+/* CHANGEBAR begin */
+    void InsertText(int line, int delta, int edition, bool undoing); 
+    void InsertLine(int line, int position, bool lineStart, int edition, bool 
undoing);
+/* CHANGEBAR end */
        void SetLineStart(int line, int position);
-       void RemoveLine(int line);
+/* CHANGEBAR begin */
+    void RemoveLine(int line, bool undoing); 
+/* CHANGEBAR end */
        int Lines() const {
                return starts.Partitions();
        }
@@ -63,6 +93,17 @@ public:
        int GetLineState(int line);
        int GetMaxLineState();
 
+ 
+/* CHANGEBAR begin */
+    void EnableChangeCollection(bool changesCollecting_); 
+    void DeleteChangeCollection(); 
+    int GetChanged(int line) const; 
+    void SetSavePoint(); 
+    int GetChangesEdition() const; 
+    void PerformingUndo(bool undo); 
+    char *PersistantForm() const; 
+    void SetChanges(const char *changesState); 
+/* CHANGEBAR end */
 };
 
 enum actionType { insertAction, removeAction, startAction, containerAction };
@@ -95,6 +136,10 @@ class UndoHistory {
        int currentAction;
        int undoSequenceDepth;
        int savePoint;
+/* CHANGEBAR begin */
+    int savePointEffective; 
+    int **changeActions; 
+/* CHANGEBAR end */
 
        void EnsureUndoRoom();
 
@@ -102,17 +147,27 @@ public:
        UndoHistory();
        ~UndoHistory();
 
-       void AppendAction(actionType at, int position, char *data, int length, 
bool &startSequence, bool mayCoalesce=true);
+/* CHANGEBAR begin */
+       void AppendAction(actionType at, int position, char *data, int length, 
bool &startSequence, char *persistantChanges, bool mayCoalesce=true);
+/* CHANGEBAR end */
 
        void BeginUndoAction();
        void EndUndoAction();
        void DropUndoSequence();
        void DeleteUndoHistory();
 
+/* CHANGEBAR begin */
+    void DeleteChangeHistory(); 
+    void EnableChangeHistory(bool enable); 
+/* CHANGEBAR end */
+ 
        /// The save point is a marker in the undo stack where the container 
has stated that
        /// the buffer was saved. Undo and redo can move over the save point.
        void SetSavePoint();
        bool IsSavePoint() const;
+/* CHANGEBAR begin */
+    bool BeforeSavePointEffective(int action) const; 
+/* CHANGEBAR end */
 
        /// To perform an undo, StartUndo is called to retrieve the number of 
steps, then UndoStep is
        /// called that many times. Similarly for redo.
@@ -120,10 +175,17 @@ public:
        int StartUndo();
        const Action &GetUndoStep() const;
        void CompletedUndoStep();
+/* CHANGEBAR begin */
+    char *GetChangesStep() const; 
+/* CHANGEBAR end */
        bool CanRedo() const;
        int StartRedo();
        const Action &GetRedoStep() const;
        void CompletedRedoStep();
+ 
+/* CHANGEBAR begin */
+    int Edition() const; 
+/* CHANGEBAR end */
 };
 
 /**
@@ -159,8 +221,10 @@ public:
        int Lines() const;
        int LineStart(int line) const;
        int LineFromPosition(int pos) const { return lv.LineFromPosition(pos); }
-       void InsertLine(int line, int position, bool lineStart);
-       void RemoveLine(int line);
+/* CHANGEBAR begin */
+    void InsertLine(int line, int position, bool lineStart, int edition, bool 
undoing);
+    void RemoveLine(int line, bool undoing); 
+/* CHANGEBAR end */
        const char *InsertString(int position, const char *s, int insertLength, 
bool &startSequence);
 
        /// Setting styles for positions outside the range of the buffer is 
safe and has no effect.
@@ -178,16 +242,28 @@ public:
        void SetSavePoint();
        bool IsSavePoint();
 
+/* CHANGEBAR begin */
+    void EnableChangeCollection(bool changesCollecting_); 
+    bool SetChangeCollection(bool collectChange);
+    void DeleteChangeCollection();
+    int GetChanged(int line) const; 
+    int GetChangesEdition() const; 
+/* CHANGEBAR end */
+ 
        /// Actions without undo
-       void BasicInsertString(int position, const char *s, int insertLength);
-       void BasicDeleteChars(int position, int deleteLength);
+/* CHANGEBAR begin */
+    void BasicInsertString(int position, const char *s, int insertLength, bool 
undoing); 
+    void BasicDeleteChars(int position, int deleteLength, bool undoing); 
+/* CHANGEBAR end */
 
        bool SetUndoCollection(bool collectUndo);
        bool IsCollectingUndo() const;
        void BeginUndoAction();
        void EndUndoAction();
        void AddUndoAction(int token, bool mayCoalesce);
-       void DeleteUndoHistory();
+/* CHANGEBAR begin */
+    void DeleteUndoHistory(bool collectChangeHistory); 
+/* CHANGEBAR end */
 
        /// To perform an undo, StartUndo is called to retrieve the number of 
steps, then UndoStep is
        /// called that many times. Similarly for redo.
diff --git a/scintilla/Document.cxx b/scintilla/Document.cxx
index 3c90d1f..57dc30a 100644
--- a/scintilla/Document.cxx
+++ b/scintilla/Document.cxx
@@ -148,7 +148,15 @@ int Document::Release() {
 }
 
 void Document::SetSavePoint() {
+/* CHANGEBAR begin */
+    int changesEdition = cb.GetChangesEdition(); 
+/* CHANGEBAR end */
        cb.SetSavePoint();
+/* CHANGEBAR begin */
+    if (cb.GetChangesEdition() != changesEdition) { 
+        NotifyModified(DocModification(SC_MOD_CHANGEMARKER, 0, 0, 0, 0, -1)); 
+    } 
+/* CHANGEBAR end */
        NotifySavePoint(true);
 }
 
@@ -504,6 +512,10 @@ bool Document::DeleteChars(int pos, int len) {
                                SC_MOD_BEFOREDELETE | SC_PERFORMED_USER,
                                pos, len,
                                0, 0));
+ 
+/* CHANGEBAR begin */
+            int changesEdition = cb.GetChangesEdition(); 
+/* CHANGEBAR end */
                        int prevLinesTotal = LinesTotal();
                        bool startSavePoint = cb.IsSavePoint();
                        bool startSequence = false;
@@ -514,9 +526,15 @@ bool Document::DeleteChars(int pos, int len) {
                                ModifiedAt(pos);
                        else
                                ModifiedAt(pos-1);
+/* CHANGEBAR begin */
+            int changeBarFlags = (cb.GetChangesEdition() == changesEdition) ?  
+                0 : SC_MOD_CHANGEMARKER | SC_MOD_CHANGEFOLD; 
+/* CHANGEBAR end */
                        NotifyModified(
                            DocModification(
-                               SC_MOD_DELETETEXT | SC_PERFORMED_USER | 
(startSequence?SC_STARTACTION:0),
+/* CHANGEBAR begin */
+                    SC_MOD_DELETETEXT | SC_PERFORMED_USER | 
(startSequence?SC_STARTACTION:0) | changeBarFlags, 
+/* CHANGEBAR end */
                                pos, len,
                                LinesTotal() - prevLinesTotal, text));
                }
@@ -543,6 +561,10 @@ bool Document::InsertString(int position, const char *s, 
int insertLength) {
                                SC_MOD_BEFOREINSERT | SC_PERFORMED_USER,
                                position, insertLength,
                                0, s));
+ 
+/* CHANGEBAR begin */
+            int changesEdition = cb.GetChangesEdition(); 
+/* CHANGEBAR end */
                        int prevLinesTotal = LinesTotal();
                        bool startSavePoint = cb.IsSavePoint();
                        bool startSequence = false;
@@ -550,9 +572,15 @@ bool Document::InsertString(int position, const char *s, 
int insertLength) {
                        if (startSavePoint && cb.IsCollectingUndo())
                                NotifySavePoint(!startSavePoint);
                        ModifiedAt(position);
+/* CHANGEBAR begin */
+            int changeBarFlags = (cb.GetChangesEdition() == changesEdition) ?  
+                0 : SC_MOD_CHANGEMARKER | SC_MOD_CHANGEFOLD; 
+/* CHANGEBAR end */
                        NotifyModified(
                            DocModification(
-                               SC_MOD_INSERTTEXT | SC_PERFORMED_USER | 
(startSequence?SC_STARTACTION:0),
+/* CHANGEBAR begin */
+                    SC_MOD_INSERTTEXT | SC_PERFORMED_USER | 
(startSequence?SC_STARTACTION:0) | changeBarFlags, 
+/* CHANGEBAR end */
                                position, insertLength,
                                LinesTotal() - prevLinesTotal, text));
                }
@@ -569,6 +597,9 @@ int Document::Undo() {
                if (!cb.IsReadOnly()) {
                        bool startSavePoint = cb.IsSavePoint();
                        bool multiLine = false;
+/* CHANGEBAR begin */
+            int changesEdition = cb.GetChangesEdition(); 
+/* CHANGEBAR end */
                        int steps = cb.StartUndo();
                        //Platform::DebugPrintf("Steps=%d\n", steps);
                        for (int step = 0; step < steps; step++) {
@@ -610,6 +641,11 @@ int Document::Undo() {
                                        if (multiLine)
                                                modFlags |= 
SC_MULTILINEUNDOREDO;
                                }
+/* CHANGEBAR begin */
+                int changeBarFlags = (cb.GetChangesEdition() == 
changesEdition) ?  
+                    0 : SC_MOD_CHANGEMARKER | SC_MOD_CHANGEFOLD; 
+                modFlags |= changeBarFlags; 
+/* CHANGEBAR end */
                                NotifyModified(DocModification(modFlags, 
cellPosition, action.lenData,
                                                                                
           linesAdded, action.data));
                        }
@@ -631,6 +667,9 @@ int Document::Redo() {
                if (!cb.IsReadOnly()) {
                        bool startSavePoint = cb.IsSavePoint();
                        bool multiLine = false;
+/* CHANGEBAR begin */
+            int changesEdition = cb.GetChangesEdition(); 
+/* CHANGEBAR end */
                        int steps = cb.StartRedo();
                        for (int step = 0; step < steps; step++) {
                                const int prevLinesTotal = LinesTotal();
@@ -669,6 +708,11 @@ int Document::Redo() {
                                        if (multiLine)
                                                modFlags |= 
SC_MULTILINEUNDOREDO;
                                }
+/* CHANGEBAR begin */
+                int changeBarFlags = (cb.GetChangesEdition() == 
changesEdition) ?  
+                    0 : SC_MOD_CHANGEMARKER | SC_MOD_CHANGEFOLD; 
+                modFlags |= changeBarFlags; 
+/* CHANGEBAR end */
                                NotifyModified(
                                        DocModification(modFlags, 
action.position, action.lenData,
                                                                        
linesAdded, action.data));
diff --git a/scintilla/Document.h b/scintilla/Document.h
index 1c270a5..0bd0a04 100644
--- a/scintilla/Document.h
+++ b/scintilla/Document.h
@@ -213,11 +213,19 @@ public:
        int Redo();
        bool CanUndo() { return cb.CanUndo(); }
        bool CanRedo() { return cb.CanRedo(); }
-       void DeleteUndoHistory() { cb.DeleteUndoHistory(); }
+/* CHANGEBAR begin */
+    void DeleteUndoHistory(bool collectChangeHistory=false) { 
cb.DeleteUndoHistory(collectChangeHistory); } 
+/* CHANGEBAR end */
        bool SetUndoCollection(bool collectUndo) {
                return cb.SetUndoCollection(collectUndo);
        }
        bool IsCollectingUndo() { return cb.IsCollectingUndo(); }
+/* CHANGEBAR begin */
+    void DeleteChangeCollection() { cb.DeleteChangeCollection(); } 
+       bool SetChangeCollection(bool collectChange) {
+               return cb.SetChangeCollection(collectChange);
+       }
+/* CHANGEBAR end */
        void BeginUndoAction() { cb.BeginUndoAction(); }
        void EndUndoAction() { cb.EndUndoAction(); }
        void AddUndoAction(int token, bool mayCoalesce) { 
cb.AddUndoAction(token, mayCoalesce); }
@@ -265,6 +273,9 @@ public:
        void ClearLevels();
        int GetLastChild(int lineParent, int level=-1);
        int GetFoldParent(int line);
+/* CHANGEBAR begin */
+    int GetChanged(int line) { return cb.GetChanged(line); } 
+/* CHANGEBAR end */
 
        void Indent(bool forwards);
        int ExtendWordSelect(int pos, int delta, bool onlyWordCharacters=false);
diff --git a/scintilla/Editor.cxx b/scintilla/Editor.cxx
index 2bc6580..e16b837 100644
--- a/scintilla/Editor.cxx
+++ b/scintilla/Editor.cxx
@@ -1750,6 +1750,14 @@ void Editor::PaintSelMargin(Surface *surfWindow, 
PRectangle &rc) {
                                        }
                                }
 
+/* CHANGEBAR begin */
+                int changed = pdoc->GetChanged(lineDoc);
+                if (changed == 1)
+                    marks |= 1 << SC_MARKNUM_CHANGEUNSAVED;
+                if (changed == 2)
+                    marks |= 1 << SC_MARKNUM_CHANGESAVED;
+/* CHANGEBAR end */
+
                                marks &= vs.ms[margin].mask;
                                PRectangle rcMarker = rcSelMargin;
                                rcMarker.top = yposScreen;
@@ -6726,9 +6734,75 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t 
wParam, sptr_t lParam) {
                return (pdoc->CanUndo() && !pdoc->IsReadOnly()) ? 1 : 0;
 
        case SCI_EMPTYUNDOBUFFER:
-               pdoc->DeleteUndoHistory();
+/* CHANGEBAR begin */
+        pdoc->DeleteUndoHistory(wParam != 0);
+        Redraw();
+/* CHANGEBAR end */
+               return 0;
+
+/* CHANGEBAR begin */
+       case SCI_SETCHANGECOLLECTION:
+        pdoc->SetChangeCollection(wParam != 0);
                return 0;
 
+       case SCI_GETCHANGEDLINE: {
+           int fromLine = static_cast<int>(wParam);
+           if (fromLine < 0)
+           {
+            fromLine = 0;
+           }
+           int toLine = static_cast<int>(lParam);
+           if (toLine > pdoc->LinesTotal())
+           {
+               toLine = pdoc->LinesTotal();
+           }
+
+           if(fromLine <= toLine)
+           {
+            for (int i = fromLine; i <= toLine; i++)
+            {
+                if(pdoc->GetChanged(i) != 0)
+                {
+                    return i;
+                }
+            }
+            // if nothing found we wrap and start from the beginning
+            if (fromLine > 0)
+            {
+                for (int i = 0; i <= fromLine; i++)
+                {
+                    if(pdoc->GetChanged(i) != 0)
+                    {
+                        return i;
+                    }
+                }
+            }
+           }
+           else
+           {
+            for (int i = fromLine; i >= toLine; i--)
+            {
+                if(pdoc->GetChanged(i) != 0)
+                {
+                    return i;
+                }
+            }
+            // if nothing found we wrap and start from the end
+            if (fromLine < (pdoc->LinesTotal() - 1))
+            {
+                for (int i = (pdoc->LinesTotal() - 1); i >= fromLine; i--)
+                {
+                    if(pdoc->GetChanged(i) != 0)
+                    {
+                        return i;
+                    }
+                }
+            }
+           }
+           return -1;
+       }
+/* CHANGEBAR end */
+
        case SCI_GETFIRSTVISIBLELINE:
                return topLine;
 
diff --git a/scintilla/RunStyles.cxx b/scintilla/RunStyles.cxx
index ae32c73..446b1ec 100644
--- a/scintilla/RunStyles.cxx
+++ b/scintilla/RunStyles.cxx
@@ -214,3 +214,45 @@ void RunStyles::DeleteRange(int position, int 
deleteLength) {
        }
 }
 
+/* CHANGEBAR begin */
+char *RunStyles::PersistantForm() const { 
+    int len = starts->Partitions(); 
+    char *form = new char[(len * 2 + 1) * sizeof(int)]; 
+    int *data = reinterpret_cast<int *>(form); 
+    data[0] = len; 
+    for (int i=0;i<len;i++) { 
+        data[i*2+1] =     starts->PositionFromPartition(i+1) - 
starts->PositionFromPartition(i); 
+        data[i*2+2] = styles->ValueAt(i); 
+    } 
+    return form; 
+}
+ 
+void RunStyles::FromPersistant(const char *form) { 
+    DeleteAll(); 
+    const int *data = reinterpret_cast<const int *>(form); 
+    int len = data[0]; 
+    int pos = 0; 
+    for (int i=0;i<len;i++) { 
+        int runLength = data[i*2+1]; 
+        int value = data[i*2+2]; 
+        InsertSpace(pos, runLength); 
+        int posTemp = pos; 
+        int fillLength = runLength; 
+        FillRange(posTemp, value, fillLength); 
+        pos += runLength; 
+    } 
+}
+ 
+bool RunStyles::PersistantSame(const char *form1, const char *form2) { 
+    const int *data1 = reinterpret_cast<const int *>(form1); 
+    const int *data2 = reinterpret_cast<const int *>(form2); 
+    if (data1[0] != data2[0])  
+        return false; 
+    int len = data1[0]; 
+    for (int i=1;i<len*2+1;i++) { 
+        if (data1[i] != data2[i])  
+            return false; 
+    } 
+    return true; 
+} 
+/* CHANGEBAR end */
diff --git a/scintilla/RunStyles.h b/scintilla/RunStyles.h
index 0a333ca..e2734a6 100644
--- a/scintilla/RunStyles.h
+++ b/scintilla/RunStyles.h
@@ -37,6 +37,12 @@ public:
        void InsertSpace(int position, int insertLength);
        void DeleteAll();
        void DeleteRange(int position, int deleteLength);
+ 
+/* CHANGEBAR begin */
+    char *PersistantForm() const; 
+    void FromPersistant(const char *form); 
+    static bool PersistantSame(const char *form1, const char *form2); 
+/* CHANGEBAR end */
 };
 
 #ifdef SCI_NAMESPACE
diff --git a/scintilla/include/Scintilla.h b/scintilla/include/Scintilla.h
index b91c78c..f70f8b7 100644
--- a/scintilla/include/Scintilla.h
+++ b/scintilla/include/Scintilla.h
@@ -126,6 +126,10 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int 
iMessage, uptr_t wParam,
 #define SC_MARK_AVAILABLE 28
 #define SC_MARK_UNDERLINE 29
 #define SC_MARK_CHARACTER 10000
+/* CHANGEBAR begin */
+#define SC_MARKNUM_CHANGEUNSAVED 23 
+#define SC_MARKNUM_CHANGESAVED 24 
+/* CHANGEBAR end */
 #define SC_MARKNUM_FOLDEREND 25
 #define SC_MARKNUM_FOLDEROPENMID 26
 #define SC_MARKNUM_FOLDERMIDTAIL 27
@@ -133,7 +137,9 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int 
iMessage, uptr_t wParam,
 #define SC_MARKNUM_FOLDERSUB 29
 #define SC_MARKNUM_FOLDER 30
 #define SC_MARKNUM_FOLDEROPEN 31
-#define SC_MASK_FOLDERS 0xFE000000
+/* CHANGEBAR begin */
+#define SC_MASK_FOLDERS 0xFF800000 
+/* CHANGEBAR end */
 #define SCI_MARKERDEFINE 2040
 #define SCI_MARKERSETFORE 2041
 #define SCI_MARKERSETBACK 2042
@@ -152,6 +158,9 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int 
iMessage, uptr_t wParam,
 #define SC_MARGIN_FORE 3
 #define SC_MARGIN_TEXT 4
 #define SC_MARGIN_RTEXT 5
+/* CHANGEBAR begin */
+#define SC_MARGIN_CHANGED 6
+/* CHANGEBAR end */
 #define SCI_SETMARGINTYPEN 2240
 #define SCI_GETMARGINTYPEN 2241
 #define SCI_SETMARGINWIDTHN 2242
@@ -402,6 +411,10 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int 
iMessage, uptr_t wParam,
 #define SCI_VISIBLEFROMDOCLINE 2220
 #define SCI_DOCLINEFROMVISIBLE 2221
 #define SCI_WRAPCOUNT 2235
+/* CHANGEBAR begin */
+#define SCI_SETCHANGECOLLECTION 2236
+#define SCI_GETCHANGEDLINE 2237
+/* CHANGEBAR end */
 #define SC_FOLDLEVELBASE 0x400
 #define SC_FOLDLEVELWHITEFLAG 0x1000
 #define SC_FOLDLEVELHEADERFLAG 0x2000
diff --git a/scintilla/include/Scintilla.iface 
b/scintilla/include/Scintilla.iface
index 7d64f2d..154413d 100644
--- a/scintilla/include/Scintilla.iface
+++ b/scintilla/include/Scintilla.iface
@@ -275,7 +275,11 @@ val SC_MARK_UNDERLINE=29
 val SC_MARK_CHARACTER=10000
 
 enu MarkerOutline=SC_MARKNUM_
-# Markers used for outlining column.
+# CHANGEBAR begin #
+# Markers used for outlining and changed column. 
+val SC_MARKNUM_CHANGEUNSAVED=23 
+val SC_MARKNUM_CHANGESAVED=24 
+# CHANGEBAR end #
 val SC_MARKNUM_FOLDEREND=25
 val SC_MARKNUM_FOLDEROPENMID=26
 val SC_MARKNUM_FOLDERMIDTAIL=27
@@ -329,6 +333,9 @@ val SC_MARGIN_BACK=2
 val SC_MARGIN_FORE=3
 val SC_MARGIN_TEXT=4
 val SC_MARGIN_RTEXT=5
+# CHANGEBAR begin #
+val SC_MARGIN_CHANGED=6
+# CHANGEBAR end #
 
 # Set a margin to be either numeric or symbolic.
 set void SetMarginTypeN=2240(int margin, int marginType)
diff --git a/src/editor.c b/src/editor.c
index d51623a..af602fa 100644
--- a/src/editor.c
+++ b/src/editor.c
@@ -373,7 +373,7 @@ static void on_margin_click(GeanyEditor *editor, 
SCNotification *nt)
                sci_toggle_marker_at_line(editor->sci, line, 1);        /* 
toggle the marker */
        }
        /* left click on the folding margin to toggle folding state of current 
line */
-       else if (nt->margin == 2 && editor_prefs.folding)
+       else if (nt->margin == 3 && editor_prefs.folding)
        {
                gint line = sci_get_line_from_position(editor->sci, 
nt->position);
                editor_toggle_fold(editor, line, nt->modifiers);
diff --git a/src/highlighting.c b/src/highlighting.c
index c5794de..5d71fd7 100644
--- a/src/highlighting.c
+++ b/src/highlighting.c
@@ -679,9 +679,26 @@ static void styleset_common(ScintillaObject *sci, 
filetype_id ft_id)
        SSM(sci, SCI_MARKERSETBACK, 1, 
invert(common_style_set.styling[GCS_MARKER_MARK].background));
        SSM(sci, SCI_MARKERSETALPHA, 1, 
common_style_set.styling[GCS_MARKER_TRANSLUCENCY].background);
 
-       /* 2 -> folding marker, other folding settings */
+       /* 2 -> changebar */
+       guint mask = (1 << SC_MARKNUM_CHANGEUNSAVED) | (1 << 
SC_MARKNUM_CHANGESAVED);
+
        SSM(sci, SCI_SETMARGINTYPEN, 2, SC_MARGIN_SYMBOL);
-       SSM(sci, SCI_SETMARGINMASKN, 2, SC_MASK_FOLDERS);
+       SSM(sci, SCI_SETMARGINMASKN, 2, mask);
+       SSM(sci, SCI_SETMARGINWIDTHN, 2, 4 );
+
+       SSM(sci, SCI_MARKERDEFINE, SC_MARKNUM_CHANGEUNSAVED, SC_MARK_LEFTRECT);
+       SSM(sci, SCI_MARKERSETBACK, SC_MARKNUM_CHANGEUNSAVED, 0xFF | (0xE6 << 
8) | (0x04 << 16));
+       SSM(sci, SCI_MARKERSETFORE, SC_MARKNUM_CHANGEUNSAVED, 0xFF | (0xFF << 
8) | (0xFF << 16));
+
+       SSM(sci, SCI_MARKERDEFINE, SC_MARKNUM_CHANGESAVED, SC_MARK_LEFTRECT);
+       SSM(sci, SCI_MARKERSETBACK, SC_MARKNUM_CHANGESAVED, 0x04 | (0xFF << 8) 
| (0x50 << 16));
+       SSM(sci, SCI_MARKERSETFORE, SC_MARKNUM_CHANGESAVED, 0xFF | (0xFF << 8) 
| (0xFF << 16));
+
+       SSM(sci, SCI_SETCHANGECOLLECTION, 1, 0);
+
+       /* 3 -> folding marker, other folding settings */
+       SSM(sci, SCI_SETMARGINTYPEN, 3, SC_MARGIN_SYMBOL);
+       SSM(sci, SCI_SETMARGINMASKN, 3, SC_MASK_FOLDERS ^ mask);
 
        /* drawing a horizontal line when text if folded */
        switch (common_style_set.fold_draw_line)
diff --git a/src/sciwrappers.c b/src/sciwrappers.c
index 3b00b55..0f14418 100644
--- a/src/sciwrappers.c
+++ b/src/sciwrappers.c
@@ -116,13 +116,13 @@ void sci_set_folding_margin_visible(ScintillaObject *sci, 
gboolean set)
 {
        if (set)
        {
-               SSM(sci, SCI_SETMARGINWIDTHN, 2, 12);
-               SSM(sci, SCI_SETMARGINSENSITIVEN, 2, TRUE);
+               SSM(sci, SCI_SETMARGINWIDTHN, 3, 12);
+               SSM(sci, SCI_SETMARGINSENSITIVEN, 3, TRUE);
        }
        else
        {
-               SSM(sci, SCI_SETMARGINSENSITIVEN, 2, FALSE);
-               SSM(sci, SCI_SETMARGINWIDTHN, 2, 0);
+               SSM(sci, SCI_SETMARGINSENSITIVEN, 3, FALSE);
+               SSM(sci, SCI_SETMARGINWIDTHN, 3, 0);
        }
 }
 
@@ -242,7 +242,7 @@ void sci_set_undo_collection(ScintillaObject *sci, gboolean 
set)
 
 void sci_empty_undo_buffer(ScintillaObject *sci)
 {
-       SSM(sci, SCI_EMPTYUNDOBUFFER, 0, 0);
+       SSM(sci, SCI_EMPTYUNDOBUFFER, 1, 0);
 }
 
 
-- 
1.7.0.4

_______________________________________________
Geany-devel mailing list
Geany-devel@uvena.de
http://lists.uvena.de/cgi-bin/mailman/listinfo/geany-devel

Reply via email to