Fix bidi initialization in init_from_display_pos.

src/xdisp.c (init_from_display_pos): Fix initialization of the bidi
 iterator when starting in the middle of a display or overlay
 string.

Fixes: debbugs:12745
This commit is contained in:
Eli Zaretskii 2012-11-03 11:25:34 +02:00
parent c65b407b40
commit 67b50ba47b
2 changed files with 44 additions and 0 deletions

View file

@ -1,3 +1,9 @@
2012-11-03 Eli Zaretskii <eliz@gnu.org>
* xdisp.c (init_from_display_pos): Fix initialization of the bidi
iterator when starting in the middle of a display or overlay
string. (Bug#12745)
2012-11-01 Eli Zaretskii <eliz@gnu.org>
* w32proc.c (getpgrp, setpgid): New functions. (Bug#12776)

View file

@ -928,6 +928,7 @@ static enum move_it_result
move_it_in_display_line_to (struct it *, ptrdiff_t, int,
enum move_operation_enum);
void move_it_vertically_backward (struct it *, int);
static void get_visually_first_element (struct it *);
static void init_to_row_start (struct it *, struct window *,
struct glyph_row *);
static int init_to_row_end (struct it *, struct window *,
@ -3113,6 +3114,40 @@ init_from_display_pos (struct it *it, struct window *w, struct display_pos *pos)
eassert (STRINGP (it->string));
it->current.string_pos = pos->string_pos;
it->method = GET_FROM_STRING;
it->end_charpos = SCHARS (it->string);
/* Set up the bidi iterator for this overlay string. */
if (it->bidi_p)
{
it->bidi_it.string.lstring = it->string;
it->bidi_it.string.s = NULL;
it->bidi_it.string.schars = SCHARS (it->string);
it->bidi_it.string.bufpos = it->overlay_strings_charpos;
it->bidi_it.string.from_disp_str = it->string_from_display_prop_p;
it->bidi_it.string.unibyte = !it->multibyte_p;
bidi_init_it (IT_STRING_CHARPOS (*it), IT_STRING_BYTEPOS (*it),
FRAME_WINDOW_P (it->f), &it->bidi_it);
/* Synchronize the state of the bidi iterator with
pos->string_pos. For any string position other than
zero, this will be done automagically when we resume
iteration over the string and get_visually_first_element
is called. But if string_pos is zero, and the string is
to be reordered for display, we need to resync manually,
since it could be that the iteration state recorded in
pos ended at string_pos of 0 moving backwards in string. */
if (CHARPOS (pos->string_pos) == 0)
{
get_visually_first_element (it);
if (IT_STRING_CHARPOS (*it) != 0)
do {
/* Paranoia. */
eassert (it->bidi_it.charpos < it->bidi_it.string.schars);
bidi_move_to_visually_next (&it->bidi_it);
} while (it->bidi_it.charpos != 0);
}
eassert (IT_STRING_CHARPOS (*it) == it->bidi_it.charpos
&& IT_STRING_BYTEPOS (*it) == it->bidi_it.bytepos);
}
}
if (CHARPOS (pos->string_pos) >= 0)
@ -3122,6 +3157,9 @@ init_from_display_pos (struct it *it, struct window *w, struct display_pos *pos)
IT should already be filled with that string. */
it->current.string_pos = pos->string_pos;
eassert (STRINGP (it->string));
if (it->bidi_p)
bidi_init_it (IT_STRING_CHARPOS (*it), IT_STRING_BYTEPOS (*it),
FRAME_WINDOW_P (it->f), &it->bidi_it);
}
/* Restore position in display vector translations, control