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 [emacs-unicode-2]


From: Miles Bader
Subject: [Emacs-diffs] Changes to emacs/src/xdisp.c [emacs-unicode-2]
Date: Wed, 08 Dec 2004 00:47:42 -0500

Index: emacs/src/xdisp.c
diff -c emacs/src/xdisp.c:1.843.2.33 emacs/src/xdisp.c:1.843.2.34
*** emacs/src/xdisp.c:1.843.2.33        Fri Nov 19 06:54:58 2004
--- emacs/src/xdisp.c   Wed Dec  8 05:02:19 2004
***************
*** 810,816 ****
  
  /* Function prototypes.  */
  
! static void setup_for_ellipsis P_ ((struct it *));
  static void mark_window_display_accurate_1 P_ ((struct window *, int));
  static int single_display_prop_string_p P_ ((Lisp_Object, Lisp_Object));
  static int display_prop_string_p P_ ((Lisp_Object, Lisp_Object));
--- 810,816 ----
  
  /* Function prototypes.  */
  
! static void setup_for_ellipsis P_ ((struct it *, int));
  static void mark_window_display_accurate_1 P_ ((struct window *, int));
  static int single_display_prop_string_p P_ ((Lisp_Object, Lisp_Object));
  static int display_prop_string_p P_ ((Lisp_Object, Lisp_Object));
***************
*** 3230,3236 ****
              it->stack[it->sp - 1].display_ellipsis_p = display_ellipsis_p;
            }
          else if (display_ellipsis_p)
!           setup_for_ellipsis (it);
        }
      }
  
--- 3230,3236 ----
              it->stack[it->sp - 1].display_ellipsis_p = display_ellipsis_p;
            }
          else if (display_ellipsis_p)
!           setup_for_ellipsis (it, 0);
        }
      }
  
***************
*** 3238,3251 ****
  }
  
  
! /* Make iterator IT return `...' next.  */
  
  static void
! setup_for_ellipsis (it)
       struct it *it;
  {
!   if (it->dp
!       && VECTORP (DISP_INVIS_VECTOR (it->dp)))
      {
        struct Lisp_Vector *v = XVECTOR (DISP_INVIS_VECTOR (it->dp));
        it->dpvec = v->contents;
--- 3238,3254 ----
  }
  
  
! /* Make iterator IT return `...' next.
!    Replaces LEN characters from buffer.  */
  
  static void
! setup_for_ellipsis (it, len)
       struct it *it;
+      int len;
  {
!   /* Use the display table definition for `...'.  Invalid glyphs
!      will be handled by the method returning elements from dpvec.  */
!   if (it->dp && VECTORP (DISP_INVIS_VECTOR (it->dp)))
      {
        struct Lisp_Vector *v = XVECTOR (DISP_INVIS_VECTOR (it->dp));
        it->dpvec = v->contents;
***************
*** 3258,3269 ****
        it->dpend = default_invis_vector + 3;
      }
  
!   /* The ellipsis display does not replace the display of the
!      character at the new position.  Indicate this by setting
!      IT->dpvec_char_len to zero.  */
!   it->dpvec_char_len = 0;
! 
    it->current.dpvec_index = 0;
    it->method = next_element_from_display_vector;
  }
  
--- 3261,3272 ----
        it->dpend = default_invis_vector + 3;
      }
  
!   it->dpvec_char_len = len;
    it->current.dpvec_index = 0;
+ 
+   /* Remember the current face id in case glyphs specify faces.
+      IT's face is restored in set_iterator_to_next.  */
+   it->saved_face_id = it->face_id;
    it->method = next_element_from_display_vector;
  }
  
***************
*** 3578,3584 ****
              || EQ (XCAR (prop), Qright_fringe))
          && CONSP (XCDR (prop)))
        {
!         unsigned face_id = DEFAULT_FACE_ID;
          int fringe_bitmap;
  
          /* Save current settings of IT so that we can restore them
--- 3581,3587 ----
              || EQ (XCAR (prop), Qright_fringe))
          && CONSP (XCDR (prop)))
        {
!         int face_id = DEFAULT_FACE_ID;
          int fringe_bitmap;
  
          /* Save current settings of IT so that we can restore them
***************
*** 3597,3606 ****
          if (CONSP (XCDR (XCDR (prop))))
            {
              Lisp_Object face_name = XCAR (XCDR (XCDR (prop)));
! 
!             face_id = lookup_named_face (it->f, face_name);
!             if (face_id < 0)
!               return 0;
            }
  
          push_it (it);
--- 3600,3608 ----
          if (CONSP (XCDR (XCDR (prop))))
            {
              Lisp_Object face_name = XCAR (XCDR (XCDR (prop)));
!             int face_id2 = lookup_named_face (it->f, face_name, 0);
!             if (face_id2 >= 0)
!               face_id = face_id2;
            }
  
          push_it (it);
***************
*** 4145,4151 ****
        /* If we have to display `...' for invisible text, set
         the iterator up for that.  */
        if (display_ellipsis_p)
!       setup_for_ellipsis (it);
      }
    else
      {
--- 4147,4153 ----
        /* If we have to display `...' for invisible text, set
         the iterator up for that.  */
        if (display_ellipsis_p)
!       setup_for_ellipsis (it, 0);
      }
    else
      {
***************
*** 4937,4943 ****
       we hit the end of what we iterate over.  Performance note: the
       function pointer `method' used here turns out to be faster than
       using a sequence of if-statements.  */
!   int success_p = (*it->method) (it);
  
    if (it->what == IT_CHARACTER)
      {
--- 4939,4948 ----
       we hit the end of what we iterate over.  Performance note: the
       function pointer `method' used here turns out to be faster than
       using a sequence of if-statements.  */
!   int success_p;
! 
!  get_next:
!   success_p = (*it->method) (it);
  
    if (it->what == IT_CHARACTER)
      {
***************
*** 4969,4982 ****
                  it->dpvec = v->contents;
                  it->dpend = v->contents + v->size;
                  it->current.dpvec_index = 0;
                  it->method = next_element_from_display_vector;
-                 success_p = get_next_display_element (it);
                }
              else
                {
                  set_iterator_to_next (it, 0);
-                 success_p = get_next_display_element (it);
                }
            }
  
          /* Translate control characters into `\003' or `^C' form.
--- 4974,4987 ----
                  it->dpvec = v->contents;
                  it->dpend = v->contents + v->size;
                  it->current.dpvec_index = 0;
+                 it->saved_face_id = it->face_id;
                  it->method = next_element_from_display_vector;
                }
              else
                {
                  set_iterator_to_next (it, 0);
                }
+             goto get_next;
            }
  
          /* Translate control characters into `\003' or `^C' form.
***************
*** 5008,5013 ****
--- 5013,5019 ----
                 IT->ctl_chars with glyphs for what we have to
                 display.  Then, set IT->dpvec to these glyphs.  */
              GLYPH g;
+             int ctl_len;
  
              if (it->c < 128 && it->ctl_arrow_p)
                {
***************
*** 5022,5035 ****
  
                  g = FAST_MAKE_GLYPH (it->c ^ 0100, 0);
                  XSETINT (it->ctl_chars[1], g);
! 
!                 /* Set up IT->dpvec and return first character from it.  */
!                 it->dpvec_char_len = it->len;
!                 it->dpvec = it->ctl_chars;
!                 it->dpend = it->dpvec + 2;
!                 it->current.dpvec_index = 0;
!                 it->method = next_element_from_display_vector;
!                 get_next_display_element (it);
                }
              else
                {
--- 5028,5034 ----
  
                  g = FAST_MAKE_GLYPH (it->c ^ 0100, 0);
                  XSETINT (it->ctl_chars[1], g);
!                 ctl_len = 2;
                }
              else
                {
***************
*** 5082,5097 ****
                      g = FAST_MAKE_GLYPH ((str[i] & 7) + '0', 0);
                      XSETINT (it->ctl_chars[i * 4 + 3], g);
                    }
! 
!                 /* Set up IT->dpvec and return the first character
!                      from it.  */
!                 it->dpvec_char_len = it->len;
!                 it->dpvec = it->ctl_chars;
!                 it->dpend = it->dpvec + len * 4;
!                 it->current.dpvec_index = 0;
!                 it->method = next_element_from_display_vector;
!                 get_next_display_element (it);
                }
            }
        }
  
--- 5081,5097 ----
                      g = FAST_MAKE_GLYPH ((str[i] & 7) + '0', 0);
                      XSETINT (it->ctl_chars[i * 4 + 3], g);
                    }
!                 ctl_len = len * 4;
                }
+ 
+             /* Set up IT->dpvec and return first character from it.  */
+             it->dpvec_char_len = it->len;
+             it->dpvec = it->ctl_chars;
+             it->dpend = it->dpvec + ctl_len;
+             it->current.dpvec_index = 0;
+             it->saved_face_id = it->face_id;
+             it->method = next_element_from_display_vector;
+             goto get_next;
            }
        }
  
***************
*** 5285,5295 ****
               && IT_STRING_CHARPOS (*it) >= 0));
  }
  
- 
  /* Load IT's display element fields with information about the next
     display element which comes from a display table entry or from the
     result of translating a control character to one of the forms `^C'
!    or `\003'.  IT->dpvec holds the glyphs to return as characters.  */
  
  static int
  next_element_from_display_vector (it)
--- 5285,5298 ----
               && IT_STRING_CHARPOS (*it) >= 0));
  }
  
  /* Load IT's display element fields with information about the next
     display element which comes from a display table entry or from the
     result of translating a control character to one of the forms `^C'
!    or `\003'.
! 
!    IT->dpvec holds the glyphs to return as characters.
!    IT->saved_face_id holds the face id before the display vector--
!    it is restored into IT->face_idin set_iterator_to_next.  */
  
  static int
  next_element_from_display_vector (it)
***************
*** 5298,5307 ****
    /* Precondition.  */
    xassert (it->dpvec && it->current.dpvec_index >= 0);
  
-   /* Remember the current face id in case glyphs specify faces.
-      IT's face is restored in set_iterator_to_next.  */
-   it->saved_face_id = it->face_id;
- 
    if (INTEGERP (*it->dpvec)
        && GLYPH_CHAR_VALID_P (XFASTINT (*it->dpvec)))
      {
--- 5301,5306 ----
***************
*** 5485,5512 ****
       struct it *it;
  {
    if (it->selective_display_ellipsis_p)
!     {
!       if (it->dp && VECTORP (DISP_INVIS_VECTOR (it->dp)))
!       {
!         /* Use the display table definition for `...'.  Invalid glyphs
!            will be handled by the method returning elements from dpvec.  */
!         struct Lisp_Vector *v = XVECTOR (DISP_INVIS_VECTOR (it->dp));
!         it->dpvec_char_len = it->len;
!         it->dpvec = v->contents;
!         it->dpend = v->contents + v->size;
!         it->current.dpvec_index = 0;
!         it->method = next_element_from_display_vector;
!       }
!       else
!       {
!         /* Use default `...' which is stored in default_invis_vector.  */
!         it->dpvec_char_len = it->len;
!         it->dpvec = default_invis_vector;
!         it->dpend = default_invis_vector + 3;
!         it->current.dpvec_index = 0;
!         it->method = next_element_from_display_vector;
!       }
!     }
    else
      {
        /* The face at the current position may be different from the
--- 5484,5490 ----
       struct it *it;
  {
    if (it->selective_display_ellipsis_p)
!     setup_for_ellipsis (it, it->len);
    else
      {
        /* The face at the current position may be different from the
***************
*** 14633,14639 ****
                  && glyph->u.ch == ' '))
          && trailing_whitespace_p (glyph->charpos))
        {
!         int face_id = lookup_named_face (f, Qtrailing_whitespace);
  
          while (glyph >= start
                 && BUFFERP (glyph->object)
--- 14611,14619 ----
                  && glyph->u.ch == ' '))
          && trailing_whitespace_p (glyph->charpos))
        {
!         int face_id = lookup_named_face (f, Qtrailing_whitespace, 0);
!         if (face_id < 0)
!           return;
  
          while (glyph >= start
                 && BUFFERP (glyph->object)
***************
*** 14726,14733 ****
       hscrolled.  This may stop at an x-position < IT->first_visible_x
       if the first glyph is partially visible or if we hit a line end.  */
    if (it->current_x < it->first_visible_x)
!     move_it_in_display_line_to (it, ZV, it->first_visible_x,
!                               MOVE_TO_POS | MOVE_TO_X);
  
    /* Get the initial row height.  This is either the height of the
       text hscrolled, if there is any, or zero.  */
--- 14706,14715 ----
       hscrolled.  This may stop at an x-position < IT->first_visible_x
       if the first glyph is partially visible or if we hit a line end.  */
    if (it->current_x < it->first_visible_x)
!     {
!       move_it_in_display_line_to (it, ZV, it->first_visible_x,
!                                 MOVE_TO_POS | MOVE_TO_X);
!     }
  
    /* Get the initial row height.  This is either the height of the
       text hscrolled, if there is any, or zero.  */
***************
*** 15056,15067 ****
                {
                  if (!get_next_display_element (it))
                    {
- #ifdef HAVE_WINDOW_SYSTEM
                      it->continuation_lines_width = 0;
                      row->ends_at_zv_p = 1;
                      row->exact_window_width_line_p = 1;
                      break;
- #endif /* HAVE_WINDOW_SYSTEM */
                    }
                  if (ITERATOR_AT_END_OF_LINE_P (it))
                    {
--- 15038,15047 ----
***************
*** 18376,18381 ****
--- 18356,18374 ----
    return x_reached;
  }
  
+ /* Expand row matrix if too narrow.  Don't expand if area
+    is not present.  */
+ 
+ #define IT_EXPAND_MATRIX_WIDTH(it, area)              \
+   {                                                   \
+     if (!fonts_changed_p                              \
+       && (it->glyph_row->glyphs[area]                 \
+           < it->glyph_row->glyphs[area + 1]))         \
+       {                                                       \
+       it->w->ncols_scale_factor++;                    \
+       fonts_changed_p = 1;                            \
+       }                                                       \
+   }
  
  /* Store one glyph for IT->char_to_display in IT->glyph_row.
     Called from x_produce_glyphs when IT->glyph_row is non-null.  */
***************
*** 18413,18423 ****
        glyph->font_type = FONT_TYPE_UNKNOWN;
        ++it->glyph_row->used[area];
      }
!   else if (!fonts_changed_p)
!     {
!       it->w->ncols_scale_factor++;
!       fonts_changed_p = 1;
!     }
  }
  
  /* Store one glyph for the composition IT->cmp_id in IT->glyph_row.
--- 18406,18413 ----
        glyph->font_type = FONT_TYPE_UNKNOWN;
        ++it->glyph_row->used[area];
      }
!   else
!     IT_EXPAND_MATRIX_WIDTH (it, area);
  }
  
  /* Store one glyph for the composition IT->cmp_id in IT->glyph_row.
***************
*** 18455,18465 ****
        glyph->font_type = FONT_TYPE_UNKNOWN;
        ++it->glyph_row->used[area];
      }
!   else if (!fonts_changed_p)
!     {
!       it->w->ncols_scale_factor++;
!       fonts_changed_p = 1;
!     }
  }
  
  
--- 18445,18452 ----
        glyph->font_type = FONT_TYPE_UNKNOWN;
        ++it->glyph_row->used[area];
      }
!   else
!     IT_EXPAND_MATRIX_WIDTH (it, area);
  }
  
  
***************
*** 18629,18639 ****
          glyph->font_type = FONT_TYPE_UNKNOWN;
          ++it->glyph_row->used[area];
        }
!       else if (!fonts_changed_p)
!       {
!         it->w->ncols_scale_factor++;
!         fonts_changed_p = 1;
!       }
      }
  }
  
--- 18616,18623 ----
          glyph->font_type = FONT_TYPE_UNKNOWN;
          ++it->glyph_row->used[area];
        }
!       else
!       IT_EXPAND_MATRIX_WIDTH (it, area);
      }
  }
  
***************
*** 18677,18687 ****
        glyph->font_type = FONT_TYPE_UNKNOWN;
        ++it->glyph_row->used[area];
      }
!   else if (!fonts_changed_p)
!     {
!       it->w->ncols_scale_factor++;
!       fonts_changed_p = 1;
!     }
  }
  
  
--- 18661,18668 ----
        glyph->font_type = FONT_TYPE_UNKNOWN;
        ++it->glyph_row->used[area];
      }
!   else
!     IT_EXPAND_MATRIX_WIDTH (it, area);
  }
  
  
***************
*** 18912,18918 ****
        struct face *face;
        struct font_info *font_info;
  
!       face_id = lookup_named_face (it->f, face_name);
        if (face_id < 0)
        return make_number (-1);
  
--- 18893,18899 ----
        struct face *face;
        struct font_info *font_info;
  
!       face_id = lookup_named_face (it->f, face_name, 0);
        if (face_id < 0)
        return make_number (-1);
  
***************
*** 20264,20269 ****
--- 20245,20251 ----
      {
        int x, y;
        int header_line_height = WINDOW_HEADER_LINE_HEIGHT (w);
+       int width;
  
        cursor_glyph = get_phys_cursor_glyph (w);
        if (cursor_glyph == NULL)
***************
*** 20271,20279 ****
  
        x = WINDOW_TEXT_TO_FRAME_PIXEL_X (w, w->phys_cursor.x);
        y = WINDOW_TO_FRAME_PIXEL_Y (w, max (header_line_height, 
cursor_row->y));
  
!       rif->clear_frame_area (f, x, y,
!                            cursor_glyph->pixel_width, 
cursor_row->visible_height);
      }
  
    /* Erase the cursor by redrawing the character underneath it.  */
--- 20253,20262 ----
  
        x = WINDOW_TEXT_TO_FRAME_PIXEL_X (w, w->phys_cursor.x);
        y = WINDOW_TO_FRAME_PIXEL_Y (w, max (header_line_height, 
cursor_row->y));
+       width = min (cursor_glyph->pixel_width,
+                  window_box_width (w, TEXT_AREA) - w->phys_cursor.x);
  
!       rif->clear_frame_area (f, x, y, width, cursor_row->visible_height);
      }
  
    /* Erase the cursor by redrawing the character underneath it.  */
***************
*** 21094,21106 ****
        /* If we're on a string with `help-echo' text property, arrange
         for the help to be displayed.  This is done by setting the
         global variable help_echo_string to the help string.  */
!       help = Fget_text_property (pos, Qhelp_echo, string);
!       if (!NILP (help))
        {
!         help_echo_string = help;
!         XSETWINDOW (help_echo_window, w);
!         help_echo_object = string;
!         help_echo_pos = charpos;
        }
  
        if (NILP (pointer))
--- 21077,21092 ----
        /* If we're on a string with `help-echo' text property, arrange
         for the help to be displayed.  This is done by setting the
         global variable help_echo_string to the help string.  */
!       if (NILP (help))
        {
!         help = Fget_text_property (pos, Qhelp_echo, string);
!         if (!NILP (help))
!           {
!             help_echo_string = help;
!             XSETWINDOW (help_echo_window, w);
!             help_echo_object = string;
!             help_echo_pos = charpos;
!           }
        }
  
        if (NILP (pointer))




reply via email to

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