(emacs_doprnt_1): Fix problem with %0XXd for a negative integer.
[chise/xemacs-chise.git-] / src / frame.c
index 38c8cc3..5caeece 100644 (file)
@@ -34,6 +34,7 @@ Boston, MA 02111-1307, USA.  */
 #include "faces.h"
 #include "frame.h"
 #include "glyphs.h"
+#include "gutter.h"
 #include "menubar.h"
 #include "redisplay.h"
 #include "scrollbar.h"
@@ -128,6 +129,8 @@ mark_frame (Lisp_Object obj, void (*markobj) (Lisp_Object))
 #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));
 
@@ -153,7 +156,7 @@ print_frame (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
 }
 
 DEFINE_LRECORD_IMPLEMENTATION ("frame", frame,
-                               mark_frame, print_frame, 0, 0, 0,
+                               mark_frame, print_frame, 0, 0, 0, 0,
                               struct frame);
 \f
 static void
@@ -173,7 +176,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);
@@ -203,6 +206,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;
   {
@@ -451,16 +457,22 @@ 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);
+
     }
 
   MAYBE_FRAMEMETH (f, init_frame_2, (f, props));
   Fset_frame_properties (frame, props);
   MAYBE_FRAMEMETH (f, init_frame_3, (f));
 
+  /* now initialise the gutters, this won't change the frame size
+     so is ok here. */
+  if (!DEVICE_STREAM_P (d))
+    init_frame_gutters (f);
+
   /* Hallelujah, praise the lord. */
   f->init_finished = 1;
 
@@ -888,7 +900,10 @@ set_frame_selected_window (struct frame *f, Lisp_Object window)
     {
 #ifdef HAVE_TOOLBARS
       if (!EQ (f->last_nonminibuf_window, window))
-       MARK_TOOLBAR_CHANGED;
+       {
+         MARK_TOOLBAR_CHANGED;
+         MARK_GUTTER_CHANGED;
+       }
 #endif
       f->last_nonminibuf_window = window;
     }
@@ -1521,6 +1536,7 @@ delete_frame_internal (struct frame *f, int force,
 #ifdef HAVE_TOOLBARS
   free_frame_toolbars (f);
 #endif
+  free_frame_gutters (f);
 
   /* This must be done before the window and window_mirror structures
      are freed.  The scrollbar information is attached to them. */
@@ -1531,6 +1547,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. */
 
@@ -1826,7 +1849,7 @@ Note also: Warping the mouse is contrary to the ICCCM, so be very sure
   struct window *w;
   int pix_x, pix_y;
 
-  CHECK_WINDOW (window);
+  CHECK_LIVE_WINDOW (window);
   CHECK_INT (x);
   CHECK_INT (y);
 
@@ -1850,7 +1873,7 @@ before calling this function on it, like this.
 {
   struct window *w;
 
-  CHECK_WINDOW (window);
+  CHECK_LIVE_WINDOW (window);
   CHECK_INT (x);
   CHECK_INT (y);