summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenichi Handa <handa@m17n.org>2009-12-25 02:41:59 +0000
committerKenichi Handa <handa@m17n.org>2009-12-25 02:41:59 +0000
commit4abd35cb643b6c18207955a9615e8993eed74b88 (patch)
tree3fa329eaf38cd74757393f9a7f24fcd784c875b6
parent7450fd364a0cb12a849c0806808658972b2e3646 (diff)
downloademacs-4abd35cb643b6c18207955a9615e8993eed74b88.tar.gz
(command_loop_1): Force redisplay if the last point
was within a composition. (adjust_point_for_property): Don't adjust point for automatic composition when called after buffer modification.
-rw-r--r--src/keyboard.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/src/keyboard.c b/src/keyboard.c
index f15b7971c45..37f0ca8c83a 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -1976,9 +1976,20 @@ command_loop_1 ()
if (current_buffer == prev_buffer
&& last_point_position != PT
&& NILP (Vdisable_point_adjustment)
- && NILP (Vglobal_disable_point_adjustment)
- && !already_adjusted)
- adjust_point_for_property (last_point_position, MODIFF != prev_modiff);
+ && NILP (Vglobal_disable_point_adjustment))
+ {
+ if (composition_adjust_point (last_point_position,
+ last_point_position)
+ != last_point_position)
+ /* The last point was temporarily set within a grapheme
+ cluster to prevent automatic composition. To recover
+ the automatic composition, we must update the
+ display. */
+ windows_or_buffers_changed++;
+ if (!already_adjusted)
+ adjust_point_for_property (last_point_position,
+ MODIFF != prev_modiff);
+ }
/* Install chars successfully executed in kbd macro. */
@@ -2009,7 +2020,11 @@ adjust_point_for_property (last_pt, modified)
{
EMACS_INT beg, end;
Lisp_Object val, overlay, tmp;
- int check_composition = 1, check_display = 1, check_invisible = 1;
+ /* When called after buffer modification, we should temporarily
+ suppress the point adjustment for automatic composition so that a
+ user can keep inserting another character at point or keep
+ deleting characters around point. */
+ int check_composition = ! modified, check_display = 1, check_invisible = 1;
int orig_pt = PT;
/* FIXME: cycling is probably not necessary because these properties
@@ -2019,7 +2034,7 @@ adjust_point_for_property (last_pt, modified)
/* FIXME: check `intangible'. */
if (check_composition
&& PT > BEGV && PT < ZV
- && (beg = composition_adjust_point (last_pt)) != PT)
+ && (beg = composition_adjust_point (last_pt, PT)) != PT)
{
SET_PT (beg);
check_display = check_invisible = 1;