[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] Changes to emacs/src/xdisp.c
From: |
Kenichi Handa |
Subject: |
[Emacs-diffs] Changes to emacs/src/xdisp.c |
Date: |
Wed, 29 Jan 2003 08:12:47 -0500 |
Index: emacs/src/xdisp.c
diff -c emacs/src/xdisp.c:1.802 emacs/src/xdisp.c:1.803
*** emacs/src/xdisp.c:1.802 Mon Jan 20 03:54:46 2003
--- emacs/src/xdisp.c Wed Jan 29 08:12:46 2003
***************
*** 9460,9465 ****
--- 9460,9473 ----
{
struct glyph *glyph = row->glyphs[TEXT_AREA];
struct glyph *end = glyph + row->used[TEXT_AREA];
+ /* The first glyph that starts a sequence of glyphs from string. */
+ struct glyph *string_start;
+ /* The X coordinate of string_start. */
+ int string_start_x;
+ /* The last known character position. */
+ int last_pos = MATRIX_ROW_START_CHARPOS (row) + delta;
+ /* The last known character position before string_start. */
+ int string_before_pos;
int x = row->x;
int pt_old = PT - delta;
***************
*** 9475,9487 ****
++glyph;
}
while (glyph < end
&& !INTEGERP (glyph->object)
&& (!BUFFERP (glyph->object)
! || glyph->charpos < pt_old))
{
! x += glyph->pixel_width;
! ++glyph;
}
w->cursor.hpos = glyph - row->glyphs[TEXT_AREA];
--- 9483,9545 ----
++glyph;
}
+ string_start = NULL;
while (glyph < end
&& !INTEGERP (glyph->object)
&& (!BUFFERP (glyph->object)
! || (last_pos = glyph->charpos) < pt_old))
{
! if (! STRINGP (glyph->object))
! {
! string_start = NULL;
! x += glyph->pixel_width;
! ++glyph;
! }
! else
! {
! string_before_pos = last_pos;
! string_start = glyph;
! string_start_x = x;
! /* Skip all glyphs from string. */
! do
! {
! x += glyph->pixel_width;
! ++glyph;
! }
! while (glyph < end && STRINGP (glyph->object));
! }
! }
!
! if (string_start
! && (glyph == end || !BUFFERP (glyph->object) || last_pos > pt_old))
! {
! /* We may have skipped over point because the previous glyphs
! are from string. As there's no easy way to know the
! character position of the current glyph, find the correct
! glyph on point by scanning from string_start again. */
! Lisp_Object pos, limit;
!
! limit = make_number (MATRIX_ROW_END_CHARPOS (row) + delta);
! glyph = string_start;
! x = string_start_x;
! pos = make_number (string_buffer_position (w, glyph->object,
! string_before_pos));
! pos = Fnext_single_char_property_change (pos, Qdisplay, Qnil, limit);
! while (XINT (pos) <= pt_old)
! {
! /* Skip glyphs from the same string. */
! do
! {
! x += glyph->pixel_width;
! ++glyph;
! }
! while (glyph < end
! && EQ (glyph->object, string_start->object));
! if (glyph == end || !STRINGP (glyph->object))
! break;
! string_start = glyph;
! pos = Fnext_single_char_property_change (pos, Qdisplay, Qnil, limit);
! }
}
w->cursor.hpos = glyph - row->glyphs[TEXT_AREA];