[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;
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemacs-commit] qemacs buffer.c html.c image.c qe.c qe.h qeconf...,
Charlie Gordon <=