changeset 29284:d458dee20518

(free_realized_faces): Block/unblock input. (free_realized_multibyte_face): Ditto.
author Gerd Moellmann <gerd@gnu.org>
date Mon, 29 May 2000 12:03:45 +0000
parents 6068e9acd0ff
children d60b37a79c54
files src/xfaces.c
diffstat 1 files changed, 19 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/xfaces.c	Mon May 29 12:00:28 2000 +0000
+++ b/src/xfaces.c	Mon May 29 12:03:45 2000 +0000
@@ -4663,6 +4663,11 @@
       int i, size;
       struct frame *f = c->f;
 
+      /* We must block input here because we can't process X events
+	 safely while only some faces are freed, or when the frame's
+	 current matrix still references freed faces.  */
+      BLOCK_INPUT;
+
       for (i = 0; i < c->used; ++i)
 	{
 	  free_realized_face (f, c->faces_by_id[i]);
@@ -4682,6 +4687,8 @@
 	  clear_current_matrices (f);
 	  ++windows_or_buffers_changed;
 	}
+
+      UNBLOCK_INPUT;
     }
 }
 
@@ -4698,6 +4705,11 @@
   struct face *face;
   int i;
 
+  /* We must block input here because we can't process X events safely
+     while only some faces are freed, or when the frame's current
+     matrix still references freed faces.  */
+  BLOCK_INPUT;
+      
   for (i = 0; i < cache->used; i++)
     {
       face = cache->faces_by_id[i];
@@ -4709,11 +4721,18 @@
 	  free_realized_face (f, face);
 	}
     }
+  
+  /* Must do a thorough redisplay the next time.  Mark current
+     matrices as invalid because they will reference faces freed
+     above.  This function is also called when a frame is destroyed.
+     In this case, the root window of F is nil.  */
   if (WINDOWP (f->root_window))
     {
       clear_current_matrices (f);
       ++windows_or_buffers_changed;
     }
+  
+  UNBLOCK_INPUT;
 }