XEmacs 21.2.14.
[chise/xemacs-chise.git.1] / src / frame.c
index 5891e24..2fcd539 100644 (file)
@@ -39,9 +39,6 @@ Boston, MA 02111-1307, USA.  */
 #include "scrollbar.h"
 #include "window.h"
 
-#include <errno.h>
-#include "sysdep.h"
-
 Lisp_Object Vselect_frame_hook, Qselect_frame_hook;
 Lisp_Object Vdeselect_frame_hook, Qdeselect_frame_hook;
 Lisp_Object Vcreate_frame_hook, Qcreate_frame_hook;
@@ -128,9 +125,11 @@ mark_frame (Lisp_Object obj, void (*markobj) (Lisp_Object))
 {
   struct frame *f = XFRAME (obj);
 
-#define MARKED_SLOT(x) ((markobj) (f->x));
+#define MARKED_SLOT(x) ((void) (markobj (f->x)));
 #include "frameslots.h"
 
+  mark_subwindow_cachels (f->subwindow_cachels, markobj);
+
   if (FRAME_LIVE_P (f)) /* device is nil for a dead frame */
     MAYBE_FRAMEMETH (f, mark_frame, (f, markobj));
 
@@ -176,7 +175,7 @@ allocate_frame_core (Lisp_Object device)
   /* This function can GC */
   Lisp_Object frame;
   Lisp_Object root_window;
-  struct frame *f = alloc_lcrecord_type (struct frame, lrecord_frame);
+  struct frame *f = alloc_lcrecord_type (struct frame, &lrecord_frame);
 
   zero_lcrecord (f);
   nuke_all_frame_slots (f);
@@ -190,10 +189,10 @@ allocate_frame_core (Lisp_Object device)
   XWINDOW (root_window)->frame = frame;
 
   /* 10 is arbitrary,
-     just so that there is "something there."
+     Just so that there is "something there."
      Correct size will be set up later with change_frame_size.  */
 
-  f->width = 10;
+  f->width  = 10;
   f->height = 10;
 
   XWINDOW (root_window)->pixel_width = 10;
@@ -206,6 +205,9 @@ allocate_frame_core (Lisp_Object device)
   f->selected_window = root_window;
   f->last_nonminibuf_window = root_window;
 
+  /* cache of subwindows visible on frame */
+  f->subwindow_cachels    = Dynarr_new (subwindow_cachel);
+
   /* Choose a buffer for the frame's root window.  */
   XWINDOW (root_window)->buffer = Qt;
   {
@@ -454,9 +456,9 @@ See `set-frame-properties', `default-x-frame-plist', and
         things. */
       init_frame_toolbars (f);
 #endif
-
       reset_face_cachels (XWINDOW (FRAME_SELECTED_WINDOW (f)));
       reset_glyph_cachels (XWINDOW (FRAME_SELECTED_WINDOW (f)));
+      reset_subwindow_cachels (f);
       change_frame_size (f, f->height, f->width, 0);
     }
 
@@ -580,7 +582,7 @@ unhold_frame_size_changes (void)
 void
 invalidate_vertical_divider_cache_in_frame (struct frame *f)
 {
-  /* Invalidate cached value of needs_vertical_divider_p in 
+  /* Invalidate cached value of needs_vertical_divider_p in
      every and all windows */
   map_windows (f, invalidate_vertical_divider_cache_in_window, 0);
 }
@@ -892,7 +894,7 @@ set_frame_selected_window (struct frame *f, Lisp_Object window)
 #ifdef HAVE_TOOLBARS
       if (!EQ (f->last_nonminibuf_window, window))
        MARK_TOOLBAR_CHANGED;
-#endif      
+#endif
       f->last_nonminibuf_window = window;
     }
 }
@@ -1534,6 +1536,13 @@ delete_frame_internal (struct frame *f, int force,
   delete_all_subwindows (XWINDOW (f->root_window));
   f->root_window = Qnil;
 
+  /* clear out the cached glyph information */
+  if (f->subwindow_cachels)
+    {
+      Dynarr_free (f->subwindow_cachels);
+      f->subwindow_cachels = 0;
+    }
+
   /* Remove the frame now from the list.  This way, any events generated
      on this frame by the maneuvers below will disperse themselves. */
 
@@ -2795,7 +2804,7 @@ change_frame_size_1 (struct frame *f, int newheight, int newwidth)
 
   /* when frame_conversion_internal() calculated the number of rows/cols
      in the frame, the theoretical toolbar sizes were subtracted out.
-     The caluclations below adjust for real toolbar height/width in
+     The calculations below adjust for real toolbar height/width in
      frame, which may be different from frame spec, taking the above
      fact into account */
   new_pixheight +=
@@ -2803,7 +2812,7 @@ change_frame_size_1 (struct frame *f, int newheight, int newwidth)
     + 2 * FRAME_THEORETICAL_TOP_TOOLBAR_BORDER_WIDTH (f)
     - FRAME_REAL_TOP_TOOLBAR_HEIGHT (f)
     - 2 * FRAME_REAL_TOP_TOOLBAR_BORDER_WIDTH (f);
-  
+
   new_pixheight +=
     + FRAME_THEORETICAL_BOTTOM_TOOLBAR_HEIGHT (f)
     + 2 * FRAME_THEORETICAL_BOTTOM_TOOLBAR_BORDER_WIDTH (f)
@@ -2815,13 +2824,13 @@ change_frame_size_1 (struct frame *f, int newheight, int newwidth)
     + 2 * FRAME_THEORETICAL_LEFT_TOOLBAR_BORDER_WIDTH (f)
     - FRAME_REAL_LEFT_TOOLBAR_WIDTH (f)
     - 2 * FRAME_REAL_LEFT_TOOLBAR_BORDER_WIDTH (f);
-  
+
   new_pixwidth +=
     + FRAME_THEORETICAL_RIGHT_TOOLBAR_WIDTH (f)
     + 2 * FRAME_THEORETICAL_RIGHT_TOOLBAR_BORDER_WIDTH (f)
     - FRAME_REAL_RIGHT_TOOLBAR_WIDTH (f)
     - 2 * FRAME_REAL_RIGHT_TOOLBAR_BORDER_WIDTH (f);
-  
+
   /* Adjust the width for the end glyph which may be a different width
      than the default character width. */
   {
@@ -2907,7 +2916,7 @@ change_frame_size_1 (struct frame *f, int newheight, int newwidth)
       FRAME_CHARWIDTH (f) = FRAME_WIDTH (f);
       FRAME_CHARHEIGHT (f) = FRAME_HEIGHT (f);
     }
-      
+
   MARK_FRAME_TOOLBARS_CHANGED (f);
   MARK_FRAME_CHANGED (f);
   f->echo_area_garbaged = 1;