Separate read and write access to Lisp_Object slots of struct frame.
[bpt/emacs.git] / src / window.h
index 96e30d9..da42250 100644 (file)
@@ -1,5 +1,5 @@
 /* Window definitions for GNU Emacs.
-   Copyright (C) 1985-1986, 1993, 1995, 1997-2011
+   Copyright (C) 1985-1986, 1993, 1995, 1997-2012
                  Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
@@ -86,150 +86,150 @@ struct cursor_pos
   int hpos, vpos;
 };
 
+/* Most code should use this macro to access Lisp fields in struct window.  */
+
+#define WVAR(w, field) ((w)->INTERNAL_FIELD (field))
+
 struct window
   {
     /* This is for Lisp; the terminal code does not refer to it.  */
     struct vectorlike_header header;
 
     /* The frame this window is on.  */
-    Lisp_Object frame;
-    /* t if this window is a minibuffer window.  */
-    Lisp_Object mini_p;
-    /* Following child (to right or down) at same level of tree */
-    Lisp_Object next;
-    /* Preceding child (to left or up) at same level of tree */
-    Lisp_Object prev;
-    /* First child of this window. */
-    /* vchild is used if this is a vertical combination,
-       hchild if this is a horizontal combination. */
-    Lisp_Object hchild, vchild;
-    /* The window this one is a child of. */
-    Lisp_Object parent;
-    /* The upper left corner coordinates of this window,
-       as integers relative to upper left corner of frame = 0, 0 */
-    Lisp_Object left_col;
-    Lisp_Object top_line;
-    /* The size of the window */
-    Lisp_Object total_lines;
-    Lisp_Object total_cols;
-    /* The buffer displayed in this window */
-    /* Of the fields vchild, hchild and buffer, only one is non-nil.  */
-    Lisp_Object buffer;
+    Lisp_Object INTERNAL_FIELD (frame);
+
+    /* Following (to right or down) and preceding (to left or up) child
+       at same level of tree.  */
+    Lisp_Object INTERNAL_FIELD (next);
+    Lisp_Object INTERNAL_FIELD (prev);
+
+    /* First child of this window: vchild is used if this is a vertical
+       combination, hchild if this is a horizontal combination.  Of the
+       fields vchild, hchild and buffer, one and only one is non-nil
+       unless the window is dead.  */
+    Lisp_Object INTERNAL_FIELD (hchild);
+    Lisp_Object INTERNAL_FIELD (vchild);
+
+    /* The window this one is a child of.  */
+    Lisp_Object INTERNAL_FIELD (parent);
+
+    /* The upper left corner coordinates of this window, as integers
+       relative to upper left corner of frame = 0, 0.  */
+    Lisp_Object INTERNAL_FIELD (left_col);
+    Lisp_Object INTERNAL_FIELD (top_line);
+
+    /* The size of the window.  */
+    Lisp_Object INTERNAL_FIELD (total_lines);
+    Lisp_Object INTERNAL_FIELD (total_cols);
+
+    /* The normal size of the window.  */
+    Lisp_Object INTERNAL_FIELD (normal_lines);
+    Lisp_Object INTERNAL_FIELD (normal_cols);
+
+    /* New sizes of the window.  */
+    Lisp_Object INTERNAL_FIELD (new_total);
+    Lisp_Object INTERNAL_FIELD (new_normal);
+
+    /* The buffer displayed in this window.  Of the fields vchild,
+       hchild and buffer, one and only one is non-nil unless the window
+       is dead.  */
+    Lisp_Object INTERNAL_FIELD (buffer);
+
     /* A marker pointing to where in the text to start displaying.
        BIDI Note: This is the _logical-order_ start, i.e. the smallest
        buffer position visible in the window, not necessarily the
        character displayed in the top left corner of the window.  */
-    Lisp_Object start;
+    Lisp_Object INTERNAL_FIELD (start);
+
     /* A marker pointing to where in the text point is in this window,
        used only when the window is not selected.
        This exists so that when multiple windows show one buffer
        each one can have its own value of point.  */
-    Lisp_Object pointm;
-    /* Non-nil means next redisplay must use the value of start
-       set up for it in advance.  Set by scrolling commands.  */
-    Lisp_Object force_start;
-    /* Non-nil means we have explicitly changed the value of start,
-       but that the next redisplay is not obliged to use the new value.
-       This is used in Fdelete_other_windows to force a call to
-       Vwindow_scroll_functions; also by Frecenter with argument.  */
-    Lisp_Object optional_new_start;
-    /* Number of columns display within the window is scrolled to the left.  */
-    Lisp_Object hscroll;
-    /* Minimum hscroll for automatic hscrolling.  This is the value
-       the user has set, by set-window-hscroll for example.  */
-    Lisp_Object min_hscroll;
-    /* Number saying how recently window was selected */
-    Lisp_Object use_time;
-    /* Unique number of window assigned when it was created */
-    Lisp_Object sequence_number;
-    /* No permanent meaning; used by save-window-excursion's bookkeeping */
-    Lisp_Object temslot;
-    /* text.modified of displayed buffer as of last time display completed */
-    Lisp_Object last_modified;
-    /* BUF_OVERLAY_MODIFIED of displayed buffer as of last complete update.  */
-    Lisp_Object last_overlay_modified;
-    /* Value of point at that time */
-    Lisp_Object last_point;
-    /* Non-nil if the buffer was "modified" when the window
-       was last updated.  */
-    Lisp_Object last_had_star;
+    Lisp_Object INTERNAL_FIELD (pointm);
+
+    /* No permanent meaning; used by save-window-excursion's
+       bookkeeping.  */
+    Lisp_Object INTERNAL_FIELD (temslot);
+
     /* This window's vertical scroll bar.  This field is only for use
        by the window-system-dependent code which implements the
        scroll bars; it can store anything it likes here.  If this
        window is newly created and we haven't displayed a scroll bar in
        it yet, or if the frame doesn't have any scroll bars, this is nil.  */
-    Lisp_Object vertical_scroll_bar;
+    Lisp_Object INTERNAL_FIELD (vertical_scroll_bar);
 
     /* Width of left and right marginal areas.  A value of nil means
        no margin.  */
-    Lisp_Object left_margin_cols, right_margin_cols;
+    Lisp_Object INTERNAL_FIELD (left_margin_cols);
+    Lisp_Object INTERNAL_FIELD (right_margin_cols);
 
     /* Width of left and right fringes.
        A value of nil or t means use frame values.  */
-    Lisp_Object left_fringe_width, right_fringe_width;
-
-  /* Non-nil means fringes are drawn outside display margins;
-     othersize draw them between margin areas and text.  */
-    Lisp_Object fringes_outside_margins;
+    Lisp_Object INTERNAL_FIELD (left_fringe_width);
+    Lisp_Object INTERNAL_FIELD (right_fringe_width);
 
     /* Pixel width of scroll bars.
        A value of nil or t means use frame values.  */
-    Lisp_Object scroll_bar_width;
+    Lisp_Object INTERNAL_FIELD (scroll_bar_width);
+
     /* Type of vertical scroll bar.  A value of nil means
        no scroll bar.  A value of t means use frame value.  */
-    Lisp_Object vertical_scroll_bar_type;
+    Lisp_Object INTERNAL_FIELD (vertical_scroll_bar_type);
 
-    /* Frame coords of mark as of last time display completed */
-    /* May be nil if mark does not exist or was not on frame */
-    Lisp_Object last_mark_x;
-    Lisp_Object last_mark_y;
     /* Z - the buffer position of the last glyph in the current matrix
        of W.  Only valid if WINDOW_END_VALID is not nil.  */
-    Lisp_Object window_end_pos;
+    Lisp_Object INTERNAL_FIELD (window_end_pos);
     /* Glyph matrix row of the last glyph in the current matrix
        of W.  Only valid if WINDOW_END_VALID is not nil.  */
-    Lisp_Object window_end_vpos;
+    Lisp_Object INTERNAL_FIELD (window_end_vpos);
     /* t if window_end_pos is truly valid.
        This is nil if nontrivial redisplay is preempted
        since in that case the frame image that window_end_pos
        did not get onto the frame.  */
-    Lisp_Object window_end_valid;
-    /* Non-nil means must regenerate mode line of this window */
-    Lisp_Object update_mode_line;
-    /* Non-nil means current value of `start'
-       was the beginning of a line when it was chosen.  */
-    Lisp_Object start_at_line_beg;
+    Lisp_Object INTERNAL_FIELD (window_end_valid);
+
     /* Display-table to use for displaying chars in this window.
        Nil means use the buffer's own display-table.  */
-    Lisp_Object display_table;
-    /* Non-nil means window is marked as dedicated.  */
-    Lisp_Object dedicated;
-    /* Line number and position of a line somewhere above the
-       top of the screen.  */
-    /* If this field is nil, it means we don't have a base line.  */
-    Lisp_Object base_line_number;
+    Lisp_Object INTERNAL_FIELD (display_table);
+
+    /* Non-nil usually means window is marked as dedicated.
+       Note Lisp code may set this to something beyond Qnil
+       and Qt, so bitfield can't be used here.  */
+    Lisp_Object INTERNAL_FIELD (dedicated);
+
+    /* Line number and position of a line somewhere above the top of the
+       screen.  If this field is nil, it means we don't have a base
+       line.  */
+    Lisp_Object INTERNAL_FIELD (base_line_number);
     /* If this field is nil, it means we don't have a base line.
        If it is a buffer, it means don't display the line number
        as long as the window shows that buffer.  */
-    Lisp_Object base_line_pos;
+    Lisp_Object INTERNAL_FIELD (base_line_pos);
+
     /* If we have highlighted the region (or any part of it),
        this is the mark position that we used, as an integer.  */
-    Lisp_Object region_showing;
+    Lisp_Object INTERNAL_FIELD (region_showing);
+
     /* The column number currently displayed in this window's mode line,
        or nil if column numbers are not being displayed.  */
-    Lisp_Object column_number_displayed;
+    Lisp_Object INTERNAL_FIELD (column_number_displayed);
+
     /* If redisplay in this window goes beyond this buffer position,
        must run the redisplay-end-trigger-hook.  */
-    Lisp_Object redisplay_end_trigger;
-    /* Non-nil means resizing windows will attempt to resize this window
-       proportionally.  */
-    Lisp_Object resize_proportionally;
+    Lisp_Object INTERNAL_FIELD (redisplay_end_trigger);
+
+    /* t means this window's child windows are not (re-)combined.  */
+    Lisp_Object INTERNAL_FIELD (combination_limit);
 
-    /* Original window height and top before mini-window was enlarged. */
-    Lisp_Object orig_total_lines, orig_top_line;
+    /* Alist of <buffer, window-start, window-point> triples listing
+       buffers previously shown in this window.  */
+    Lisp_Object INTERNAL_FIELD (prev_buffers);
 
-    /* An alist with parameteres.  */
-    Lisp_Object window_parameters;
+    /* List of buffers re-shown in this window.  */
+    Lisp_Object INTERNAL_FIELD (next_buffers);
+
+    /* An alist with parameters.  */
+    Lisp_Object INTERNAL_FIELD (window_parameters);
 
     /* No Lisp data may follow below this point without changing
        mark_object in alloc.c.  The member current_matrix must be the
@@ -239,6 +239,31 @@ struct window
     struct glyph_matrix *current_matrix;
     struct glyph_matrix *desired_matrix;
 
+    /* Number saying how recently window was selected.  */
+    int use_time;
+
+    /* Unique number of window assigned when it was created.  */
+    int sequence_number;
+
+    /* Number of columns display within the window is scrolled to the left.  */
+    ptrdiff_t hscroll;
+
+    /* Minimum hscroll for automatic hscrolling.  This is the value
+       the user has set, by set-window-hscroll for example.  */
+    ptrdiff_t min_hscroll;
+
+    /* Displayed buffer's text modification events counter as of last time
+       display completed.  */
+    EMACS_INT last_modified;
+
+    /* Displayed buffer's overlays modification events counter as of last
+       complete update.  */
+    EMACS_INT last_overlay_modified;
+
+    /* Value of point at that time.  Since this is a position in a buffer,
+       it should be positive. */
+    ptrdiff_t last_point;
+
     /* Scaling factor for the glyph_matrix size calculation in this window.
        Used if window contains many small images or uses proportional fonts,
        as the normal  may yield a matrix which is too small.  */
@@ -262,6 +287,30 @@ struct window
     /* This is handy for undrawing the cursor.  */
     int phys_cursor_ascent, phys_cursor_height;
 
+    /* Non-zero if this window is a minibuffer window.  */
+    unsigned mini : 1;
+
+    /* Non-zero means must regenerate mode line of this window */
+    unsigned update_mode_line : 1;
+
+    /* Non-nil if the buffer was "modified" when the window
+       was last updated.  */
+    unsigned last_had_star : 1;
+
+    /* Non-zero means current value of `start'
+       was the beginning of a line when it was chosen.  */
+    unsigned start_at_line_beg : 1;
+
+    /* Non-zero means next redisplay must use the value of start
+       set up for it in advance.  Set by scrolling commands.  */
+    unsigned force_start : 1;
+
+    /* Non-zero means we have explicitly changed the value of start,
+       but that the next redisplay is not obliged to use the new value.
+       This is used in Fdelete_other_windows to force a call to
+       Vwindow_scroll_functions; also by Frecenter with argument.  */
+    unsigned optional_new_start : 1;
+
     /* Non-zero means the cursor is currently displayed.  This can be
        set to zero by functions overpainting the cursor image.  */
     unsigned phys_cursor_on_p : 1;
@@ -286,18 +335,22 @@ struct window
        accept that.  */
     unsigned frozen_window_start_p : 1;
 
+    /* Non-zero means fringes are drawn outside display margins.
+       Otherwise draw them between margin areas and text.  */
+    unsigned fringes_outside_margins : 1;
+
     /* Amount by which lines of this window are scrolled in
        y-direction (smooth scrolling).  */
     int vscroll;
 
-    /* Z_BYTE - the buffer position of the last glyph in the current matrix
-       of W.  Only valid if WINDOW_END_VALID is not nil.  */
-    int window_end_bytepos;
+    /* Z_BYTE - the buffer position of the last glyph in the current matrix of W.
+       Should be nonnegative, and only valid if window_end_valid is not nil.  */
+    ptrdiff_t window_end_bytepos;
 };
 
 /* 1 if W is a minibuffer window.  */
 
-#define MINI_WINDOW_P(W)       (!NILP ((W)->mini_p))
+#define MINI_WINDOW_P(W)       ((W)->mini)
 
 /* General window layout:
 
@@ -343,13 +396,13 @@ struct window
    This includes scroll bars and fringes.  */
 
 #define WINDOW_TOTAL_COLS(W) \
-  (XFASTINT ((W)->total_cols))
+  (XFASTINT (WVAR (W, total_cols)))
 
 /* Return the height of window W in canonical line units.
    This includes header and mode lines, if any.  */
 
 #define WINDOW_TOTAL_LINES(W) \
-  (XFASTINT ((W)->total_lines))
+  (XFASTINT (WVAR (W, total_lines)))
 
 /* Return the total pixel width of window W.  */
 
@@ -361,12 +414,23 @@ struct window
 #define WINDOW_TOTAL_HEIGHT(W) \
   (WINDOW_TOTAL_LINES (W) * WINDOW_FRAME_LINE_HEIGHT (W))
 
+/* For HORFLAG non-zero the total number of columns of window W.  Otherwise
+   the total number of lines of W.  */
+
+#define WINDOW_TOTAL_SIZE(w, horflag) \
+  (horflag ? WINDOW_TOTAL_COLS (w) : WINDOW_TOTAL_LINES (w))
+
+/* The smallest acceptable dimensions for a window.  Anything smaller
+   might crash Emacs.  */
+
+#define MIN_SAFE_WINDOW_WIDTH  (2)
+#define MIN_SAFE_WINDOW_HEIGHT (1)
 
 /* Return the canonical frame column at which window W starts.
    This includes a left-hand scroll bar, if any.  */
 
 #define WINDOW_LEFT_EDGE_COL(W) \
-  (XFASTINT ((W)->left_col))
+  (XFASTINT (WVAR (W, left_col)))
 
 /* Return the canonical frame column before which window W ends.
    This includes a right-hand scroll bar, if any.  */
@@ -378,7 +442,7 @@ struct window
    This includes a header line, if any.  */
 
 #define WINDOW_TOP_EDGE_LINE(W) \
-  (XFASTINT ((W)->top_line))
+  (XFASTINT (WVAR (W, top_line)))
 
 /* Return the canonical frame line before which window W ends.
    This includes a mode line, if any.  */
@@ -404,14 +468,14 @@ struct window
 /* 1 if W is a menu bar window.  */
 
 #define WINDOW_MENU_BAR_P(W) \
-  (WINDOWP (WINDOW_XFRAME (W)->menu_bar_window) \
-   && (W) == XWINDOW (WINDOW_XFRAME (W)->menu_bar_window))
+  (WINDOWP (FGET (WINDOW_XFRAME (W), menu_bar_window)) \
+   && (W) == XWINDOW (FGET (WINDOW_XFRAME (W), menu_bar_window)))
 
 /* 1 if W is a tool bar window.  */
 
 #define WINDOW_TOOL_BAR_P(W) \
-  (WINDOWP (WINDOW_XFRAME (W)->tool_bar_window) \
-   && (W) == XWINDOW (WINDOW_XFRAME (W)->tool_bar_window))
+  (WINDOWP (FGET (WINDOW_XFRAME (W), tool_bar_window)) \
+   && (W) == XWINDOW (FGET (WINDOW_XFRAME (W), tool_bar_window)))
 
 /* Return the frame y-position at which window W starts.
    This includes a header line, if any.  */
@@ -483,31 +547,31 @@ struct window
 /* Width of left margin area in columns.  */
 
 #define WINDOW_LEFT_MARGIN_COLS(W)                     \
-  (NILP ((W)->left_margin_cols)                                \
+  (NILP (WVAR (W, left_margin_cols))                   \
    ? 0                                                 \
-   : XINT ((W)->left_margin_cols))
+   : XINT (WVAR (W, left_margin_cols)))
 
 /* Width of right marginal area in columns.  */
 
 #define WINDOW_RIGHT_MARGIN_COLS(W)                    \
-  (NILP ((W)->right_margin_cols)                       \
+  (NILP (WVAR (W, right_margin_cols))                  \
    ? 0                                                 \
-   : XINT ((W)->right_margin_cols))
+   : XINT (WVAR (W, right_margin_cols)))
 
 /* Width of left margin area in pixels.  */
 
 #define WINDOW_LEFT_MARGIN_WIDTH(W)                    \
-  (NILP ((W)->left_margin_cols)                                \
+  (NILP (WVAR (W, left_margin_cols))                   \
    ? 0                                                 \
-   : (XINT ((W)->left_margin_cols)                     \
+   : (XINT (WVAR (W, left_margin_cols))                        \
       * WINDOW_FRAME_COLUMN_WIDTH (W)))
 
 /* Width of right marginal area in pixels.  */
 
 #define WINDOW_RIGHT_MARGIN_WIDTH(W)                   \
-  (NILP ((W)->right_margin_cols)                       \
+  (NILP (WVAR (W, right_margin_cols))                  \
    ? 0                                                 \
-   : (XINT ((W)->right_margin_cols)                    \
+   : (XINT (WVAR (W, right_margin_cols))               \
       * WINDOW_FRAME_COLUMN_WIDTH (W)))
 
 /* Total width of fringes reserved for drawing truncation bitmaps,
@@ -517,8 +581,8 @@ struct window
    able to split windows horizontally nicely.  */
 
 #define WINDOW_FRINGE_COLS(W)                          \
-  ((INTEGERP ((W)->left_fringe_width)                  \
-    || INTEGERP ((W)->right_fringe_width))             \
+  ((INTEGERP (WVAR (W, left_fringe_width))             \
+    || INTEGERP (WVAR (W, right_fringe_width)))                \
    ? ((WINDOW_LEFT_FRINGE_WIDTH (W)                    \
        + WINDOW_RIGHT_FRINGE_WIDTH (W)                 \
        + WINDOW_FRAME_COLUMN_WIDTH (W) - 1)            \
@@ -540,13 +604,13 @@ struct window
 /* Pixel-width of the left and right fringe.  */
 
 #define WINDOW_LEFT_FRINGE_WIDTH(W)                    \
-  (INTEGERP ((W)->left_fringe_width)                   \
-   ? XFASTINT ((W)->left_fringe_width)                 \
+  (INTEGERP (WVAR (W, left_fringe_width))              \
+   ? XFASTINT (WVAR (W, left_fringe_width))            \
    : FRAME_LEFT_FRINGE_WIDTH (WINDOW_XFRAME (W)))
 
 #define WINDOW_RIGHT_FRINGE_WIDTH(W)                   \
-  (INTEGERP ((W)->right_fringe_width)                  \
-   ? XFASTINT ((W)->right_fringe_width)                        \
+  (INTEGERP (WVAR (W, right_fringe_width))             \
+   ? XFASTINT (WVAR (W, right_fringe_width))           \
    : FRAME_RIGHT_FRINGE_WIDTH (WINDOW_XFRAME (W)))
 
 /* Total width of fringes in pixels.  */
@@ -557,42 +621,42 @@ struct window
 /* Are fringes outside display margins in window W.  */
 
 #define WINDOW_HAS_FRINGES_OUTSIDE_MARGINS(W)  \
-  (!NILP ((W)->fringes_outside_margins))
+  ((W)->fringes_outside_margins)
 
 /* Say whether scroll bars are currently enabled for window W,
    and which side they are on.  */
 
 #define WINDOW_VERTICAL_SCROLL_BAR_TYPE(w)             \
-  (EQ ((w)->vertical_scroll_bar_type, Qt)              \
+  (EQ (WVAR (w, vertical_scroll_bar_type), Qt)         \
    ? FRAME_VERTICAL_SCROLL_BAR_TYPE (WINDOW_XFRAME (w))        \
-   : EQ ((w)->vertical_scroll_bar_type, Qleft)         \
+   : EQ (WVAR (w, vertical_scroll_bar_type), Qleft)    \
    ? vertical_scroll_bar_left                          \
-   : EQ ((w)->vertical_scroll_bar_type, Qright)                \
+   : EQ (WVAR (w, vertical_scroll_bar_type), Qright)   \
    ? vertical_scroll_bar_right                         \
    : vertical_scroll_bar_none)                         \
 
 #define WINDOW_HAS_VERTICAL_SCROLL_BAR(w)              \
-  (EQ ((w)->vertical_scroll_bar_type, Qt)              \
+  (EQ (WVAR (w, vertical_scroll_bar_type), Qt)         \
    ? FRAME_HAS_VERTICAL_SCROLL_BARS (WINDOW_XFRAME (w))        \
-   : !NILP ((w)->vertical_scroll_bar_type))
+   : !NILP (WVAR (w, vertical_scroll_bar_type)))
 
 #define WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT(w)              \
-  (EQ ((w)->vertical_scroll_bar_type, Qt)                      \
+  (EQ (WVAR (w, vertical_scroll_bar_type), Qt)                 \
    ? FRAME_HAS_VERTICAL_SCROLL_BARS_ON_LEFT (WINDOW_XFRAME (w))        \
-   : EQ ((w)->vertical_scroll_bar_type, Qleft))
+   : EQ (WVAR (w, vertical_scroll_bar_type), Qleft))
 
 #define WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT(w)             \
-  (EQ ((w)->vertical_scroll_bar_type, Qt)                      \
+  (EQ (WVAR (w, vertical_scroll_bar_type), Qt)                 \
    ? FRAME_HAS_VERTICAL_SCROLL_BARS_ON_RIGHT (WINDOW_XFRAME (w))\
-   : EQ ((w)->vertical_scroll_bar_type, Qright))
+   : EQ (WVAR (w, vertical_scroll_bar_type), Qright))
 
 /* Width that a scroll bar in window W should have, if there is one.
    Measured in pixels.  If scroll bars are turned off, this is still
    nonzero.  */
 
 #define WINDOW_CONFIG_SCROLL_BAR_WIDTH(w)              \
-  (INTEGERP ((w)->scroll_bar_width)                    \
-   ? XFASTINT ((w)->scroll_bar_width)                  \
+  (INTEGERP (WVAR (w, scroll_bar_width))               \
+   ? XFASTINT (WVAR (w, scroll_bar_width))             \
    : FRAME_CONFIG_SCROLL_BAR_WIDTH (WINDOW_XFRAME (w)))
 
 /* Width that a scroll bar in window W should have, if there is one.
@@ -600,8 +664,8 @@ struct window
    this is still nonzero.  */
 
 #define WINDOW_CONFIG_SCROLL_BAR_COLS(w)               \
-  (INTEGERP ((w)->scroll_bar_width)                    \
-   ? ((XFASTINT ((w)->scroll_bar_width)                        \
+  (INTEGERP (WVAR (w, scroll_bar_width))               \
+   ? ((XFASTINT (WVAR (w, scroll_bar_width))           \
        + WINDOW_FRAME_COLUMN_WIDTH (w) - 1)            \
       / WINDOW_FRAME_COLUMN_WIDTH (w))                 \
    : FRAME_CONFIG_SCROLL_BAR_COLS (WINDOW_XFRAME (w)))
@@ -759,18 +823,11 @@ extern Lisp_Object Vmouse_window;
 
 extern Lisp_Object Vmouse_event;
 
-EXFUN (Fnext_window, 3);
-EXFUN (Fselect_window, 2);
-EXFUN (Fset_window_buffer, 3);
-EXFUN (Fset_window_point, 2);
 extern Lisp_Object make_window (void);
 extern Lisp_Object window_from_coordinates (struct frame *, int, int,
                                             enum window_part *, int);
-EXFUN (Fwindow_dedicated_p, 1);
-extern void set_window_height (Lisp_Object, int, int);
-extern void set_window_width (Lisp_Object, int, int);
-extern void change_window_heights (Lisp_Object, int);
-extern void delete_all_subwindows (struct window *);
+extern void resize_frame_windows (struct frame *, int, int);
+extern void delete_all_child_windows (Lisp_Object);
 extern void freeze_window_starts (struct frame *, int);
 extern void grow_mini_window (struct window *, int);
 extern void shrink_mini_window (struct window *);
@@ -793,21 +850,16 @@ extern Lisp_Object echo_area_window;
 
 /* Depth in recursive edits.  */
 
-extern int command_loop_level;
+extern EMACS_INT command_loop_level;
 
 /* Depth in minibuffer invocations.  */
 
-extern int minibuf_level;
+extern EMACS_INT minibuf_level;
 
 /* true if we should redraw the mode lines on the next redisplay.  */
 
 extern int update_mode_lines;
 
-/* Nonzero if BEGV - BEG or Z - ZV of current buffer has changed since
-   last redisplay that finished.  */
-
-extern int clip_changed;
-
 /* Nonzero if window sizes or contents have changed since last
    redisplay that finished */
 
@@ -828,7 +880,7 @@ extern int buffer_shared;
 extern void check_frame_size (struct frame *frame, int *rows, int *cols);
 
 /* Return a pointer to the glyph W's physical cursor is on.  Value is
-   null if W's current matrix is invalid, so that no meaningfull glyph
+   null if W's current matrix is invalid, so that no meaningful glyph
    can be returned.  */
 
 struct glyph *get_phys_cursor_glyph (struct window *w);
@@ -836,7 +888,7 @@ struct glyph *get_phys_cursor_glyph (struct window *w);
 /* Value is non-zero if WINDOW is a live window.  */
 
 #define WINDOW_LIVE_P(WINDOW) \
-     (WINDOWP ((WINDOW)) && !NILP (XWINDOW ((WINDOW))->buffer))
+  (WINDOWP ((WINDOW)) && !NILP (WVAR (XWINDOW ((WINDOW)), buffer)))
 
 
 /* These used to be in lisp.h.  */
@@ -844,29 +896,16 @@ struct glyph *get_phys_cursor_glyph (struct window *w);
 extern Lisp_Object Qwindowp, Qwindow_live_p;
 extern Lisp_Object Vwindow_list;
 
-EXFUN (Fwindow_buffer, 1);
-EXFUN (Fwindow_frame, 1);
-EXFUN (Fget_buffer_window, 2);
-EXFUN (Fwindow_minibuffer_p, 1);
-EXFUN (Fselected_window, 0);
-EXFUN (Fframe_root_window, 1);
-EXFUN (Fframe_first_window, 1);
-EXFUN (Fset_frame_selected_window, 3);
-EXFUN (Fdelete_window, 1);
-EXFUN (Fset_window_configuration, 1);
-EXFUN (Fcurrent_window_configuration, 1);
 extern int compare_window_configurations (Lisp_Object, Lisp_Object, int);
-EXFUN (Fpos_visible_in_window_p, 3);
 extern void mark_window_cursors_off (struct window *);
 extern int window_internal_height (struct window *);
-EXFUN (Frecenter, 1);
+extern int window_body_cols (struct window *w);
 extern void temp_output_buffer_show (Lisp_Object);
-extern void replace_buffer_in_all_windows (Lisp_Object);
+extern void replace_buffer_in_windows (Lisp_Object);
+extern void replace_buffer_in_windows_safely (Lisp_Object);
 extern void init_window_once (void);
 extern void init_window (void);
 extern void syms_of_window (void);
 extern void keys_of_window (void);
 
-extern int window_box_text_cols (struct window *w);
-
 #endif /* not WINDOW_H_INCLUDED */