]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix bidi cursor motion when a line begins with a composed character.
authorEli Zaretskii <eliz@gnu.org>
Fri, 19 Aug 2011 10:18:40 +0000 (13:18 +0300)
committerEli Zaretskii <eliz@gnu.org>
Fri, 19 Aug 2011 10:18:40 +0000 (13:18 +0300)
 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
src/ChangeLog
src/xdisp.c

index 313298de97eaf437ce1e4725f2ea6ecfc638b3ff..b82147b97f1ae6d12274165946f9de742854e767 100644 (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
index 2b5b6fd060242e585fc3533282d9b125f99e33b0..b5474fcc55bc7ad04b1ad10b2fff31e6bfb824ee 100644 (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
index ea98ac575d9b67ec8de304ffceb3a36d96c00460..e773830800e8098cf6b4e5c47f312be083837852 100644 (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)