register struct Lisp_Char_Table *dp = buffer_display_table ();
int multibyte = !NILP (current_buffer->enable_multibyte_characters);
struct composition_it cmp_it;
+ Lisp_Object window;
+ struct window *w;
/* Start the scan at the beginning of this line with column number 0. */
register EMACS_INT col = 0, prev_col = 0;
next_boundary = scan;
}
+ window = Fget_buffer_window (Fcurrent_buffer (), Qnil);
+ w = ! NILP (window) ? XWINDOW (window) : NULL;
+
if (tab_width <= 0 || tab_width > 1000) tab_width = 8;
bzero (&cmp_it, sizeof cmp_it);
cmp_it.id = -1;
if (cmp_it.id >= 0
|| (scan == cmp_it.stop_pos
&& composition_reseat_it (&cmp_it, scan, scan_byte, end,
- XWINDOW (selected_window), NULL, Qnil)))
+ w, NULL, Qnil)))
composition_update_it (&cmp_it, scan, scan_byte, Qnil);
if (cmp_it.id >= 0)
{
{
if (it.cmp_it.id >= 0)
it_overshoot_expected = 1;
- if (it.method == GET_FROM_STRING)
+ else if (it.method == GET_FROM_STRING)
{
const char *s = SDATA (it.string);
const char *e = s + SBYTES (it.string);
}
else
{
- if (IT_CHARPOS (it) > PT)
+ if (IT_CHARPOS (it) > it_start)
{
/* IT may move too far if truncate-lines is on and PT
lies beyond the right margin. In that case,
which might span multiple screen lines (e.g., if it's
on a multi-line display string). We want to start
from the last line that it occupies. */
- it.vpos = 0;
- if (PT < ZV)
+ if (it_start < ZV)
{
- while (IT_CHARPOS (it) <= PT)
- move_it_by_lines (&it, 1, 0);
- move_it_by_lines (&it, XINT (lines) - 1, 0);
+ while (IT_CHARPOS (it) <= it_start)
+ {
+ it.vpos = 0;
+ move_it_by_lines (&it, 1, 0);
+ }
+ if (XINT (lines) > 1)
+ move_it_by_lines (&it, XINT (lines) - 1, 0);
}
else
- move_it_by_lines (&it, XINT (lines), 0);
+ {
+ it.vpos = 0;
+ move_it_by_lines (&it, XINT (lines), 0);
+ }
}
}