Fix bidi cursor motion when a line begins with a composed character.

src/xdisp.c (RECORD_MAX_MIN_POS): If the display element comes from
 a composition, take its buffer position from IT->cmp_it.charpos.
This commit is contained in:
Eli Zaretskii 2011-08-19 13:18:40 +03:00
parent f086702702
commit 54a1215bcc
3 changed files with 38 additions and 10 deletions

View file

@ -1119,13 +1119,27 @@ It also eliminates runs of equal strings."
`(display (space :align-to ,column)))
nil))))
(if (not (consp str))
(put-text-property (point) (progn (insert str) (point))
(put-text-property (point)
(progn
(insert (bidi-string-mark-left-to-right
str))
(point))
'mouse-face 'highlight)
(put-text-property (point) (progn (insert (car str)) (point))
(put-text-property (point)
(progn
(insert
(bidi-string-mark-left-to-right
(car str)))
(point))
'mouse-face 'highlight)
(add-text-properties (point) (progn (insert (cadr str)) (point))
(add-text-properties (point)
(progn
(insert
(bidi-string-mark-left-to-right
(cadr str)))
(point))
'(mouse-face nil
face completions-annotations)))
face completions-annotations)))
(cond
((eq completions-format 'vertical)
;; Vertical format

View file

@ -1,3 +1,10 @@
2011-08-19 Eli Zaretskii <eliz@gnu.org>
* xdisp.c (RECORD_MAX_MIN_POS): If the display element comes from
a composition, take its buffer position from IT->cmp_it.charpos.
Fixes cursor positioning at the beginning of a line that begins
with a composed character.
2011-08-18 Eli Zaretskii <eliz@gnu.org>
* bidi.c (bidi_get_type): If bidi_type_table reports zero as the

View file

@ -18386,15 +18386,22 @@ display_line (struct it *it)
#define RECORD_MAX_MIN_POS(IT) \
do \
{ \
if (IT_CHARPOS (*(IT)) < min_pos) \
int composition_p = (IT)->what == IT_COMPOSITION; \
EMACS_INT current_pos = \
composition_p ? (IT)->cmp_it.charpos \
: IT_CHARPOS (*(IT)); \
EMACS_INT current_bpos = \
composition_p ? CHAR_TO_BYTE (current_pos) \
: IT_BYTEPOS (*(IT)); \
if (current_pos < min_pos) \
{ \
min_pos = IT_CHARPOS (*(IT)); \
min_bpos = IT_BYTEPOS (*(IT)); \
min_pos = current_pos; \
min_bpos = current_bpos; \
} \
if (IT_CHARPOS (*(IT)) > max_pos) \
if (current_pos > max_pos) \
{ \
max_pos = IT_CHARPOS (*(IT)); \
max_bpos = IT_BYTEPOS (*(IT)); \
max_pos = current_pos; \
max_bpos = current_bpos; \
} \
} \
while (0)