# HG changeset patch # User Richard M. Stallman # Date 730976473 0 # Node ID de0a0ed7318ea604ca2eb57c229d07a5430c8c69 # Parent 239a8c1cb40f30520a159d9d74f480f5de90e76e (record_property_change): Typo in last change. (Fprimitive_undo): Handle property-change undo entry. (record_property_change): New function. diff -r 239a8c1cb40f -r de0a0ed7318e src/undo.c --- a/src/undo.c Mon Mar 01 08:59:36 1993 +0000 +++ b/src/undo.c Mon Mar 01 09:01:13 1993 +0000 @@ -124,6 +124,41 @@ current_buffer->undo_list = Fcons (Fcons (Qt, Fcons (high, low)), current_buffer->undo_list); } +/* Record a change in property PROP (whose old value was VAL) + for LENGTH characters starting at position BEG in BUFFER. */ + +record_property_change (beg, length, prop, value, buffer) + int beg, length; + Lisp_Object prop, value, buffer; +{ + Lisp_Object lbeg, lend, entry; + struct buffer *obuf = current_buffer; + int boundary = 0; + + if (!EQ (buffer, last_undo_buffer)) + boundary = 1; + last_undo_buffer = buffer; + + if (EQ (current_buffer->undo_list, Qt)) + return; + + /* Switch temporarily to the buffer that was changed. */ + current_buffer = XBUFFER (buffer); + + if (boundary) + Fundo_boundary (); + + if (MODIFF <= current_buffer->save_modified) + record_first_change (); + + XSET (lbeg, Lisp_Int, beg); + XSET (lend, Lisp_Int, beg + length); + entry = Fcons (Qnil, Fcons (prop, Fcons (value, Fcons (lbeg, lend)))); + current_buffer->undo_list = Fcons (entry, current_buffer->undo_list); + + current_buffer = obuf; +} + DEFUN ("undo-boundary", Fundo_boundary, Sundo_boundary, 0, 0, 0, "Mark a boundary between units of undo.\n\ An undo command will stop at this point,\n\ @@ -299,6 +334,20 @@ #endif /* CLASH_DETECTION */ Fset_buffer_modified_p (Qnil); } + if (EQ (car, Qnil)) + { + /* Element (t prop val beg . end) records property change. */ + Lisp_Object beg, end, prop, val; + + prop = Fcar (cdr); + cdr = Fcdr (cdr); + val = Fcar (cdr); + cdr = Fcdr (cdr); + beg = Fcar (cdr); + end = Fcdr (cdr); + + Fput_text_property (beg, end, prop, val, Qnil); + } else if (XTYPE (car) == Lisp_Int && XTYPE (cdr) == Lisp_Int) { /* Element (BEG . END) means range was inserted. */