diff src/redisplay.c @ 269:b2472a1930f2 r20-5b33

Import from CVS: tag r20-5b33
author cvs
date Mon, 13 Aug 2007 10:27:19 +0200
parents 966663fcf606
children c5d627a313b1
line wrap: on
line diff
--- a/src/redisplay.c	Mon Aug 13 10:26:31 2007 +0200
+++ b/src/redisplay.c	Mon Aug 13 10:27:19 2007 +0200
@@ -419,6 +419,12 @@
 /* Nonzero means some frames have been marked as garbaged */
 int frame_changed;
 
+/* non-zero if any of the builtin display glyphs (continuation,
+   hscroll, control-arrow, etc) is in need of updating
+   somewhere. */
+int glyphs_changed;
+int glyphs_changed_set;
+
 /* This variable is 1 if the icon has to be updated.
  It is set to 1 when `frame-icon-glyph' changes. */
 int icon_changed;
@@ -426,8 +432,7 @@
 
 /* This variable is 1 if the menubar widget has to be updated.
  It is set to 1 by set-menubar-dirty-flag and cleared when the widget
- has been indapted. */
-/* indapted???? */
+ has been updated. */
 int menubar_changed;
 int menubar_changed_set;
 
@@ -5590,7 +5595,8 @@
 
   /* Ditto the glyph cache elements. */
   if ((!echo_active && b != window_display_buffer (w))
-      || !Dynarr_length (w->glyph_cachels))
+      || !Dynarr_length (w->glyph_cachels)
+      || f->glyphs_changed)
     reset_glyph_cachels (w);
   else
     mark_glyph_cachels_as_not_updated (w);
@@ -5668,6 +5674,7 @@
 	  && !f->clip_changed
 	  && !f->extents_changed
 	  && !f->faces_changed
+	  && !f->glyphs_changed
 	  && !f->point_changed
 	  && !f->windows_structure_changed)
 	{
@@ -5687,6 +5694,7 @@
 	      && !f->clip_changed
 	      && !f->extents_changed
 	      && !f->faces_changed
+	      && !f->glyphs_changed
 	      && !f->windows_structure_changed)
 	    {
 	      if (point_visible (w, pointm, CURRENT_DISP)
@@ -5743,6 +5751,7 @@
   else if (!w->windows_changed
 	   && !f->clip_changed
 	   && !f->faces_changed
+	   && !f->glyphs_changed
 	   && !f->windows_structure_changed
 	   && !f->frame_changed
 	   && !truncation_changed
@@ -6006,6 +6015,7 @@
   f->extents_changed  = 0;
   f->faces_changed    = 0;
   f->frame_changed    = 0;
+  f->glyphs_changed   = 0;
   f->icon_changed     = 0;
   f->menubar_changed  = 0;
   f->modeline_changed = 0;
@@ -6069,7 +6079,8 @@
 	  f->faces_changed    || f->frame_changed || f->menubar_changed ||
 	  f->modeline_changed || f->point_changed || f->size_changed    ||
 	  f->toolbar_changed  || f->windows_changed ||
-	  f->windows_structure_changed)
+	  f->windows_structure_changed ||
+	  f->glyphs_changed)
 	{
 	  preempted = redisplay_frame (f, 0);
 	}
@@ -6103,7 +6114,8 @@
 	      f->faces_changed    || f->frame_changed || f->menubar_changed ||
 	      f->modeline_changed || f->point_changed || f->size_changed    ||
 	      f->toolbar_changed  || f->windows_changed ||
-	      f->windows_structure_changed)
+	      f->windows_structure_changed ||
+	      f->glyphs_changed)
 	    {
 	      preempted = redisplay_frame (f, 0);
 	    }
@@ -6123,6 +6135,7 @@
   d->extents_changed  = 0;
   d->faces_changed    = 0;
   d->frame_changed    = 0;
+  d->glyphs_changed   = 0;
   d->icon_changed     = 0;
   d->menubar_changed  = 0;
   d->modeline_changed = 0;
@@ -6168,6 +6181,7 @@
       !faces_changed   && !frame_changed    && !icon_changed    &&
       !menubar_changed && !modeline_changed && !point_changed   &&
       !size_changed    && !toolbar_changed  && !windows_changed &&
+      !glyphs_changed  &&
       !windows_structure_changed && !disable_preemption &&
       preemption_count < max_preempts)
     goto done;
@@ -6181,7 +6195,8 @@
 	  d->faces_changed    || d->frame_changed    || d->icon_changed    ||
 	  d->menubar_changed  || d->modeline_changed || d->point_changed   ||
 	  d->size_changed     || d->toolbar_changed  || d->windows_changed ||
-	  d->windows_structure_changed)
+	  d->windows_structure_changed ||
+	  d->glyphs_changed)
 	{
 	  preempted = redisplay_device (d);
 
@@ -6204,6 +6219,7 @@
   clip_changed     = 0;
   extents_changed  = 0;
   frame_changed    = 0;
+  glyphs_changed   = 0;
   icon_changed     = 0;
   menubar_changed  = 0;
   modeline_changed = 0;
@@ -8580,7 +8596,43 @@
 redisplay_glyph_changed (Lisp_Object glyph, Lisp_Object property,
 			 Lisp_Object locale)
 {
-  MARK_CLIP_CHANGED;
+  if (WINDOWP (locale))
+    {
+      struct frame *f = XFRAME (WINDOW_FRAME (XWINDOW (locale)));
+      MARK_FRAME_GLYPHS_CHANGED (f);
+    }
+  else if (FRAMEP (locale))
+    {
+      struct frame *f = XFRAME (locale);
+      MARK_FRAME_GLYPHS_CHANGED (f);
+    }
+  else if (DEVICEP (locale))
+    {
+      Lisp_Object frmcons;
+      DEVICE_FRAME_LOOP (frmcons, XDEVICE (locale))
+	{
+	  struct frame *f = XFRAME (XCAR (frmcons));
+	  MARK_FRAME_GLYPHS_CHANGED (f);
+	}
+    }
+  else if (CONSOLEP (locale))
+    {
+      Lisp_Object frmcons, devcons;
+      CONSOLE_FRAME_LOOP_NO_BREAK (frmcons, devcons, XCONSOLE (locale))
+	{
+	  struct frame *f = XFRAME (XCAR (frmcons));
+	  MARK_FRAME_GLYPHS_CHANGED (f);
+	}
+    }
+  else /* global or buffer */
+    {
+      Lisp_Object frmcons, devcons, concons;
+      FRAME_LOOP_NO_BREAK (frmcons, devcons, concons)
+	{
+	  struct frame *f = XFRAME (XCAR (frmcons));
+	  MARK_FRAME_GLYPHS_CHANGED (f);
+	}
+    }
 }
 
 static void