summaryrefslogtreecommitdiff
path: root/src/insdel.c
diff options
context:
space:
mode:
authorGerd Moellmann <gerd@gnu.org>2001-05-16 16:07:20 +0000
committerGerd Moellmann <gerd@gnu.org>2001-05-16 16:07:20 +0000
commit460e6bae47b1b320de89c3048a27bee38556d6ab (patch)
treef8e1d33a3a96a9e5f2a78661452e487f5ba4b923 /src/insdel.c
parent99c78ce82daf26c50509225aecd4ef1945b04f95 (diff)
downloademacs-460e6bae47b1b320de89c3048a27bee38556d6ab.tar.gz
(signal_before_change, signal_after_change): Consider a
local change hook which changes the buffer.
Diffstat (limited to 'src/insdel.c')
-rw-r--r--src/insdel.c43
1 files changed, 36 insertions, 7 deletions
diff --git a/src/insdel.c b/src/insdel.c
index 7ea1181703b..99576218b4b 100644
--- a/src/insdel.c
+++ b/src/insdel.c
@@ -1,5 +1,6 @@
/* Buffer insertion/deletion and gap motion for GNU Emacs.
- Copyright (C) 1985, 86,93,94,95,97,98, 1999, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1985, 86,93,94,95,97,98, 1999, 2000, 2001
+ Free Software Foundation, Inc.
This file is part of GNU Emacs.
@@ -1901,6 +1902,8 @@ signal_before_change (start_int, end_int, preserve_ptr)
Lisp_Object before_change_functions;
Lisp_Object after_change_functions;
struct gcpro gcpro1, gcpro2;
+ struct buffer *old = current_buffer;
+ struct buffer *new;
PRESERVE_VALUE;
PRESERVE_START_END;
@@ -1920,9 +1923,21 @@ signal_before_change (start_int, end_int, preserve_ptr)
args[2] = FETCH_END;
run_hook_list_with_args (before_change_functions, 3, args);
- /* "Unbind" the variables we "bound" to nil. */
- Vbefore_change_functions = before_change_functions;
- Vafter_change_functions = after_change_functions;
+ /* "Unbind" the variables we "bound" to nil. Beware a
+ buffer-local hook which changes the buffer when run (e.g. W3). */
+ if (old != current_buffer)
+ {
+ new = current_buffer;
+ set_buffer_internal (old);
+ Vbefore_change_functions = before_change_functions;
+ Vafter_change_functions = after_change_functions;
+ set_buffer_internal (new);
+ }
+ else
+ {
+ Vbefore_change_functions = before_change_functions;
+ Vafter_change_functions = after_change_functions;
+ }
UNGCPRO;
}
@@ -1988,6 +2003,8 @@ signal_after_change (charpos, lendel, lenins)
Lisp_Object args[4];
Lisp_Object before_change_functions;
Lisp_Object after_change_functions;
+ struct buffer *old = current_buffer;
+ struct buffer *new;
struct gcpro gcpro1, gcpro2;
/* "Bind" before-change-functions and after-change-functions
@@ -2007,9 +2024,21 @@ signal_after_change (charpos, lendel, lenins)
run_hook_list_with_args (after_change_functions,
4, args);
- /* "Unbind" the variables we "bound" to nil. */
- Vbefore_change_functions = before_change_functions;
- Vafter_change_functions = after_change_functions;
+ /* "Unbind" the variables we "bound" to nil. Beware a
+ buffer-local hook which changes the buffer when run (e.g. W3). */
+ if (old != current_buffer)
+ {
+ new = current_buffer;
+ set_buffer_internal (old);
+ Vbefore_change_functions = before_change_functions;
+ Vafter_change_functions = after_change_functions;
+ set_buffer_internal (new);
+ }
+ else
+ {
+ Vbefore_change_functions = before_change_functions;
+ Vafter_change_functions = after_change_functions;
+ }
UNGCPRO;
}