emacs-diffs
[Top][All Lists]
Advanced

[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];




reply via email to

[Prev in Thread] Current Thread [Next in Thread]