Patch [#31006] Text editor undo buffer rework.
authorJustin Dailey <dail8859@yahoo.com>
Wed, 14 Nov 2012 23:10:19 +0000 (23:10 +0000)
committerJustin Dailey <dail8859@yahoo.com>
Wed, 14 Nov 2012 23:10:19 +0000 (23:10 +0000)
source/blender/blenkernel/BKE_text.h
source/blender/blenkernel/intern/text.c
source/blender/editors/space_text/text_ops.c

index 875903f..aaf88e4 100644 (file)
@@ -83,7 +83,7 @@ void  txt_sel_line            (struct Text *text);
 char*  txt_sel_to_buf          (struct Text *text);
 void   txt_insert_buf          (struct Text *text, const char *in_buffer);
 void   txt_print_undo          (struct Text *text);
-void   txt_undo_add_toop       (struct Text *text, int op, unsigned int froml, unsigned short fromc, unsigned int tol, unsigned short toc);
+void   txt_undo_add_op         (struct Text *text, int op);
 void   txt_do_undo                     (struct Text *text);
 void   txt_do_redo                     (struct Text *text);
 void   txt_split_curline       (struct Text *text);
@@ -123,24 +123,6 @@ enum {
 
 /* Undo opcodes */
 
-/* Simple main cursor movement */
-#define UNDO_CLEFT             001
-#define UNDO_CRIGHT            002
-#define UNDO_CUP               003
-#define UNDO_CDOWN             004
-
-/* Simple selection cursor movement */
-#define UNDO_SLEFT             005
-#define UNDO_SRIGHT            006
-#define UNDO_SUP               007
-#define UNDO_SDOWN             010
-
-/* Complex movement (opcode is followed
- * by 4 character line ID + a 2 character
- * position ID and opcode (repeat)) */
-#define UNDO_CTO               011
-#define UNDO_STO               012
-
 /* Complex editing */
 /* 1 - opcode is followed by 1 byte for ascii character and opcode (repeat)) */
 /* 2 - opcode is followed by 2 bytes for utf-8 character and opcode (repeat)) */
@@ -169,8 +151,6 @@ enum {
 #define UNDO_IBLOCK     030 /* Insert block */
 
 /* Misc */
-#define UNDO_SWAP       031    /* Swap cursors */
-
 #define UNDO_INDENT     032
 #define UNDO_UNINDENT   033
 #define UNDO_COMMENT    034
index d230cf8..076dc3a 100644 (file)
 
 static void txt_pop_first(Text *text);
 static void txt_pop_last(Text *text);
-static void txt_undo_add_op(Text *text, int op);
-static void txt_undo_add_block(Text *text, int op, const char *buf);
+static void txt_undo_add_blockop(Text *text, int op, const char *buf);
 static void txt_delete_line(Text *text, TextLine *line);
 static void txt_delete_sel(Text *text);
 static void txt_make_dirty(Text *text);
@@ -785,23 +784,6 @@ static void txt_curs_sel(Text *text, TextLine ***linep, int **charp)
        *linep = &text->sell; *charp = &text->selc;
 }
 
-static void txt_curs_first(Text *text, TextLine **linep, int *charp)
-{
-       if (text->curl == text->sell) {
-               *linep = text->curl;
-               if (text->curc < text->selc) *charp = text->curc;
-               else *charp = text->selc;
-       }
-       else if (txt_get_span(text->lines.first, text->curl) < txt_get_span(text->lines.first, text->sell)) {
-               *linep = text->curl;
-               *charp = text->curc;
-       }
-       else {
-               *linep = text->sell;
-               *charp = text->selc;
-       }
-}
-
 /*****************************/
 /* Cursor movement functions */
 /*****************************/
@@ -843,13 +825,11 @@ void txt_move_up(Text *text, short sel)
 {
        TextLine **linep;
        int *charp;
-       /* int old; */ /* UNUSED */
        
        if (!text) return;
        if (sel) txt_curs_sel(text, &linep, &charp);
        else { txt_pop_first(text); txt_curs_cur(text, &linep, &charp); }
        if (!*linep) return;
-       /* old = *charp; */ /* UNUSED */
 
        if ((*linep)->prev) {
                int index = txt_utf8_offset_to_index((*linep)->line, *charp);
@@ -857,8 +837,6 @@ void txt_move_up(Text *text, short sel)
                if (index > txt_utf8_len((*linep)->line)) *charp = (*linep)->len;
                else *charp = txt_utf8_index_to_offset((*linep)->line, index);
                
-               if (!undoing)
-                       txt_undo_add_op(text, sel ? UNDO_SUP : UNDO_CUP);
        }
        else {
                txt_move_bol(text, sel);
@@ -871,22 +849,17 @@ void txt_move_down(Text *text, short sel)
 {
        TextLine **linep;
        int *charp;
-       /* int old; */ /* UNUSED */
        
        if (!text) return;
        if (sel) txt_curs_sel(text, &linep, &charp);
        else { txt_pop_last(text); txt_curs_cur(text, &linep, &charp); }
        if (!*linep) return;
-       /* old = *charp; */ /* UNUSED */
 
        if ((*linep)->next) {
                int index = txt_utf8_offset_to_index((*linep)->line, *charp);
                *linep = (*linep)->next;
                if (index > txt_utf8_len((*linep)->line)) *charp = (*linep)->len;
                else *charp = txt_utf8_index_to_offset((*linep)->line, index);
-               
-               if (!undoing)
-                       txt_undo_add_op(text, sel ? UNDO_SDOWN : UNDO_CDOWN);
        }
        else {
                txt_move_eol(text, sel);
@@ -898,7 +871,7 @@ void txt_move_down(Text *text, short sel)
 void txt_move_left(Text *text, short sel) 
 {
        TextLine **linep;
-       int *charp, oundoing = undoing;
+       int *charp;
        int tabsize = 0, i = 0;
        
        if (!text) return;
@@ -906,8 +879,6 @@ void txt_move_left(Text *text, short sel)
        else { txt_pop_first(text); txt_curs_cur(text, &linep, &charp); }
        if (!*linep) return;
 
-       undoing = 1;
-
        if (*charp == 0) {
                if ((*linep)->prev) {
                        txt_move_up(text, sel);
@@ -939,24 +910,19 @@ void txt_move_left(Text *text, short sel)
                }
        }
 
-       undoing = oundoing;
-       if (!undoing) txt_undo_add_op(text, sel ? UNDO_SLEFT : UNDO_CLEFT);
-       
        if (!sel) txt_pop_sel(text);
 }
 
 void txt_move_right(Text *text, short sel) 
 {
        TextLine **linep;
-       int *charp, oundoing = undoing, do_tab = FALSE, i;
+       int *charp, do_tab = FALSE, i;
        
        if (!text) return;
        if (sel) txt_curs_sel(text, &linep, &charp);
        else { txt_pop_last(text); txt_curs_cur(text, &linep, &charp); }
        if (!*linep) return;
 
-       undoing = 1;
-
        if (*charp == (*linep)->len) {
                if ((*linep)->next) {
                        txt_move_down(text, sel);
@@ -984,124 +950,103 @@ void txt_move_right(Text *text, short sel)
                else (*charp) += BLI_str_utf8_size((*linep)->line + *charp);
        }
        
-       undoing = oundoing;
-       if (!undoing) txt_undo_add_op(text, sel ? UNDO_SRIGHT : UNDO_CRIGHT);
-
        if (!sel) txt_pop_sel(text);
 }
 
 void txt_jump_left(Text *text, short sel)
 {
        TextLine **linep;
-       int *charp, oldc;
+       int *charp;
        
        if (!text) return;
        if (sel) txt_curs_sel(text, &linep, &charp);
        else { txt_pop_first(text); txt_curs_cur(text, &linep, &charp); }
        if (!*linep) return;
-       oldc = *charp;
 
        BLI_str_cursor_step_utf8((*linep)->line, (*linep)->len,
                                 charp, STRCUR_DIR_PREV,
                                 STRCUR_JUMP_DELIM);
        
        if (!sel) txt_pop_sel(text);
-       if (!undoing) {
-               int span = txt_get_span(text->lines.first, *linep);
-               txt_undo_add_toop(text, sel ? UNDO_STO : UNDO_CTO, span, oldc, span, (unsigned short)*charp);
-       }
 }
 
 void txt_jump_right(Text *text, short sel)
 {
        TextLine **linep;
-       int *charp, oldc;
+       int *charp;
        
        if (!text) return;
        if (sel) txt_curs_sel(text, &linep, &charp);
        else { txt_pop_last(text); txt_curs_cur(text, &linep, &charp); }
        if (!*linep) return;
-       oldc = *charp;
        
        BLI_str_cursor_step_utf8((*linep)->line, (*linep)->len,
                                 charp, STRCUR_DIR_NEXT,
                                 STRCUR_JUMP_DELIM);
        
        if (!sel) txt_pop_sel(text);
-       if (!undoing) {
-               int span = txt_get_span(text->lines.first, *linep);
-               txt_undo_add_toop(text, sel ? UNDO_STO : UNDO_CTO, span, oldc, span, (unsigned short)*charp);
-       }
 }
 
 void txt_move_bol(Text *text, short sel)
 {
        TextLine **linep;
-       int *charp, old;
+       int *charp;
        
        if (!text) return;
        if (sel) txt_curs_sel(text, &linep, &charp);
        else txt_curs_cur(text, &linep, &charp);
        if (!*linep) return;
-       old = *charp;
        
        *charp = 0;
 
        if (!sel) txt_pop_sel(text);
-       if (!undoing) txt_undo_add_toop(text, sel ? UNDO_STO : UNDO_CTO, txt_get_span(text->lines.first, *linep), old, txt_get_span(text->lines.first, *linep), (unsigned short)*charp);
 }
 
 void txt_move_eol(Text *text, short sel)
 {
        TextLine **linep;
-       int *charp, old;
+       int *charp;
        
        if (!text) return;
        if (sel) txt_curs_sel(text, &linep, &charp);
        else txt_curs_cur(text, &linep, &charp);
        if (!*linep) return;
-       old = *charp;
-               
+
        *charp = (*linep)->len;
 
        if (!sel) txt_pop_sel(text);
-       if (!undoing) txt_undo_add_toop(text, sel ? UNDO_STO : UNDO_CTO, txt_get_span(text->lines.first, *linep), old, txt_get_span(text->lines.first, *linep), (unsigned short)*charp);
 }
 
 void txt_move_bof(Text *text, short sel)
 {
        TextLine **linep;
-       int *charp, old;
+       int *charp;
        
        if (!text) return;
        if (sel) txt_curs_sel(text, &linep, &charp);
        else txt_curs_cur(text, &linep, &charp);
        if (!*linep) return;
-       old = *charp;
 
        *linep = text->lines.first;
        *charp = 0;
 
        if (!sel) txt_pop_sel(text);
-       if (!undoing) txt_undo_add_toop(text, sel ? UNDO_STO : UNDO_CTO, txt_get_span(text->lines.first, *linep), old, txt_get_span(text->lines.first, *linep), (unsigned short)*charp);
 }
 
 void txt_move_eof(Text *text, short sel)
 {
        TextLine **linep;
-       int *charp, old;
+       int *charp;
        
        if (!text) return;
        if (sel) txt_curs_sel(text, &linep, &charp);
        else txt_curs_cur(text, &linep, &charp);
        if (!*linep) return;
-       old = *charp;
 
        *linep = text->lines.last;
        *charp = (*linep)->len;
 
        if (!sel) txt_pop_sel(text);
-       if (!undoing) txt_undo_add_toop(text, sel ? UNDO_STO : UNDO_CTO, txt_get_span(text->lines.first, *linep), old, txt_get_span(text->lines.first, *linep), (unsigned short)*charp);
 }
 
 void txt_move_toline(Text *text, unsigned int line, short sel)
@@ -1112,16 +1057,14 @@ void txt_move_toline(Text *text, unsigned int line, short sel)
 /* Moves to a certain byte in a line, not a certain utf8-character! */
 void txt_move_to(Text *text, unsigned int line, unsigned int ch, short sel)
 {
-       TextLine **linep, *oldl;
-       int *charp, oldc;
+       TextLine **linep;
+       int *charp;
        unsigned int i;
        
        if (!text) return;
        if (sel) txt_curs_sel(text, &linep, &charp);
        else txt_curs_cur(text, &linep, &charp);
        if (!*linep) return;
-       oldc = *charp;
-       oldl = *linep;
        
        *linep = text->lines.first;
        for (i = 0; i < line; i++) {
@@ -1133,7 +1076,6 @@ void txt_move_to(Text *text, unsigned int line, unsigned int ch, short sel)
        *charp = ch;
        
        if (!sel) txt_pop_sel(text);
-       if (!undoing) txt_undo_add_toop(text, sel ? UNDO_STO : UNDO_CTO, txt_get_span(text->lines.first, oldl), oldc, txt_get_span(text->lines.first, *linep), (unsigned short)*charp);
 }
 
 /****************************/
@@ -1152,8 +1094,6 @@ static void txt_curs_swap(Text *text)
        tmpc = text->curc;
        text->curc = text->selc;
        text->selc = tmpc;
-       
-       if (!undoing) txt_undo_add_op(text, UNDO_SWAP);
 }
 
 static void txt_pop_first(Text *text)
@@ -1164,12 +1104,6 @@ static void txt_pop_first(Text *text)
        {
                txt_curs_swap(text);
        }
-
-       if (!undoing) txt_undo_add_toop(text, UNDO_STO,
-                                           txt_get_span(text->lines.first, text->sell),
-                                           text->selc,
-                                           txt_get_span(text->lines.first, text->curl),
-                                           text->curc);
        
        txt_pop_sel(text);
 }
@@ -1181,12 +1115,6 @@ static void txt_pop_last(Text *text)
        {
                txt_curs_swap(text);
        }
-
-       if (!undoing) txt_undo_add_toop(text, UNDO_STO,
-                                           txt_get_span(text->lines.first, text->sell),
-                                           text->selc,
-                                           txt_get_span(text->lines.first, text->curl),
-                                           text->curc);
        
        txt_pop_sel(text);
 }
@@ -1236,7 +1164,7 @@ static void txt_delete_sel(Text *text)
 
        if (!undoing) {
                buf = txt_sel_to_buf(text);
-               txt_undo_add_block(text, UNDO_DBLOCK, buf);
+               txt_undo_add_blockop(text, UNDO_DBLOCK, buf);
                MEM_freeN(buf);
        }
 
@@ -1517,7 +1445,7 @@ void txt_insert_buf(Text *text, const char *in_buffer)
        buffer = BLI_strdupn(in_buffer, len);
        len += txt_extended_ascii_as_utf8(&buffer);
        
-       if (!undoing) txt_undo_add_block(text, UNDO_IBLOCK, buffer);
+       if (!undoing) txt_undo_add_blockop(text, UNDO_IBLOCK, buffer);
 
        u = undoing;
        undoing = 1;
@@ -1599,6 +1527,7 @@ static void dump_buffer(Text *text)
        while (i++ < text->undo_pos) printf("%d: %d %c\n", i, text->undo_buf[i], text->undo_buf[i]);
 }
 
+/* Note: this function is outdated and must be updated if needed for future use */
 void txt_print_undo(Text *text)
 {
        int i = 0;
@@ -1615,37 +1544,7 @@ void txt_print_undo(Text *text)
        while (i <= text->undo_pos) {
                op = text->undo_buf[i];
                
-               if (op == UNDO_CLEFT) {
-                       ops = "Cursor left";
-               }
-               else if (op == UNDO_CRIGHT) {
-                       ops = "Cursor right";
-               }
-               else if (op == UNDO_CUP) {
-                       ops = "Cursor up";
-               }
-               else if (op == UNDO_CDOWN) {
-                       ops = "Cursor down";
-               }
-               else if (op == UNDO_SLEFT) {
-                       ops = "Selection left";
-               }
-               else if (op == UNDO_SRIGHT) {
-                       ops = "Selection right";
-               }
-               else if (op == UNDO_SUP) {
-                       ops = "Selection up";
-               }
-               else if (op == UNDO_SDOWN) {
-                       ops = "Selection down";
-               }
-               else if (op == UNDO_STO) {
-                       ops = "Selection ";
-               }
-               else if (op == UNDO_CTO) {
-                       ops = "Cursor ";
-               }
-               else if (op == UNDO_INSERT_1) {
+               if (op == UNDO_INSERT_1) {
                        ops = "Insert ascii ";
                }
                else if (op == UNDO_INSERT_2) {
@@ -1681,9 +1580,6 @@ void txt_print_undo(Text *text)
                else if (op == UNDO_DEL_4) {
                        ops = "Delete unicode ";
                }
-               else if (op == UNDO_SWAP) {
-                       ops = "Cursor swap";
-               }
                else if (op == UNDO_DBLOCK) {
                        ops = "Delete text block";
                }
@@ -1738,29 +1634,6 @@ void txt_print_undo(Text *text)
                                }
                        }
                }
-               else if (op == UNDO_STO || op == UNDO_CTO) {
-                       i++;
-
-                       charp = text->undo_buf[i]; i++;
-                       charp = charp + (text->undo_buf[i] << 8); i++;
-
-                       linep = text->undo_buf[i]; i++;
-                       linep = linep + (text->undo_buf[i] << 8); i++;
-                       linep = linep + (text->undo_buf[i] << 16); i++;
-                       linep = linep + (text->undo_buf[i] << 24); i++;
-                       
-                       printf("to <%d, %d> ", linep, charp);
-
-                       charp = text->undo_buf[i]; i++;
-                       charp = charp + (text->undo_buf[i] << 8); i++;
-
-                       linep = text->undo_buf[i]; i++;
-                       linep = linep + (text->undo_buf[i] << 8); i++;
-                       linep = linep + (text->undo_buf[i] << 16); i++;
-                       linep = linep + (text->undo_buf[i] << 24); i++;
-                       
-                       printf("from <%d, %d>", linep, charp);
-               }
                else if (op == UNDO_DBLOCK || op == UNDO_IBLOCK) {
                        i++;
 
@@ -1811,16 +1684,6 @@ void txt_print_undo(Text *text)
        }
 }
 
-static void txt_undo_add_op(Text *text, int op)
-{
-       if (!max_undo_test(text, 2))
-               return;
-       
-       text->undo_pos++;
-       text->undo_buf[text->undo_pos] = op;
-       text->undo_buf[text->undo_pos + 1] = 0;
-}
-
 static void txt_undo_store_uint16(char *undo_buf, int *undo_pos, unsigned short value) 
 {
        undo_buf[*undo_pos] = (value) & 0xff;
@@ -1841,17 +1704,41 @@ static void txt_undo_store_uint32(char *undo_buf, int *undo_pos, unsigned int va
        (*undo_pos)++;
 }
 
-static void txt_undo_add_block(Text *text, int op, const char *buf)
+/* store the cur cursor to the undo buffer */
+static void txt_undo_store_cur(Text *text)
+{
+       txt_undo_store_uint16(text->undo_buf, &text->undo_pos, text->curc);
+       txt_undo_store_uint32(text->undo_buf, &text->undo_pos, txt_get_span(text->lines.first, text->curl));
+}
+
+/* store the sel cursor to the undo buffer */
+static void txt_undo_store_sel(Text *text)
+{
+       txt_undo_store_uint16(text->undo_buf, &text->undo_pos, text->selc);
+       txt_undo_store_uint32(text->undo_buf, &text->undo_pos, txt_get_span(text->lines.first, text->sell));
+}
+
+/* store both cursors to the undo buffer */
+static void txt_undo_store_cursors(Text *text)
+{
+       txt_undo_store_cur(text);
+       txt_undo_store_sel(text);
+}
+
+/* store an operator along with a block of data */
+static void txt_undo_add_blockop(Text *text, int op, const char *buf)
 {
        unsigned int length = strlen(buf);
        
-       if (!max_undo_test(text, length + 11))
+       if (!max_undo_test(text, length + 11 + 12))
                return;
 
        text->undo_pos++;
        text->undo_buf[text->undo_pos] = op;
        text->undo_pos++;
        
+       txt_undo_store_cursors(text);
+
        txt_undo_store_uint32(text->undo_buf, &text->undo_pos, length);
        
        strncpy(text->undo_buf + text->undo_pos, buf, length);
@@ -1863,34 +1750,30 @@ static void txt_undo_add_block(Text *text, int op, const char *buf)
        text->undo_buf[text->undo_pos + 1] = 0;
 }
 
-void txt_undo_add_toop(Text *text, int op, unsigned int froml, unsigned short fromc, unsigned int tol, unsigned short toc)
+/* store a regular operator */
+void txt_undo_add_op(Text *text, int op)
 {
        if (!max_undo_test(text, 15))
                return;
 
-       if (froml == tol && fromc == toc) return;
-
        text->undo_pos++;
        text->undo_buf[text->undo_pos] = op;
 
        text->undo_pos++;
        
-       txt_undo_store_uint16(text->undo_buf, &text->undo_pos, fromc);
-       txt_undo_store_uint32(text->undo_buf, &text->undo_pos, froml);
-       txt_undo_store_uint16(text->undo_buf, &text->undo_pos, toc);
-       txt_undo_store_uint32(text->undo_buf, &text->undo_pos, tol);
+       txt_undo_store_cursors(text);
                
        text->undo_buf[text->undo_pos] = op;
-
-       text->undo_buf[text->undo_pos + 1] = 0;
+       text->undo_buf[text->undo_pos+1] = 0;
 }
 
+/* store an operator for a single character */
 static void txt_undo_add_charop(Text *text, int op_start, unsigned int c)
 {
        char utf8[BLI_UTF8_MAX];
        size_t i, utf8_size = BLI_str_utf8_from_unicode(c, utf8);
        
-       if (!max_undo_test(text, 3 + utf8_size))
+       if (!max_undo_test(text, 3 + utf8_size + 12))
                return;
        
        text->undo_pos++;
@@ -1899,6 +1782,8 @@ static void txt_undo_add_charop(Text *text, int op_start, unsigned int c)
                text->undo_buf[text->undo_pos] = op_start + utf8_size - 1;
                text->undo_pos++;
                
+               txt_undo_store_cur(text);
+
                for (i = 0; i < utf8_size; i++) {
                        text->undo_buf[text->undo_pos] = utf8[i];
                        text->undo_pos++;
@@ -1909,6 +1794,9 @@ static void txt_undo_add_charop(Text *text, int op_start, unsigned int c)
        else {
                text->undo_buf[text->undo_pos] = op_start + 3;
                text->undo_pos++;
+
+               txt_undo_store_cursors(text);
+
                txt_undo_store_uint32(text->undo_buf, &text->undo_pos, c);
                text->undo_buf[text->undo_pos] = op_start + 3;
        }
@@ -1934,6 +1822,29 @@ static unsigned int txt_undo_read_uint32(const char *undo_buf, int *undo_pos)
        return val;
 }
 
+/* read the cur cursor from the undo buffer */
+static void txt_undo_read_cur(const char *undo_buf, int *undo_pos, unsigned int *curln, unsigned short *curc)
+{
+       *curln = txt_undo_read_uint32(undo_buf, undo_pos);
+       *curc  = txt_undo_read_uint16(undo_buf, undo_pos);
+}
+
+/* read the sel cursor from the undo buffer */
+static void txt_undo_read_sel(const char *undo_buf, int *undo_pos, unsigned int *selln, unsigned short *selc)
+{
+       *selln = txt_undo_read_uint32(undo_buf, undo_pos);
+       *selc  = txt_undo_read_uint16(undo_buf, undo_pos);
+}
+
+/* read both cursors from the undo buffer */
+static void txt_undo_read_cursors(const char *undo_buf, int *undo_pos,
+                                  unsigned int *curln, unsigned short *curc,
+                                  unsigned int *selln, unsigned short *selc)
+{
+       txt_undo_read_sel(undo_buf, undo_pos, selln, selc);
+       txt_undo_read_cur(undo_buf, undo_pos, curln, curc);
+}
+
 static unsigned int txt_undo_read_unicode(const char *undo_buf, int *undo_pos, short bytes)
 {
        unsigned int unicode;
@@ -1986,6 +1897,29 @@ static unsigned int txt_redo_read_uint32(const char *undo_buf, int *undo_pos)
        return val;
 }
 
+/* redo read cur cursor from the undo buffer */
+static void txt_redo_read_cur(const char *undo_buf, int *undo_pos, unsigned int *curln, unsigned short *curc)
+{
+       *curc  = txt_redo_read_uint16(undo_buf, undo_pos);
+       *curln = txt_redo_read_uint32(undo_buf, undo_pos);
+}
+
+/* redo read sel cursor from the undo buffer */
+static void txt_redo_read_sel(const char *undo_buf, int *undo_pos, unsigned int *selln, unsigned short *selc)
+{
+       *selc  = txt_redo_read_uint16(undo_buf, undo_pos);
+       *selln = txt_redo_read_uint32(undo_buf, undo_pos);
+}
+
+/* redo read both cursors from the undo buffer */
+static void txt_redo_read_cursors(const char *undo_buf, int *undo_pos,
+                                  unsigned int *curln, unsigned short *curc,
+                                  unsigned int *selln, unsigned short *selc)
+{
+       txt_redo_read_cur(undo_buf, undo_pos, curln, curc);
+       txt_redo_read_sel(undo_buf, undo_pos, selln, selc);
+}
+
 static unsigned int txt_redo_read_unicode(const char *undo_buf, int *undo_pos, short bytes)
 {
        unsigned int unicode;
@@ -2024,9 +1958,10 @@ void txt_do_undo(Text *text)
 {
        int op = text->undo_buf[text->undo_pos];
        unsigned int linep, i;
+       unsigned int uchar;
+       unsigned int curln, selln;
+       unsigned short curc, selc;
        unsigned short charp;
-       TextLine *holdl;
-       int holdc, holdln;
        char *buf;
        
        if (text->undo_pos < 0) {
@@ -2038,88 +1973,60 @@ void txt_do_undo(Text *text)
        undoing = 1;
        
        switch (op) {
-               case UNDO_CLEFT:
-                       txt_move_right(text, 0);
-                       break;
+               case UNDO_INSERT_1:
+               case UNDO_INSERT_2:
+               case UNDO_INSERT_3:
+               case UNDO_INSERT_4:
+                       text->undo_pos -= op - UNDO_INSERT_1 + 1;
                        
-               case UNDO_CRIGHT:
-                       txt_move_left(text, 0);
-                       break;
+                       /* get and restore the cursors */
+                       txt_undo_read_cur(text->undo_buf, &text->undo_pos, &curln, &curc);
+                       txt_move_to(text, curln, curc, 0);
+                       txt_move_to(text, curln, curc, 1);
                        
-               case UNDO_CUP:
-                       txt_move_down(text, 0);
-                       break;
+                       txt_delete_char(text);
                        
-               case UNDO_CDOWN:
-                       txt_move_up(text, 0);
-                       break;
-
-               case UNDO_SLEFT:
-                       txt_move_right(text, 1);
-                       break;
-
-               case UNDO_SRIGHT:
-                       txt_move_left(text, 1);
-                       break;
-
-               case UNDO_SUP:
-                       txt_move_down(text, 1);
+                       text->undo_pos--;
                        break;
 
-               case UNDO_SDOWN:
-                       txt_move_up(text, 1);
-                       break;
-               
-               case UNDO_CTO:
-               case UNDO_STO:
-                       text->undo_pos--;
-                       text->undo_pos--;
-                       text->undo_pos--;
-                       text->undo_pos--;
-               
-                       text->undo_pos--;
-                       text->undo_pos--;
-               
-                       linep = txt_undo_read_uint32(text->undo_buf, &text->undo_pos);
-                       charp = txt_undo_read_uint16(text->undo_buf, &text->undo_pos);
-                       
-                       if (op == UNDO_CTO) {
-                               txt_move_toline(text, linep, 0);
-                               text->curc = charp;
-                               txt_pop_sel(text);
-                       }
-                       else {
-                               txt_move_toline(text, linep, 1);
-                               text->selc = charp;
-                       }
+               case UNDO_BS_1:
+               case UNDO_BS_2:
+               case UNDO_BS_3:
+               case UNDO_BS_4:
+                       charp = op - UNDO_BS_1 + 1;
+                       uchar = txt_undo_read_unicode(text->undo_buf, &text->undo_pos, charp);
                        
-                       text->undo_pos--;
-                       break;
+                       /* get and restore the cursors */
+                       txt_undo_read_cur(text->undo_buf, &text->undo_pos, &curln, &curc);
+                       txt_move_to(text, curln, curc, 0);
+                       txt_move_to(text, curln, curc, 1);
                        
-               case UNDO_INSERT_1: case UNDO_INSERT_2: case UNDO_INSERT_3: case UNDO_INSERT_4:
-                       txt_backspace_char(text);
-                       text->undo_pos -= op - UNDO_INSERT_1 + 1;
-                       text->undo_pos--;
-                       break;
+                       txt_add_char(text, uchar);
 
-               case UNDO_BS_1: case UNDO_BS_2: case UNDO_BS_3: case UNDO_BS_4:
-                       charp = op - UNDO_BS_1 + 1;
-                       txt_add_char(text, txt_undo_read_unicode(text->undo_buf, &text->undo_pos, charp));
                        text->undo_pos--;
                        break;
-                       
-               case UNDO_DEL_1: case UNDO_DEL_2: case UNDO_DEL_3: case UNDO_DEL_4: 
+
+               case UNDO_DEL_1:
+               case UNDO_DEL_2:
+               case UNDO_DEL_3:
+               case UNDO_DEL_4:
                        charp = op - UNDO_DEL_1 + 1;
-                       txt_add_char(text, txt_undo_read_unicode(text->undo_buf, &text->undo_pos, charp));
+                       uchar = txt_undo_read_unicode(text->undo_buf, &text->undo_pos, charp);
+
+                       /* get and restore the cursors */
+                       txt_undo_read_cur(text->undo_buf, &text->undo_pos, &curln, &curc);
+                       txt_move_to(text, curln, curc, 0);
+                       txt_move_to(text, curln, curc, 1);
+
+                       txt_add_char(text, uchar);
+
                        txt_move_left(text, 0);
-                       text->undo_pos--;
-                       break;
 
-               case UNDO_SWAP:
-                       txt_curs_swap(text);
+                       text->undo_pos--;
                        break;
 
                case UNDO_DBLOCK:
+                       /* length of the string in the buffer */
                        linep = txt_undo_read_uint32(text->undo_buf, &text->undo_pos);
 
                        buf = MEM_mallocN(linep + 1, "dblock buffer");
@@ -2128,34 +2035,33 @@ void txt_do_undo(Text *text)
                                text->undo_pos--;
                        }
                        buf[i] = 0;
-                       
-                       txt_curs_first(text, &holdl, &holdc);
-                       holdln = txt_get_span(text->lines.first, holdl);
-                       
-                       txt_insert_buf(text, buf);
-                       MEM_freeN(buf);
-
-                       text->curl = text->lines.first;
-                       while (holdln > 0) {
-                               if (text->curl->next)
-                                       text->curl = text->curl->next;
-                                       
-                               holdln--;
-                       }
-                       text->curc = holdc;
 
+                       /* skip over the length that was stored again */
                        text->undo_pos--;
                        text->undo_pos--;
                        text->undo_pos--; 
                        text->undo_pos--;
 
+                       /* Get the cursor positions */
+                       txt_undo_read_cursors(text->undo_buf, &text->undo_pos, &curln, &curc, &selln, &selc);
+
+                       /* move cur to location that needs buff inserted */
+                       txt_move_to(text, curln, curc, 0);
+                       
+                       txt_insert_buf(text, buf);
+                       MEM_freeN(buf);
+
+                       /* restore the cursors */
+                       txt_move_to(text, curln, curc, 0);
+                       txt_move_to(text, selln, selc, 1);
+
                        text->undo_pos--;
                        
                        break;
 
                case UNDO_IBLOCK:
+                       /* length of the string in the buffer */
                        linep = txt_undo_read_uint32(text->undo_buf, &text->undo_pos);
-                       txt_delete_sel(text);
                        
                        /* txt_backspace_char removes utf8-characters, not bytes */
                        buf = MEM_mallocN(linep + 1, "iblock buffer");
@@ -2167,47 +2073,32 @@ void txt_do_undo(Text *text)
                        linep = txt_utf8_len(buf);
                        MEM_freeN(buf);
                        
-                       while (linep > 0) {
-                               txt_backspace_char(text);
-                               linep--;
-                       }
-                       
+                       /* skip over the length that was stored again */
                        text->undo_pos--;
                        text->undo_pos--;
-                       text->undo_pos--; 
                        text->undo_pos--;
-                       
                        text->undo_pos--;
+
+                       /* get and restore the cursors */
+                       txt_undo_read_cursors(text->undo_buf, &text->undo_pos, &curln, &curc, &selln, &selc);
+                       txt_move_to(text, curln, curc, 0);
+                       txt_move_to(text, curln, curc + linep, 1);
                        
+                       txt_delete_selected(text);
+                       
+                       text->undo_pos--;
                        break;
                case UNDO_INDENT:
                case UNDO_UNINDENT:
                case UNDO_COMMENT:
                case UNDO_UNCOMMENT:
-                       linep = txt_undo_read_uint32(text->undo_buf, &text->undo_pos);
-                       //linep is now the end line of the selection
-                       
-                       charp = txt_undo_read_uint16(text->undo_buf, &text->undo_pos);
-                       //charp is the last char selected or text->line->len
-                       
-                       //set the selection for this now
-                       text->selc = charp;
-                       text->sell = text->lines.first;
-                       for (i = 0; i < linep; i++) {
-                               text->sell = text->sell->next;
-                       }
-                       
-                       linep = txt_undo_read_uint32(text->undo_buf, &text->undo_pos);
-                       //first line to be selected
-                       
-                       charp = txt_undo_read_uint16(text->undo_buf, &text->undo_pos);
-                       //first postion to be selected
-                       text->curc = charp;
-                       text->curl = text->lines.first;
-                       for (i = 0; i < linep; i++) {
-                               text->curl = text->curl->next;
-                       }
-                       
+               case UNDO_DUPLICATE:
+               case UNDO_MOVE_LINES_UP:
+               case UNDO_MOVE_LINES_DOWN:
+                       /* get and restore the cursors */
+                       txt_undo_read_cursors(text->undo_buf, &text->undo_pos, &curln, &curc, &selln, &selc);
+                       txt_move_to(text, curln, curc, 0);
+                       txt_move_to(text, selln, selc, 1);
                        
                        if (op == UNDO_INDENT) {
                                txt_unindent(text);
@@ -2221,37 +2112,24 @@ void txt_do_undo(Text *text)
                        else if (op == UNDO_UNCOMMENT) {
                                txt_comment(text);
                        }
+                       else if (op == UNDO_DUPLICATE) {
+                               txt_delete_line(text, text->curl->next);
+                       }
+                       else if (op == UNDO_MOVE_LINES_UP) {
+                               txt_move_lines(text, TXT_MOVE_LINE_DOWN);
+                       }
+                       else if (op == UNDO_MOVE_LINES_DOWN) {
+                               txt_move_lines(text, TXT_MOVE_LINE_UP);
+                       }
                        
                        text->undo_pos--;
                        break;
-               case UNDO_DUPLICATE:
-                       txt_delete_line(text, text->curl->next);
-                       break;
-               case UNDO_MOVE_LINES_UP:
-                       txt_move_lines(text, TXT_MOVE_LINE_DOWN);
-                       break;
-               case UNDO_MOVE_LINES_DOWN:
-                       txt_move_lines(text, TXT_MOVE_LINE_UP);
-                       break;
                default:
                        //XXX error("Undo buffer error - resetting");
                        text->undo_pos = -1;
                        
                        break;
        }
-
-       /* next undo step may need evaluating */
-       if (text->undo_pos >= 0) {
-               switch (text->undo_buf[text->undo_pos]) {
-                       case UNDO_STO:
-                               txt_do_undo(text);
-                               txt_do_redo(text); /* selections need restoring */
-                               break;
-                       case UNDO_SWAP:
-                               txt_do_undo(text); /* swaps should appear transparent */
-                               break;
-               }
-       }
        
        undoing = 0;
 }
@@ -2259,9 +2137,12 @@ void txt_do_undo(Text *text)
 void txt_do_redo(Text *text)
 {
        char op;
-       unsigned int linep, i;
-       unsigned short charp;
        char *buf;
+       unsigned int linep;
+       unsigned short charp;
+       unsigned int uchar;
+       unsigned int curln, selln;
+       unsigned short curc, selc;
        
        text->undo_pos++;
        op = text->undo_buf[text->undo_pos];
@@ -2274,104 +2155,91 @@ void txt_do_redo(Text *text)
        undoing = 1;
 
        switch (op) {
-               case UNDO_CLEFT:
-                       txt_move_left(text, 0);
-                       break;
-                       
-               case UNDO_CRIGHT:
-                       txt_move_right(text, 0);
-                       break;
+               case UNDO_INSERT_1:
+               case UNDO_INSERT_2:
+               case UNDO_INSERT_3:
+               case UNDO_INSERT_4:
+                       text->undo_pos++;
                        
-               case UNDO_CUP:
-                       txt_move_up(text, 0);
-                       break;
+                       /* get and restore the cursors */
+                       txt_redo_read_cur(text->undo_buf, &text->undo_pos, &curln, &curc);
+                       txt_move_to(text, curln, curc, 0);
+                       txt_move_to(text, curln, curc, 1);
                        
-               case UNDO_CDOWN:
-                       txt_move_down(text, 0);
-                       break;
-
-               case UNDO_SLEFT:
-                       txt_move_left(text, 1);
-                       break;
-
-               case UNDO_SRIGHT:
-                       txt_move_right(text, 1);
-                       break;
-
-               case UNDO_SUP:
-                       txt_move_up(text, 1);
-                       break;
-
-               case UNDO_SDOWN:
-                       txt_move_down(text, 1);
-                       break;
-               
-               case UNDO_INSERT_1: case UNDO_INSERT_2: case UNDO_INSERT_3: case UNDO_INSERT_4:
-                       text->undo_pos++;
                        charp = op - UNDO_INSERT_1 + 1;
-                       txt_add_char(text, txt_redo_read_unicode(text->undo_buf, &text->undo_pos, charp));
-                       break;
+                       uchar = txt_redo_read_unicode(text->undo_buf, &text->undo_pos, charp);
 
-               case UNDO_BS_1: case UNDO_BS_2: case UNDO_BS_3: case UNDO_BS_4:
-                       text->undo_pos++;
-                       txt_backspace_char(text);
-                       text->undo_pos += op - UNDO_BS_1 + 1;
+                       txt_add_char(text, uchar);
                        break;
 
-               case UNDO_DEL_1: case UNDO_DEL_2: case UNDO_DEL_3: case UNDO_DEL_4:
+               case UNDO_BS_1:
+               case UNDO_BS_2:
+               case UNDO_BS_3:
+               case UNDO_BS_4:
                        text->undo_pos++;
-                       txt_delete_char(text);
-                       text->undo_pos += op - UNDO_DEL_1 + 1;
-                       break;
 
-               case UNDO_SWAP:
-                       txt_curs_swap(text);
-                       txt_do_redo(text); /* swaps should appear transparent a*/
-                       break;
+                       /* get and restore the cursors */
+                       txt_redo_read_cur(text->undo_buf, &text->undo_pos, &curln, &curc);
+                       txt_move_to(text, curln, curc, 0);
+                       txt_move_to(text, curln, curc, 1);
+
+                       text->undo_pos += op - UNDO_BS_1 + 1;
                        
-               case UNDO_CTO:
-               case UNDO_STO:
-                       text->undo_pos++;
-                       text->undo_pos++;
+                       /* move right so we backspace the correct char */
+                       txt_move_right(text, 0);
+                       txt_backspace_char(text);
 
-                       text->undo_pos++;
-                       text->undo_pos++;
-                       text->undo_pos++;
-                       text->undo_pos++;
+                       break;
 
+               case UNDO_DEL_1:
+               case UNDO_DEL_2:
+               case UNDO_DEL_3:
+               case UNDO_DEL_4:
                        text->undo_pos++;
 
-                       charp = txt_redo_read_uint16(text->undo_buf, &text->undo_pos);
-                       linep = txt_redo_read_uint32(text->undo_buf, &text->undo_pos);
+                       /* get and restore the cursors */
+                       txt_redo_read_cur(text->undo_buf, &text->undo_pos, &curln, &curc);
+                       txt_move_to(text, curln, curc, 0);
+                       txt_move_to(text, curln, curc, 1);
                        
-                       if (op == UNDO_CTO) {
-                               txt_move_toline(text, linep, 0);
-                               text->curc = charp;
-                               txt_pop_sel(text);
-                       }
-                       else {
-                               txt_move_toline(text, linep, 1);
-                               text->selc = charp;
-                       }
+                       text->undo_pos += op - UNDO_DEL_1 + 1;
+
+                       txt_delete_char(text);
 
                        break;
 
                case UNDO_DBLOCK:
                        text->undo_pos++;
+
+                       /* get and restore the cursors */
+                       txt_redo_read_cursors(text->undo_buf, &text->undo_pos, &curln, &curc, &selln, &selc);
+                       txt_move_to(text, curln, curc, 0);
+                       txt_move_to(text, selln, selc, 1);
+
+                       /* length of the block */
                        linep = txt_redo_read_uint32(text->undo_buf, &text->undo_pos);
-                       txt_delete_sel(text);
                        
                        text->undo_pos += linep;
 
+                       /* skip over the length that was stored again */
                        text->undo_pos++;
                        text->undo_pos++;
                        text->undo_pos++; 
                        text->undo_pos++;
                        
+                       txt_delete_sel(text);
+
                        break;
 
                case UNDO_IBLOCK:
                        text->undo_pos++;
+
+                       /* get and restore the cursors */
+                       txt_redo_read_cursors(text->undo_buf, &text->undo_pos, &curln, &curc, &selln, &selc);
+                       txt_move_to(text, curln, curc, 0);
+                       txt_move_to(text, curln, curc, 1);
+
+                       /* length of the block */
                        linep = txt_redo_read_uint32(text->undo_buf, &text->undo_pos);
 
                        buf = MEM_mallocN(linep + 1, "iblock buffer");
@@ -2382,40 +2250,27 @@ void txt_do_redo(Text *text)
                        txt_insert_buf(text, buf);
                        MEM_freeN(buf);
 
+                       /* skip over the length that was stored again */
                        text->undo_pos++;
                        text->undo_pos++;
                        text->undo_pos++; 
                        text->undo_pos++;
+
                        break;
                        
                case UNDO_INDENT:
                case UNDO_UNINDENT:
                case UNDO_COMMENT:
                case UNDO_UNCOMMENT:
+               case UNDO_DUPLICATE:
+               case UNDO_MOVE_LINES_UP:
+               case UNDO_MOVE_LINES_DOWN:
                        text->undo_pos++;
-                       charp = txt_redo_read_uint16(text->undo_buf, &text->undo_pos);
-                       //charp is the first char selected or 0
-                       
-                       linep = txt_redo_read_uint32(text->undo_buf, &text->undo_pos);
-                       //linep is now the first line of the selection
-                       //set the selcetion for this now
-                       text->curc = charp;
-                       text->curl = text->lines.first;
-                       for (i = 0; i < linep; i++) {
-                               text->curl = text->curl->next;
-                       }
-                       
-                       charp = txt_redo_read_uint16(text->undo_buf, &text->undo_pos);
-                       //last postion to be selected
-                       
-                       linep = txt_redo_read_uint32(text->undo_buf, &text->undo_pos);
-                       //Last line to be selected
-                       
-                       text->selc = charp;
-                       text->sell = text->lines.first;
-                       for (i = 0; i < linep; i++) {
-                               text->sell = text->sell->next;
-                       }
+
+                       /* get and restore the cursors */
+                       txt_redo_read_cursors(text->undo_buf, &text->undo_pos, &curln, &curc, &selln, &selc);
+                       txt_move_to(text, curln, curc, 0);
+                       txt_move_to(text, selln, selc, 1);
 
                        if (op == UNDO_INDENT) {
                                txt_indent(text);
@@ -2429,15 +2284,28 @@ void txt_do_redo(Text *text)
                        else if (op == UNDO_UNCOMMENT) {
                                txt_uncomment(text);
                        }
-                       break;
-               case UNDO_DUPLICATE:
-                       txt_duplicate_line(text);
-                       break;
-               case UNDO_MOVE_LINES_UP:
-                       txt_move_lines(text, TXT_MOVE_LINE_UP);
-                       break;
-               case UNDO_MOVE_LINES_DOWN:
-                       txt_move_lines(text, TXT_MOVE_LINE_DOWN);
+                       else if (op == UNDO_DUPLICATE) {
+                               txt_duplicate_line(text);
+                       }
+                       else if (op == UNDO_MOVE_LINES_UP) {
+                               /* offset the cursor by + 1 */
+                               txt_move_to(text, curln + 1, curc, 0);
+                               txt_move_to(text, selln + 1, selc, 1);
+
+                               txt_move_lines(text, TXT_MOVE_LINE_UP);
+                       }
+                       else if (op == UNDO_MOVE_LINES_DOWN) {
+                               /* offset the cursor by - 1 */
+                               txt_move_to(text, curln - 1, curc, 0);
+                               txt_move_to(text, selln - 1, selc, 1);
+
+                               txt_move_lines(text, TXT_MOVE_LINE_DOWN);
+                       }
+
+                       /* re-restore the cursors since they got moved when redoing */
+                       txt_move_to(text, curln, curc, 0);
+                       txt_move_to(text, selln, selc, 1);
+
                        break;
                default:
                        //XXX error("Undo buffer error - resetting");
@@ -2767,6 +2635,8 @@ static int txt_add_char_intern(Text *text, unsigned int add, int replace_tabs)
 
        txt_delete_sel(text);
        
+       if (!undoing) txt_undo_add_charop(text, UNDO_INSERT_1, add);
+
        add_len = BLI_str_utf8_from_unicode(add, ch);
        mrk = txt_find_marker_region(text, text->curl, text->curc - 1, text->curl->len, 0, 0);
        if (mrk) {
@@ -2793,7 +2663,6 @@ static int txt_add_char_intern(Text *text, unsigned int add, int replace_tabs)
        txt_make_dirty(text);
        txt_clean_text(text);
 
-       if (!undoing) txt_undo_add_charop(text, UNDO_INSERT_1, add);
        return 1;
 }
 
@@ -2854,8 +2723,8 @@ int txt_replace_char(Text *text, unsigned int add)
 
        /* Should probably create a new op for this */
        if (!undoing) {
-               txt_undo_add_charop(text, UNDO_DEL_1, del);
                txt_undo_add_charop(text, UNDO_INSERT_1, add);
+               txt_undo_add_charop(text, UNDO_DEL_1, del);
        }
        return 1;
 }
@@ -2924,7 +2793,7 @@ void txt_indent(Text *text)
        }
        
        if (!undoing) {
-               txt_undo_add_toop(text, UNDO_INDENT, txt_get_span(text->lines.first, text->curl), text->curc, txt_get_span(text->lines.first, text->sell), text->selc);
+               txt_undo_add_op(text, UNDO_INDENT);
        }
 }
 
@@ -2982,7 +2851,7 @@ void txt_unindent(Text *text)
        }
        
        if (!undoing) {
-               txt_undo_add_toop(text, UNDO_UNINDENT, txt_get_span(text->lines.first, text->curl), text->curc, txt_get_span(text->lines.first, text->sell), text->selc);
+               txt_undo_add_op(text, UNDO_UNINDENT);
        }
 }
 
@@ -3031,7 +2900,7 @@ void txt_comment(Text *text)
        }
        
        if (!undoing) {
-               txt_undo_add_toop(text, UNDO_COMMENT, txt_get_span(text->lines.first, text->curl), text->curc, txt_get_span(text->lines.first, text->sell), text->selc);
+               txt_undo_add_op(text, UNDO_COMMENT);
        }
 }
 
@@ -3076,7 +2945,7 @@ void txt_uncomment(Text *text)
        }
        
        if (!undoing) {
-               txt_undo_add_toop(text, UNDO_UNCOMMENT, txt_get_span(text->lines.first, text->curl), text->curc, txt_get_span(text->lines.first, text->sell), text->selc);
+               txt_undo_add_op(text, UNDO_UNCOMMENT);
        }
 }
 
index 1be50a5..53e731b 100644 (file)
@@ -1664,7 +1664,7 @@ static void txt_wrap_move_bol(SpaceText *st, ARegion *ar, short sel)
        Text *text = st->text;
        TextLine **linep;
        int *charp;
-       int oldl, oldc, i, j, max, start, end, endj, chop, loop;
+       int oldc, i, j, max, start, end, endj, chop, loop;
        char ch;
 
        text_update_character_width(st);
@@ -1673,7 +1673,6 @@ static void txt_wrap_move_bol(SpaceText *st, ARegion *ar, short sel)
        else linep = &text->curl, charp = &text->curc;
 
        oldc = *charp;
-       oldl = txt_get_span(text->lines.first, *linep);
 
        max = wrap_width(st, ar);
 
@@ -1724,7 +1723,6 @@ static void txt_wrap_move_bol(SpaceText *st, ARegion *ar, short sel)
        }
 
        if (!sel) txt_pop_sel(text);
-       txt_undo_add_toop(text, sel ? UNDO_STO : UNDO_CTO, oldl, oldc, oldl, *charp);
 }
 
 static void txt_wrap_move_eol(SpaceText *st, ARegion *ar, short sel)
@@ -1732,7 +1730,7 @@ static void txt_wrap_move_eol(SpaceText *st, ARegion *ar, short sel)
        Text *text = st->text;
        TextLine **linep;
        int *charp;
-       int oldl, oldc, i, j, max, start, end, endj, chop, loop;
+       int oldc, i, j, max, start, end, endj, chop, loop;
        char ch;
 
        text_update_character_width(st);
@@ -1741,7 +1739,6 @@ static void txt_wrap_move_eol(SpaceText *st, ARegion *ar, short sel)
        else linep = &text->curl, charp = &text->curc;
 
        oldc = *charp;
-       oldl = txt_get_span(text->lines.first, *linep);
 
        max = wrap_width(st, ar);
 
@@ -1790,7 +1787,6 @@ static void txt_wrap_move_eol(SpaceText *st, ARegion *ar, short sel)
        }
 
        if (!sel) txt_pop_sel(text);
-       txt_undo_add_toop(text, sel ? UNDO_STO : UNDO_CTO, oldl, oldc, oldl, *charp);
 }
 
 static void txt_wrap_move_up(SpaceText *st, ARegion *ar, short sel)
@@ -1798,22 +1794,17 @@ static void txt_wrap_move_up(SpaceText *st, ARegion *ar, short sel)
        Text *text = st->text;
        TextLine **linep;
        int *charp;
-       int oldl, oldc, offl, offc, col, newl;
+       int offl, offc, col;
 
        text_update_character_width(st);
 
        if (sel) linep = &text->sell, charp = &text->selc;
        else linep = &text->curl, charp = &text->curc;
 
-       /* store previous position */
-       oldc = *charp;
-       newl = oldl = txt_get_span(text->lines.first, *linep);
-
        wrap_offset_in_line(st, ar, *linep, *charp, &offl, &offc);
        col = text_get_char_pos(st, (*linep)->line, *charp) + offc;
        if (offl) {
                *charp = text_get_cursor_rel(st, ar, *linep, offl - 1, col);
-               newl = BLI_findindex(&text->lines, linep);
        }
        else {
                if ((*linep)->prev) {
@@ -1822,13 +1813,11 @@ static void txt_wrap_move_up(SpaceText *st, ARegion *ar, short sel)
                        *linep = (*linep)->prev;
                        visible_lines = text_get_visible_lines(st, ar, (*linep)->line);
                        *charp = text_get_cursor_rel(st, ar, *linep, visible_lines - 1, col);
-                       newl--;
                }
                else *charp = 0;
        }
 
        if (!sel) txt_pop_sel(text);
-       txt_undo_add_toop(text, sel ? UNDO_STO : UNDO_CTO, oldl, oldc, newl, *charp);
 }
 
 static void txt_wrap_move_down(SpaceText *st, ARegion *ar, short sel)
@@ -1836,35 +1825,28 @@ static void txt_wrap_move_down(SpaceText *st, ARegion *ar, short sel)
        Text *text = st->text;
        TextLine **linep;
        int *charp;
-       int oldl, oldc, offl, offc, col, newl, visible_lines;
+       int offl, offc, col, newl, visible_lines;
 
        text_update_character_width(st);
 
        if (sel) linep = &text->sell, charp = &text->selc;
        else linep = &text->curl, charp = &text->curc;
 
-       /* store previous position */
-       oldc = *charp;
-       newl = oldl = txt_get_span(text->lines.first, *linep);
-
        wrap_offset_in_line(st, ar, *linep, *charp, &offl, &offc);
        col = text_get_char_pos(st, (*linep)->line, *charp) + offc;
        visible_lines = text_get_visible_lines(st, ar, (*linep)->line);
        if (offl < visible_lines - 1) {
                *charp = text_get_cursor_rel(st, ar, *linep, offl + 1, col);
-               newl = BLI_findindex(&text->lines, linep);
        }
        else {
                if ((*linep)->next) {
                        *linep = (*linep)->next;
                        *charp = text_get_cursor_rel(st, ar, *linep, 0, col);
-                       newl++;
                }
                else *charp = (*linep)->len;
        }
 
        if (!sel) txt_pop_sel(text);
-       txt_undo_add_toop(text, sel ? UNDO_STO : UNDO_CTO, oldl, oldc, newl, *charp);
 }
 
 /* Moves the cursor vertically by the specified number of lines.
@@ -1876,12 +1858,10 @@ static void txt_wrap_move_down(SpaceText *st, ARegion *ar, short sel)
 static void cursor_skip(SpaceText *st, ARegion *ar, Text *text, int lines, int sel)
 {
        TextLine **linep;
-       int oldl, oldc, *charp;
+       int *charp;
        
        if (sel) linep = &text->sell, charp = &text->selc;
        else linep = &text->curl, charp = &text->curc;
-       oldl = txt_get_span(text->lines.first, *linep);
-       oldc = *charp;
 
        if (st && ar && st->wordwrap) {
                int rell, relc;
@@ -1904,7 +1884,6 @@ static void cursor_skip(SpaceText *st, ARegion *ar, Text *text, int lines, int s
        if (*charp > (*linep)->len) *charp = (*linep)->len;
 
        if (!sel) txt_pop_sel(text);
-       txt_undo_add_toop(text, sel ? UNDO_STO : UNDO_CTO, oldl, oldc, txt_get_span(text->lines.first, *linep), *charp);
 }
 
 static int text_move_cursor(bContext *C, int type, int select)
@@ -2696,7 +2675,6 @@ static void text_cursor_set_exit(bContext *C, wmOperator *op)
        SpaceText *st = CTX_wm_space_text(C);
        Text *text = st->text;
        SetSelection *ssel = op->customdata;
-       int linep2, charp2;
        char *buffer;
 
        if (txt_has_sel(text)) {
@@ -2705,12 +2683,6 @@ static void text_cursor_set_exit(bContext *C, wmOperator *op)
                MEM_freeN(buffer);
        }
 
-       linep2 = txt_get_span(st->text->lines.first, st->text->sell);
-       charp2 = st->text->selc;
-               
-       if (ssel->sell != linep2 || ssel->selc != charp2)
-               txt_undo_add_toop(st->text, UNDO_STO, ssel->sell, ssel->selc, linep2, charp2);
-
        text_update_cursor_moved(C);
        WM_event_add_notifier(C, NC_TEXT | ND_CURSOR, st->text);
 
@@ -2786,19 +2758,12 @@ void TEXT_OT_selection_set(wmOperatorType *ot)
 static int text_cursor_set_exec(bContext *C, wmOperator *op)
 {
        SpaceText *st = CTX_wm_space_text(C);
-       Text *text = st->text;
        ARegion *ar = CTX_wm_region(C);
        int x = RNA_int_get(op->ptr, "x");
        int y = RNA_int_get(op->ptr, "y");
-       int oldl, oldc;
-
-       oldl = txt_get_span(text->lines.first, text->curl);
-       oldc = text->curc;
 
        text_cursor_set_to_pos(st, ar, x, y, 0);
 
-       txt_undo_add_toop(text, UNDO_CTO, oldl, oldc, txt_get_span(text->lines.first, text->curl), text->curc);
-
        text_update_cursor_moved(C);
        WM_event_add_notifier(C, NC_TEXT | ND_CURSOR, st->text);