From 54a1215bccc20584285799c015a81f668b266bbc Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Fri, 19 Aug 2011 13:18:40 +0300 Subject: [PATCH] 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. --- lisp/minibuffer.el | 22 ++++++++++++++++++---- src/ChangeLog | 7 +++++++ src/xdisp.c | 19 +++++++++++++------ 3 files changed, 38 insertions(+), 10 deletions(-) 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) -- 2.11.4.GIT