From: Eli Zaretskii Date: Fri, 19 Aug 2011 10:18:40 +0000 (+0300) Subject: Fix bidi cursor motion when a line begins with a composed character. X-Git-Tag: emacs-pretest-24.0.90~104^2~124^2~5 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=54a1215bccc20584285799c015a81f668b266bbc;p=emacs.git 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. --- diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el index 313298de97e..b82147b97f1 100644 --- a/lisp/minibuffer.el +++ b/lisp/minibuffer.el @@ -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 diff --git a/src/ChangeLog b/src/ChangeLog index 2b5b6fd0602..b5474fcc55b 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,10 @@ +2011-08-19 Eli Zaretskii + + * 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 * bidi.c (bidi_get_type): If bidi_type_table reports zero as the diff --git a/src/xdisp.c b/src/xdisp.c index ea98ac575d9..e773830800e 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -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)