Mercurial > emacs
changeset 106631:389860cebad8
(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.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Fri, 25 Dec 2009 02:41:59 +0000 |
parents | af4f4af3e19f |
children | 484702d8c582 |
files | src/keyboard.c |
diffstat | 1 files changed, 20 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/keyboard.c Thu Dec 24 04:35:17 2009 +0000 +++ b/src/keyboard.c Fri Dec 25 02:41:59 2009 +0000 @@ -1976,9 +1976,20 @@ 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 @@ { 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 @@ /* 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;