qemacs-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemacs-commit] qemacs buffer.c html.c image.c qe.c qe.h qeconf...


From: Charlie Gordon
Subject: [Qemacs-commit] qemacs buffer.c html.c image.c qe.c qe.h qeconf...
Date: Tue, 14 Jan 2014 03:29:37 +0000

CVSROOT:        /sources/qemacs
Module name:    qemacs
Changes by:     Charlie Gordon <chqrlie>        14/01/14 03:29:37

Modified files:
        .              : buffer.c html.c image.c qe.c qe.h qeconfig.h 
                         shell.c 

Log message:
        improve undo system
        
        * use bit 2 in b->save_log to suspend callbacks and logging during 
transient
          undo phase.
        * dispatch callbacks before buffer modification (eb_delete)
        * this fixes bugs in the undo system where some offsets were not 
properly
          updated, color buffer was shifted, cursor would get lost and sometimes
          crash would follow.
        * buffer colors are not undone properly
        * pass extra int argument to buffer callbacks
        * make eb_offset_callback more generic: handle edge effect via extra 
arg.
          edge effect causes offset to move upon insertion at current value
        * add new log variables log_last_char and last_log.
          use these to coalesce consecutive log records and make undo more 
efficient
        * add new command "redo" on C-x C-_ and C-x r
        * fix undo glitches in the process buffer, update cursor correctly upon 
redo

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/qemacs/buffer.c?cvsroot=qemacs&r1=1.58&r2=1.59
http://cvs.savannah.gnu.org/viewcvs/qemacs/html.c?cvsroot=qemacs&r1=1.23&r2=1.24
http://cvs.savannah.gnu.org/viewcvs/qemacs/image.c?cvsroot=qemacs&r1=1.23&r2=1.24
http://cvs.savannah.gnu.org/viewcvs/qemacs/qe.c?cvsroot=qemacs&r1=1.121&r2=1.122
http://cvs.savannah.gnu.org/viewcvs/qemacs/qe.h?cvsroot=qemacs&r1=1.119&r2=1.120
http://cvs.savannah.gnu.org/viewcvs/qemacs/qeconfig.h?cvsroot=qemacs&r1=1.38&r2=1.39
http://cvs.savannah.gnu.org/viewcvs/qemacs/shell.c?cvsroot=qemacs&r1=1.75&r2=1.76

Patches:
Index: buffer.c
===================================================================
RCS file: /sources/qemacs/qemacs/buffer.c,v
retrieving revision 1.58
retrieving revision 1.59
diff -u -b -r1.58 -r1.59
--- buffer.c    13 Jan 2014 23:38:15 -0000      1.58
+++ buffer.c    14 Jan 2014 03:29:36 -0000      1.59
@@ -503,8 +503,8 @@
     }
 
     /* add mark move callback */
-    eb_add_callback(b, eb_offset_callback, &b->mark);
-    eb_add_callback(b, eb_offset_callback, &b->offset);
+    eb_add_callback(b, eb_offset_callback, &b->mark, 0);
+    eb_add_callback(b, eb_offset_callback, &b->offset, 1);
 
     if (strequal(name, "*trace*"))
         qs->trace_buffer = b;
@@ -532,6 +532,7 @@
 
     /* XXX: should just reset logging instead of disabling it */
     b->save_log = 0;
+    b->last_log = 0;
     eb_delete(b, 0, b->total_size);
     log_reset(b);
 
@@ -697,7 +698,7 @@
 /************************************************************/
 /* callbacks */
 
-int eb_add_callback(EditBuffer *b, EditBufferCallback cb, void *opaque)
+int eb_add_callback(EditBuffer *b, EditBufferCallback cb, void *opaque, int 
arg)
 {
     EditBufferCallbackList *l;
 
@@ -706,6 +707,7 @@
         return -1;
     l->callback = cb;
     l->opaque = opaque;
+    l->arg = arg;
     l->next = b->first_callback;
     b->first_callback = l;
     return 0;
@@ -726,7 +728,7 @@
 }
 
 /* standard callback to move offsets */
-void eb_offset_callback(EditBuffer *b, void *opaque,
+void eb_offset_callback(__unused__ EditBuffer *b, void *opaque, int edge,
                         enum LogOperation op, int offset, int size)
 {
     int *offset_ptr = opaque;
@@ -735,9 +737,9 @@
     case LOGOP_INSERT:
         if (*offset_ptr > offset)
             *offset_ptr += size;
-        /* special case for buffer's own point position:
+        /* special case for buffer's own point position and shell cursor:
          * edge position is pushed right */
-        if (*offset_ptr == offset && offset_ptr == &b->offset)
+        if (*offset_ptr == offset && edge)
             *offset_ptr += size;
         break;
     case LOGOP_DELETE:
@@ -770,7 +772,7 @@
 
     /* call each callback */
     for (l = b->first_callback; l != NULL; l = l->next) {
-        l->callback(b, l->opaque, op, offset, size);
+        l->callback(b, l->opaque, l->arg, op, offset, size);
     }
 
     was_modified = b->modified;
@@ -807,8 +809,24 @@
         b->nb_logs--;
     }
 
+    /* If inserting, try and coalesce log record with previous */
+    if (op == LOGOP_INSERT && b->last_log == LOGOP_INSERT
+    &&  b->log_new_index >= sizeof(lb) + sizeof(int)
+    &&  eb_read(b->log_buffer, b->log_new_index - sizeof(int), &size_trailer,
+                sizeof(int)) == sizeof(int)
+    &&  size_trailer == 0
+    &&  eb_read(b->log_buffer, b->log_new_index - sizeof(lb) - sizeof(int), 
&lb,
+                sizeof(lb)) == sizeof(lb)
+    &&  lb.op == LOGOP_INSERT
+    &&  lb.offset + lb.size == offset) {
+        lb.size += size;
+        eb_write(b->log_buffer, b->log_new_index - sizeof(lb) - sizeof(int), 
&lb, sizeof(lb));
+        return;
+    }
+
+    b->last_log = op;
+
     /* XXX: should check undo record integrity */
-    /* XXX: if inserting, should coalesce log record with previous */
 
     /* header */
     lb.pad1 = '\n';   /* make log buffer display readable */
@@ -848,8 +866,11 @@
     if (!b->log_buffer)
         return;
 
-    if (s->qe_state->last_cmd_func != (CmdFunc)do_undo)
+    /* Should actually keep undo state current until new logs are added */
+    if (s->qe_state->last_cmd_func != (CmdFunc)do_undo
+    &&  s->qe_state->last_cmd_func != (CmdFunc)do_redo) {
         b->log_current = 0;
+    }
 
     if (b->log_current == 0) {
         log_index = b->log_new_index;
@@ -874,6 +895,8 @@
     eb_read(b->log_buffer, log_index, &lb, sizeof(LogBuffer));
     log_index += sizeof(LogBuffer);
 
+    b->last_log = 0;  /* prevent log compression */
+
     switch (lb.op) {
     case LOGOP_WRITE:
         /* we must disable the log because we want to record a single
@@ -906,6 +929,92 @@
     b->modified = lb.was_modified;
 }
 
+void do_redo(EditState *s)
+{
+    EditBuffer *b = s->b;
+    int log_index, size_trailer;
+    LogBuffer lb;
+
+    if (!b->log_buffer)
+        return;
+
+    /* Should actually keep undo state current until new logs are added */
+    if (s->qe_state->last_cmd_func != (CmdFunc)do_undo
+    &&  s->qe_state->last_cmd_func != (CmdFunc)do_redo) {
+        b->log_current = 0;
+    }
+
+    if (!b->log_current || !b->log_new_index) {
+        put_status(s, "Nothing to redo");
+        return;
+    }
+    put_status(s, "Redo!");
+
+    /* go forward in undo stack */
+    log_index = b->log_current - 1;
+    eb_read(b->log_buffer, log_index, &lb, sizeof(LogBuffer));
+    log_index += sizeof(LogBuffer);
+    if (lb.op != LOGOP_INSERT)
+        log_index += lb.size;
+    log_index += sizeof(int);
+    /* log_current is 1 + index to have zero as default value */
+    b->log_current = log_index + 1;
+
+    /* go backward from the end and remove undo record */
+    log_index = b->log_new_index;
+    log_index -= sizeof(int);
+    eb_read(b->log_buffer, log_index, &size_trailer, sizeof(int));
+    log_index -= size_trailer + sizeof(LogBuffer);
+
+    /* play the log entry */
+    eb_read(b->log_buffer, log_index, &lb, sizeof(LogBuffer));
+    log_index += sizeof(LogBuffer);
+
+    switch (lb.op) {
+    case LOGOP_WRITE:
+        /* we must disable the log because we want to record a single
+           write (we should have the single operation: eb_write_buffer) */
+        b->save_log |= 2;
+        eb_delete(b, lb.offset, lb.size);
+        eb_insert_buffer(b, lb.offset, b->log_buffer, log_index, lb.size);
+        b->save_log &= ~3;
+        eb_addlog(b, LOGOP_WRITE, lb.offset, lb.size);
+        b->save_log |= 1;
+        s->offset = lb.offset + lb.size;
+        break;
+    case LOGOP_DELETE:
+        /* we must also disable the log there because the log buffer
+           would be modified BEFORE we insert it by the implicit
+           eb_addlog */
+        b->save_log |= 2;
+        eb_insert_buffer(b, lb.offset, b->log_buffer, log_index, lb.size);
+        b->save_log &= ~3;
+        eb_addlog(b, LOGOP_INSERT, lb.offset, lb.size);
+        b->save_log |= 1;
+        s->offset = lb.offset + lb.size;
+        break;
+    case LOGOP_INSERT:
+        b->save_log &= ~1;
+        eb_delete(b, lb.offset, lb.size);
+        b->save_log |= 1;
+        s->offset = lb.offset;
+        break;
+    default:
+        abort();
+    }
+
+    b->modified = lb.was_modified;
+
+    log_index -= sizeof(LogBuffer);
+    eb_delete(b->log_buffer, log_index, b->log_new_index - log_index);
+    b->log_new_index = log_index;
+
+    if (b->log_current >= log_index + 1) {
+        /* redone everything */
+        b->log_current = 0;
+    }
+}
+
 /************************************************************/
 /* line related functions */
 

Index: html.c
===================================================================
RCS file: /sources/qemacs/qemacs/html.c,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -b -r1.23 -r1.24
--- html.c      5 Jan 2014 23:42:55 -0000       1.23
+++ html.c      14 Jan 2014 03:29:37 -0000      1.24
@@ -756,7 +756,7 @@
 
 /* invalidate the html data if modification done (XXX: be more precise) */
 static void html_callback(__unused__ EditBuffer *b,
-                          void *opaque,
+                          void *opaque, __unused__ int arg,
                           __unused__ enum LogOperation op,
                           __unused__ int offset,
                           __unused__ int size)
@@ -797,7 +797,7 @@
         memcpy(s, saved_data->generic_data, SAVED_DATA_SIZE);
     }
 
-    eb_add_callback(s->b, html_callback, s);
+    eb_add_callback(s->b, html_callback, s, 0);
     hs->parse_flags = flags;
 
     load_default_style_sheet(hs, default_stylesheet, flags);

Index: image.c
===================================================================
RCS file: /sources/qemacs/qemacs/image.c,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -b -r1.23 -r1.24
--- image.c     4 Jan 2014 17:27:38 -0000       1.23
+++ image.c     14 Jan 2014 03:29:37 -0000      1.24
@@ -68,11 +68,8 @@
     return dst_pix_fmt;
 }
 
-static void image_callback(EditBuffer *b,
-                           void *opaque,
-                           enum LogOperation op,
-                           int offset,
-                           int size);
+static void image_callback(EditBuffer *b, void *opaque, int arg,
+                           enum LogOperation op, int offset, int size);
 
 /* draw only the border of a rectangle */
 void fill_border(EditState *s, int x, int y, int w, int h, int color)
@@ -502,7 +499,7 @@
 
     update_bmp(s);
 
-    eb_add_callback(s->b, image_callback, s);
+    eb_add_callback(s->b, image_callback, s, 1);
     return 0;
 }
 
@@ -581,11 +578,8 @@
 }
 
 /* when the image is modified, reparse it */
-static void image_callback(EditBuffer *b,
-                          void *opaque,
-                          enum LogOperation op,
-                          int offset,
-                          int size)
+static void image_callback(EditBuffer *b, void *opaque, int arg,
+                          enum LogOperation op, int offset, int size)
 {
     //    EditState *s = opaque;
 

Index: qe.c
===================================================================
RCS file: /sources/qemacs/qemacs/qe.c,v
retrieving revision 1.121
retrieving revision 1.122
diff -u -b -r1.121 -r1.122
--- qe.c        13 Jan 2014 11:57:28 -0000      1.121
+++ qe.c        14 Jan 2014 03:29:37 -0000      1.122
@@ -1268,6 +1268,12 @@
         if (s->compose_len == 0)
             s->compose_start_offset = s->offset;
 
+        /* break sequence of insertions */
+        if (key == '\n' || (key != ' ' && s->b->last_log_char == ' ')) {
+            s->b->last_log = 0;
+        }
+        s->b->last_log_char = key;
+
         /* insert char */
         eb_insert(s->b, s->offset, buf, len);
         s->offset += len;
@@ -1542,6 +1548,7 @@
     if (b) {
         size = b->total_size;
         if (size > 0) {
+            s->b->last_log = 0;
             s->offset += eb_insert_buffer_convert(s->b, s->offset, b, 0, size);
         }
     }
@@ -3187,7 +3194,7 @@
 
 /* invalidate the colorize data */
 static void colorize_callback(__unused__ EditBuffer *b,
-                              void *opaque,
+                              void *opaque, __unused__ int arg,
                               __unused__ enum LogOperation op,
                               int offset,
                               __unused__ int size)
@@ -3210,7 +3217,7 @@
     s->colorize_func = NULL;
 
     if (colorize_func) {
-        eb_add_callback(s->b, colorize_callback, s);
+        eb_add_callback(s->b, colorize_callback, s, 0);
         s->get_colorized_line = generic_get_colorized_line;
         s->colorize_func = colorize_func;
     }
@@ -7099,8 +7106,8 @@
 
 int text_mode_init(EditState *s, ModeSavedData *saved_data)
 {
-    eb_add_callback(s->b, eb_offset_callback, &s->offset);
-    eb_add_callback(s->b, eb_offset_callback, &s->offset_top);
+    eb_add_callback(s->b, eb_offset_callback, &s->offset, 0);
+    eb_add_callback(s->b, eb_offset_callback, &s->offset_top, 0);
     if (!saved_data) {
         memset(s, 0, SAVED_DATA_SIZE);
         s->insert = 1;

Index: qe.h
===================================================================
RCS file: /sources/qemacs/qemacs/qe.h,v
retrieving revision 1.119
retrieving revision 1.120
diff -u -b -r1.119 -r1.120
--- qe.h        13 Jan 2014 11:28:00 -0000      1.119
+++ qe.h        14 Jan 2014 03:29:37 -0000      1.120
@@ -691,14 +691,12 @@
 };
 
 /* Each buffer modification can be caught with this callback */
-typedef void (*EditBufferCallback)(EditBuffer *,
-                                   void *opaque,
-                                   enum LogOperation op,
-                                   int offset,
-                                   int size);
+typedef void (*EditBufferCallback)(EditBuffer *b, void *opaque, int arg,
+                                   enum LogOperation op, int offset, int size);
 
 typedef struct EditBufferCallbackList {
     void *opaque;
+    int arg;
     EditBufferCallback callback;
     struct EditBufferCallbackList *next;
 } EditBufferCallbackList;
@@ -740,6 +738,8 @@
     /* undo system */
     int save_log;    /* if true, each buffer operation is logged */
     int log_new_index, log_current;
+    enum LogOperation last_log;
+    int last_log_char;
     EditBuffer *log_buffer;
     int nb_logs;
 
@@ -832,7 +832,7 @@
 int eb_delete_range(EditBuffer *b, int p1, int p2);
 //int eb_clip_offset(EditBuffer *b, int offset);
 void do_undo(EditState *s);
-//void do_redo(EditState *s);
+void do_redo(EditState *s);
 
 int raw_buffer_load1(EditBuffer *b, FILE *f, int offset);
 int mmap_buffer(EditBuffer *b, const char *filename);
@@ -842,13 +842,10 @@
 void eb_set_buffer_name(EditBuffer *b, const char *name1);
 void eb_set_filename(EditBuffer *b, const char *filename);
 
-int eb_add_callback(EditBuffer *b, EditBufferCallback cb, void *opaque);
+int eb_add_callback(EditBuffer *b, EditBufferCallback cb, void *opaque, int 
arg);
 void eb_free_callback(EditBuffer *b, EditBufferCallback cb, void *opaque);
-void eb_offset_callback(EditBuffer *b,
-                        void *opaque,
-                        enum LogOperation op,
-                        int offset,
-                        int size);
+void eb_offset_callback(EditBuffer *b, void *opaque, int edge,
+                        enum LogOperation op, int offset, int size);
 int eb_delete_uchar(EditBuffer *b, int offset);
 int eb_insert_uchar(EditBuffer *b, int offset, int c);
 int eb_insert_utf8_buf(EditBuffer *b, int offset, const char *buf, int len);

Index: qeconfig.h
===================================================================
RCS file: /sources/qemacs/qemacs/qeconfig.h,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -b -r1.38 -r1.39
--- qeconfig.h  13 Jan 2014 19:30:59 -0000      1.38
+++ qeconfig.h  14 Jan 2014 03:29:37 -0000      1.39
@@ -333,6 +333,8 @@
           "doctor", do_doctor)
     CMD0( KEY_CTRLX('u'), KEY_CTRL('_'),
           "undo", do_undo)
+    CMD0( KEY_CTRLX('r'), KEY_CTRLX(KEY_CTRL('_')),
+          "redo", do_redo)
     CMD3( KEY_META('g'), KEY_NONE,
           "goto-line", do_goto, ESsi, 'l',
           "us{Goto line: }" "v")

Index: shell.c
===================================================================
RCS file: /sources/qemacs/qemacs/shell.c,v
retrieving revision 1.75
retrieving revision 1.76
diff -u -b -r1.75 -r1.76
--- shell.c     7 Jan 2014 14:44:23 -0000       1.75
+++ shell.c     14 Jan 2014 03:29:37 -0000      1.76
@@ -487,26 +487,27 @@
 static int tty_put_char(ShellState *s, int c)
 {
     char buf[1];
-    int c1, cur_len, offset;
+    int c1, cur_len, offset, offset1;
 
+    offset = s->cur_offset;
     buf[0] = c;
-    c1 = eb_nextc(s->b, s->cur_offset, &offset);
+    c1 = eb_nextc(s->b, offset, &offset1);
     if (c1 == '\n') {
         /* insert */
-        eb_insert(s->b, s->cur_offset, buf, 1);
+        eb_insert(s->b, offset, buf, 1);
     } else {
         /* check for (c1 != c) is not advisable optimisation because
          * re-writing the same character may cause color changes.
          */
-        cur_len = offset - s->cur_offset;
+        cur_len = offset1 - offset;
         if (cur_len == 1) {
-            eb_write(s->b, s->cur_offset, buf, 1);
+            eb_write(s->b, offset, buf, 1);
         } else {
-            eb_delete(s->b, s->cur_offset, cur_len);
-            eb_insert(s->b, s->cur_offset, buf, 1);
+            eb_delete(s->b, offset, cur_len);
+            eb_insert(s->b, offset, buf, 1);
         }
     }
-    return s->cur_offset + 1;
+    return s->cur_offset = offset + 1;
 }
 
 static void tty_csi_m(ShellState *s, int c, int has_param)
@@ -742,6 +743,8 @@
     int i, offset, offset1, offset2, n;
     char buf1[10];
 
+    offset = s->cur_offset;
+
 #define ESC2(c1,c2)  (((c1)<<8)|((unsigned char)c2))
     /* some bytes are state independent */
     switch (c) {
@@ -768,9 +771,9 @@
         case 8:         /* ^H  BS = backspace */
             {
                 int c1;
-                c1 = eb_prevc(s->b, s->cur_offset, &offset);
+                c1 = eb_prevc(s->b, offset, &offset1);
                 if (c1 != '\n') {
-                    s->cur_offset = offset;
+                    s->cur_offset = offset1;
                     /* back_color_erase */
                     //tty_put_char(s, ' ');
                 }
@@ -779,14 +782,13 @@
         case 9:        /* ^I  HT = horizontal tab */
             {
                 int col_num, cur_line;
-                eb_get_pos(s->b, &cur_line, &col_num, s->cur_offset);
+                eb_get_pos(s->b, &cur_line, &col_num, offset);
                 tty_goto_xy(s, (col_num + 8) & ~7, 0, 2);
                 break;
             }
         case 10:        /* ^J  NL = line feed */
             /* go to next line */
             /* CG: should check if column should be kept */
-            offset = s->cur_offset;
             for (;;) {
                 if (offset == s->b->total_size) {
                     /* add a new line */
@@ -800,11 +802,12 @@
                 if (c == '\n')
                     break;
             }
+            s->b->last_log = 0; /* close undo record */
             s->cur_offset = offset;
             break;
         case 13:        /* ^M  CR = carriage return */
             /* move to bol */
-            s->cur_offset = eb_goto_bol(s->b, s->cur_offset);
+            s->cur_offset = eb_goto_bol(s->b, offset);
             break;
         case 14:        /* ^N  SO = shift out */
             s->shifted = s->charset[s->cset = 1];
@@ -870,21 +873,21 @@
                     buf1[0] = c;
                     len = 1;
                 }
-                c1 = eb_nextc(s->b, s->cur_offset, &offset);
+                c1 = eb_nextc(s->b, offset, &offset1);
                 /* Should simplify with tty_put_char */
                 if (c1 == '\n') {
                     /* insert */
-                    eb_insert(s->b, s->cur_offset, buf1, len);
+                    eb_insert(s->b, offset, buf1, len);
                 } else {
-                    cur_len = offset - s->cur_offset;
+                    cur_len = offset1 - offset;
                     if (cur_len == len) {
-                        eb_write(s->b, s->cur_offset, buf1, len);
+                        eb_write(s->b, offset, buf1, len);
                     } else {
-                        eb_delete(s->b, s->cur_offset, cur_len);
-                        eb_insert(s->b, s->cur_offset, buf1, len);
+                        eb_delete(s->b, offset, cur_len);
+                        eb_insert(s->b, offset, buf1, len);
                     }
                 }
-                s->cur_offset += len;
+                s->cur_offset = offset + len;
             }
             break;
         }
@@ -895,20 +898,20 @@
             int c1, cur_len, len;
 
             len = s->utf8_len;
-            c1 = eb_nextc(s->b, s->cur_offset, &offset);
+            c1 = eb_nextc(s->b, offset, &offset1);
             if (c1 == '\n') {
                 /* insert */
-                eb_insert(s->b, s->cur_offset, s->utf8_buf, len);
+                eb_insert(s->b, offset, s->utf8_buf, len);
             } else {
-                cur_len = offset - s->cur_offset;
+                cur_len = offset1 - offset;
                 if (cur_len == len) {
-                    eb_write(s->b, s->cur_offset, s->utf8_buf, len);
+                    eb_write(s->b, offset, s->utf8_buf, len);
                 } else {
-                    eb_delete(s->b, s->cur_offset, cur_len);
-                    eb_insert(s->b, s->cur_offset, s->utf8_buf, len);
+                    eb_delete(s->b, offset, cur_len);
+                    eb_insert(s->b, offset, s->utf8_buf, len);
                 }
             }
-            s->cur_offset += len;
+            s->cur_offset = offset + len;
             s->state = TTY_STATE_NORM;
         }
         break;
@@ -1106,8 +1109,8 @@
                 break;
             case 'K':  /* EL: erase line or parts of it */
                        /*     0: to end, 1: from begin, 2: all line */
-                offset1 = eb_goto_eol(s->b, s->cur_offset);
-                eb_delete(s->b, s->cur_offset, offset1 - s->cur_offset);
+                offset1 = eb_goto_eol(s->b, offset);
+                eb_delete(s->b, offset, offset1 - offset);
                 break;
             case 'L':  /* IL: insert lines */
                 /* TODO! scroll down */
@@ -1117,21 +1120,23 @@
                 /* TODO! scroll up */
                 //put_status(NULL, "delete lines %d", s->esc_params[0]);
                 break;
-            case '@':  /* ICH: insert chars */
+            case '@':  /* ICH: insert chars (no cursor update) */
                 buf1[0] = ' ';
                 for (n = s->esc_params[0]; n > 0; n--) {
-                    eb_insert(s->b, s->cur_offset, buf1, 1);
+                    /* XXX: incorrect for non 8 bit charsets */
+                    eb_insert(s->b, offset, buf1, 1);
                 }
+                s->cur_offset = offset;
                 break;
             case 'P':  /* DCH: delete chars */
-                offset1 = s->cur_offset;
+                offset1 = offset;
                 for (n = s->esc_params[0]; n > 0; n--) {
                     c = eb_nextc(s->b, offset1, &offset2);
                     if (c == '\n')
                         break;
                     offset1 = offset2;
                 }
-                eb_delete(s->b, s->cur_offset, offset1 - s->cur_offset);
+                eb_delete(s->b, offset, offset1 - offset);
                 break;
             case 'c':  /* DA: terminal type query */
                 break;
@@ -1141,7 +1146,7 @@
                        launch qemacs in qemacs (in 8859-1) ! */
                     char buf2[20];
                     int col_num, cur_line;
-                    eb_get_pos(s->b, &cur_line, &col_num, s->cur_offset);
+                    eb_get_pos(s->b, &cur_line, &col_num, offset);
                     /* XXX: actually send position of point in window */
                     snprintf(buf2, sizeof(buf2), "\033[%d;%dR",
                              1, col_num + 1);
@@ -1172,7 +1177,7 @@
                 break;
             case 'X':  /* ECH: erase n characters w/o moving cursor */
                 for (n = s->esc_params[0]; n > 0; n--) {
-                    s->cur_offset = tty_put_char(s, ' ');
+                    tty_put_char(s, ' ');
                 }
                 /* CG: should save and restore cursor */
                 break;
@@ -1203,10 +1208,8 @@
 /* modify the color according to the current one (may be incorrect if
    we are editing because we should write default color) */
 static void shell_color_callback(__unused__ EditBuffer *b,
-                                 void *opaque,
-                                 enum LogOperation op,
-                                 int offset,
-                                 int size)
+                                 void *opaque, int arg,
+                                 enum LogOperation op, int offset, int size)
 {
     ShellState *s = opaque;
     unsigned char buf[256];
@@ -1303,6 +1306,7 @@
         /* Suspend BF_READONLY flag to allow shell output to readonly buffer */
         int save_readonly = s->b->flags & BF_READONLY;
         s->b->flags &= ~BF_READONLY;
+        s->b->last_log = 0;
 
         for (i = 0; i < len; i++)
             tty_emulate(s, buf[i]);
@@ -1434,7 +1438,8 @@
     }
     b->priv_data = s;
     b->close = shell_close;
-    eb_add_callback(b, eb_offset_callback, &s->cur_offset);
+    /* Track cursor with edge effect */
+    eb_add_callback(b, eb_offset_callback, &s->cur_offset, 1);
     s->b = b;
     s->pty_fd = -1;
     s->pid = -1;
@@ -1454,7 +1459,7 @@
         }
         /* no undo info in this color buffer */
         b_color->save_log = 0;
-        eb_add_callback(b, shell_color_callback, s);
+        eb_add_callback(b, shell_color_callback, s, 0);
         s->b_color = b_color;
     }
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]