Merge from emacs-24; up to 2012-12-06T01:39:03Z!monnier@iro.umontreal.ca
[bpt/emacs.git] / src / window.h
index ea127ca..1ebd35a 100644 (file)
@@ -1,6 +1,6 @@
 /* Window definitions for GNU Emacs.
-   Copyright (C) 1985-1986, 1993, 1995, 1997-2012
-                 Free Software Foundation, Inc.
+   Copyright (C) 1985-1986, 1993, 1995, 1997-2013 Free Software
+   Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -22,7 +22,10 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "dispextern.h"
 
-extern Lisp_Object Qleft, Qright;
+INLINE_HEADER_BEGIN
+#ifndef WINDOW_INLINE
+# define WINDOW_INLINE INLINE
+#endif
 
 /* Windows are allocated as if they were vectors, but then the
 Lisp data type is changed to Lisp_Window.  They are garbage
@@ -94,18 +97,17 @@ struct window
     /* The frame this window is on.  */
     Lisp_Object frame;
 
-    /* t if this window is a minibuffer window.  */
-    Lisp_Object mini_p;
-
     /* Following (to right or down) and preceding (to left or up) child
        at same level of tree.  */
-    Lisp_Object next, prev;
+    Lisp_Object next;
+    Lisp_Object 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 hchild, vchild;
+    Lisp_Object hchild;
+    Lisp_Object vchild;
 
     /* The window this one is a child of.  */
     Lisp_Object parent;
@@ -144,42 +146,10 @@ struct window
        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;
-
     /* 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
@@ -189,14 +159,13 @@ struct window
 
     /* Width of left and right marginal areas.  A value of nil means
        no margin.  */
-    Lisp_Object left_margin_cols, right_margin_cols;
+    Lisp_Object left_margin_cols;
+    Lisp_Object 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 left_fringe_width;
+    Lisp_Object right_fringe_width;
 
     /* Pixel width of scroll bars.
        A value of nil or t means use frame values.  */
@@ -206,11 +175,6 @@ struct window
        no scroll bar.  A value of t means use frame value.  */
     Lisp_Object 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;
@@ -223,18 +187,13 @@ struct window
        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;
-
     /* 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.  */
+    /* 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 dedicated;
 
     /* Line number and position of a line somewhere above the top of the
@@ -261,13 +220,6 @@ struct window
     /* t means this window's child windows are not (re-)combined.  */
     Lisp_Object combination_limit;
 
-    /* Alist of <buffer, window-start, window-point> triples listing
-       buffers previously shown in this window.  */
-    Lisp_Object prev_buffers;
-
-    /* List of buffers re-shown in this window.  */
-    Lisp_Object next_buffers;
-
     /* An alist with parameters.  */
     Lisp_Object window_parameters;
 
@@ -279,6 +231,39 @@ struct window
     struct glyph_matrix *current_matrix;
     struct glyph_matrix *desired_matrix;
 
+    /* The two Lisp_Object fields below are marked in a special way,
+       which is why they're placed after `current_matrix'.  */
+    /* Alist of <buffer, window-start, window-point> triples listing
+       buffers previously shown in this window.  */
+    Lisp_Object prev_buffers;
+    /* List of buffers re-shown in this window.  */
+    Lisp_Object next_buffers;
+
+    /* 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.  */
@@ -302,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;
@@ -326,18 +335,95 @@ 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 - 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;
 };
 
+/* Most code should use these functions to set Lisp fields in struct
+   window.  */
+WINDOW_INLINE void
+wset_frame (struct window *w, Lisp_Object val)
+{
+  w->frame = val;
+}
+WINDOW_INLINE void
+wset_left_col (struct window *w, Lisp_Object val)
+{
+  w->left_col = val;
+}
+WINDOW_INLINE void
+wset_next (struct window *w, Lisp_Object val)
+{
+  w->next = val;
+}
+WINDOW_INLINE void
+wset_prev (struct window *w, Lisp_Object val)
+{
+  w->prev = val;
+}
+WINDOW_INLINE void
+wset_redisplay_end_trigger (struct window *w, Lisp_Object val)
+{
+  w->redisplay_end_trigger = val;
+}
+WINDOW_INLINE void
+wset_top_line (struct window *w, Lisp_Object val)
+{
+  w->top_line = val;
+}
+WINDOW_INLINE void
+wset_total_cols (struct window *w, Lisp_Object val)
+{
+  w->total_cols = val;
+}
+WINDOW_INLINE void
+wset_total_lines (struct window *w, Lisp_Object val)
+{
+  w->total_lines = val;
+}
+WINDOW_INLINE void
+wset_vertical_scroll_bar (struct window *w, Lisp_Object val)
+{
+  w->vertical_scroll_bar = val;
+}
+WINDOW_INLINE void
+wset_window_end_pos (struct window *w, Lisp_Object val)
+{
+  w->window_end_pos = val;
+}
+WINDOW_INLINE void
+wset_window_end_valid (struct window *w, Lisp_Object val)
+{
+  w->window_end_valid = val;
+}
+WINDOW_INLINE void
+wset_window_end_vpos (struct window *w, Lisp_Object val)
+{
+  w->window_end_vpos = val;
+}
+WINDOW_INLINE void
+wset_prev_buffers (struct window *w, Lisp_Object val)
+{
+  w->prev_buffers = val;
+}
+WINDOW_INLINE void
+wset_next_buffers (struct window *w, Lisp_Object val)
+{
+  w->next_buffers = val;
+}
+
 /* 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:
 
@@ -383,13 +469,13 @@ struct window
    This includes scroll bars and fringes.  */
 
 #define WINDOW_TOTAL_COLS(W) \
-  (XFASTINT ((W)->total_cols))
+  (XFASTINT (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 (W->total_lines))
 
 /* Return the total pixel width of window W.  */
 
@@ -417,7 +503,7 @@ struct window
    This includes a left-hand scroll bar, if any.  */
 
 #define WINDOW_LEFT_EDGE_COL(W) \
-  (XFASTINT ((W)->left_col))
+  (XFASTINT (W->left_col))
 
 /* Return the canonical frame column before which window W ends.
    This includes a right-hand scroll bar, if any.  */
@@ -429,7 +515,7 @@ struct window
    This includes a header line, if any.  */
 
 #define WINDOW_TOP_EDGE_LINE(W) \
-  (XFASTINT ((W)->top_line))
+  (XFASTINT (W->top_line))
 
 /* Return the canonical frame line before which window W ends.
    This includes a mode line, if any.  */
@@ -533,32 +619,32 @@ struct window
 
 /* Width of left margin area in columns.  */
 
-#define WINDOW_LEFT_MARGIN_COLS(W)                     \
-  (NILP ((W)->left_margin_cols)                                \
-   ? 0                                                 \
-   : XINT ((W)->left_margin_cols))
+#define WINDOW_LEFT_MARGIN_COLS(W)     \
+  (NILP (W->left_margin_cols)          \
+   ? 0                                 \
+   : XINT (W->left_margin_cols))
 
 /* Width of right marginal area in columns.  */
 
-#define WINDOW_RIGHT_MARGIN_COLS(W)                    \
-  (NILP ((W)->right_margin_cols)                       \
-   ? 0                                                 \
-   : XINT ((W)->right_margin_cols))
+#define WINDOW_RIGHT_MARGIN_COLS(W)    \
+  (NILP (W->right_margin_cols)         \
+   ? 0                                 \
+   : XINT (W->right_margin_cols))
 
 /* Width of left margin area in pixels.  */
 
-#define WINDOW_LEFT_MARGIN_WIDTH(W)                    \
-  (NILP ((W)->left_margin_cols)                                \
-   ? 0                                                 \
-   : (XINT ((W)->left_margin_cols)                     \
+#define WINDOW_LEFT_MARGIN_WIDTH(W)    \
+  (NILP (W->left_margin_cols)          \
+   ? 0                                 \
+   : (XINT (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)                       \
-   ? 0                                                 \
-   : (XINT ((W)->right_margin_cols)                    \
+#define WINDOW_RIGHT_MARGIN_WIDTH(W)   \
+  (NILP (W->right_margin_cols)         \
+   ? 0                                 \
+   : (XINT (W->right_margin_cols)      \
       * WINDOW_FRAME_COLUMN_WIDTH (W)))
 
 /* Total width of fringes reserved for drawing truncation bitmaps,
@@ -567,37 +653,37 @@ struct window
    sizes aren't pixel values.  If it weren't the case, we wouldn't be
    able to split windows horizontally nicely.  */
 
-#define WINDOW_FRINGE_COLS(W)                          \
-  ((INTEGERP ((W)->left_fringe_width)                  \
-    || INTEGERP ((W)->right_fringe_width))             \
-   ? ((WINDOW_LEFT_FRINGE_WIDTH (W)                    \
-       + WINDOW_RIGHT_FRINGE_WIDTH (W)                 \
-       + WINDOW_FRAME_COLUMN_WIDTH (W) - 1)            \
-      / WINDOW_FRAME_COLUMN_WIDTH (W))                 \
+#define WINDOW_FRINGE_COLS(W)                  \
+  ((INTEGERP (W->left_fringe_width)            \
+    || INTEGERP (W->right_fringe_width))       \
+   ? ((WINDOW_LEFT_FRINGE_WIDTH (W)            \
+       + WINDOW_RIGHT_FRINGE_WIDTH (W)         \
+       + WINDOW_FRAME_COLUMN_WIDTH (W) - 1)    \
+      / WINDOW_FRAME_COLUMN_WIDTH (W))         \
    : FRAME_FRINGE_COLS (WINDOW_XFRAME (W)))
 
 /* Column-width of the left and right fringe.  */
 
-#define WINDOW_LEFT_FRINGE_COLS(W)                     \
-  ((WINDOW_LEFT_FRINGE_WIDTH ((W))                     \
-    + WINDOW_FRAME_COLUMN_WIDTH (W) - 1)               \
+#define WINDOW_LEFT_FRINGE_COLS(W)             \
+  ((WINDOW_LEFT_FRINGE_WIDTH ((W))             \
+    + WINDOW_FRAME_COLUMN_WIDTH (W) - 1)       \
    / WINDOW_FRAME_COLUMN_WIDTH (W))
 
-#define WINDOW_RIGHT_FRINGE_COLS(W)                    \
-  ((WINDOW_RIGHT_FRINGE_WIDTH ((W))                    \
-    + WINDOW_FRAME_COLUMN_WIDTH (W) - 1)               \
+#define WINDOW_RIGHT_FRINGE_COLS(W)            \
+  ((WINDOW_RIGHT_FRINGE_WIDTH ((W))            \
+    + WINDOW_FRAME_COLUMN_WIDTH (W) - 1)       \
    / WINDOW_FRAME_COLUMN_WIDTH (W))
 
 /* 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 (W->left_fringe_width)                     \
+   ? XFASTINT (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 (W->right_fringe_width)                    \
+   ? XFASTINT (W->right_fringe_width)                  \
    : FRAME_RIGHT_FRINGE_WIDTH (WINDOW_XFRAME (W)))
 
 /* Total width of fringes in pixels.  */
@@ -608,42 +694,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 (w->vertical_scroll_bar_type, Qt)                        \
    ? FRAME_VERTICAL_SCROLL_BAR_TYPE (WINDOW_XFRAME (w))        \
-   : EQ ((w)->vertical_scroll_bar_type, Qleft)         \
+   : EQ (w->vertical_scroll_bar_type, Qleft)           \
    ? vertical_scroll_bar_left                          \
-   : EQ ((w)->vertical_scroll_bar_type, Qright)                \
+   : EQ (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 (w->vertical_scroll_bar_type, Qt)                        \
    ? FRAME_HAS_VERTICAL_SCROLL_BARS (WINDOW_XFRAME (w))        \
-   : !NILP ((w)->vertical_scroll_bar_type))
+   : !NILP (w->vertical_scroll_bar_type))
 
 #define WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT(w)              \
-  (EQ ((w)->vertical_scroll_bar_type, Qt)                      \
+  (EQ (w->vertical_scroll_bar_type, Qt)                                \
    ? FRAME_HAS_VERTICAL_SCROLL_BARS_ON_LEFT (WINDOW_XFRAME (w))        \
-   : EQ ((w)->vertical_scroll_bar_type, Qleft))
+   : EQ (w->vertical_scroll_bar_type, Qleft))
 
-#define WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT(w)             \
-  (EQ ((w)->vertical_scroll_bar_type, Qt)                      \
-   ? FRAME_HAS_VERTICAL_SCROLL_BARS_ON_RIGHT (WINDOW_XFRAME (w))\
-   : EQ ((w)->vertical_scroll_bar_type, Qright))
+#define WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT(w)                     \
+  (EQ (w->vertical_scroll_bar_type, Qt)                                        \
+   ? FRAME_HAS_VERTICAL_SCROLL_BARS_ON_RIGHT (WINDOW_XFRAME (w))       \
+   : EQ (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 (w->scroll_bar_width)                      \
+   ? XFASTINT (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.
@@ -651,8 +737,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 (w->scroll_bar_width)                      \
+   ? ((XFASTINT (w->scroll_bar_width)                  \
        + WINDOW_FRAME_COLUMN_WIDTH (w) - 1)            \
       / WINDOW_FRAME_COLUMN_WIDTH (w))                 \
    : FRAME_CONFIG_SCROLL_BAR_COLS (WINDOW_XFRAME (w)))
@@ -662,14 +748,14 @@ struct window
    the right in this frame, or there are no scroll bars, value is 0.  */
 
 #define WINDOW_LEFT_SCROLL_BAR_COLS(w)        \
-  (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (w) \
+  (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (w)  \
    ? (WINDOW_CONFIG_SCROLL_BAR_COLS (w))       \
    : 0)
 
 /* Width of a left scroll bar area in window W , measured in pixels.  */
 
-#define WINDOW_LEFT_SCROLL_BAR_AREA_WIDTH(w) \
-  (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (w) \
+#define WINDOW_LEFT_SCROLL_BAR_AREA_WIDTH(w)                            \
+  (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (w)                           \
    ? (WINDOW_CONFIG_SCROLL_BAR_COLS (w) * WINDOW_FRAME_COLUMN_WIDTH (w)) \
    : 0)
 
@@ -678,7 +764,7 @@ struct window
    the left in this frame, or there are no scroll bars, value is 0.  */
 
 #define WINDOW_RIGHT_SCROLL_BAR_COLS(w)                \
-  (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (w) \
+  (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (w) \
    ? WINDOW_CONFIG_SCROLL_BAR_COLS (w)         \
    : 0)
 
@@ -700,7 +786,7 @@ struct window
 /* Width of a left scroll bar area in window W , measured in pixels.  */
 
 #define WINDOW_SCROLL_BAR_AREA_WIDTH(w)                                         \
-  (WINDOW_HAS_VERTICAL_SCROLL_BAR (w)                                  \
+  (WINDOW_HAS_VERTICAL_SCROLL_BAR (w)                                   \
    ? (WINDOW_CONFIG_SCROLL_BAR_COLS (w) * WINDOW_FRAME_COLUMN_WIDTH (w)) \
    : 0)
 
@@ -721,7 +807,7 @@ struct window
    ? CURRENT_MODE_LINE_HEIGHT (W)      \
    : 0)
 
-#define WINDOW_MODE_LINE_LINES(W)              \
+#define WINDOW_MODE_LINE_LINES(W)      \
   (!! WINDOW_WANTS_MODELINE_P ((W)))
 
 /* Height in pixels, and in lines, of the header line.
@@ -732,7 +818,7 @@ struct window
    ? CURRENT_HEADER_LINE_HEIGHT (W)    \
    : 0)
 
-#define WINDOW_HEADER_LINE_LINES(W)            \
+#define WINDOW_HEADER_LINE_LINES(W)    \
   (!! WINDOW_WANTS_HEADER_LINE_P ((W)))
 
 /* Pixel height of window W without mode line.  */
@@ -743,36 +829,36 @@ struct window
 
 /* Pixel height of window W without mode and header line.  */
 
-#define WINDOW_BOX_TEXT_HEIGHT(W)              \
-  (WINDOW_TOTAL_HEIGHT ((W))                   \
-   - WINDOW_MODE_LINE_HEIGHT ((W))             \
+#define WINDOW_BOX_TEXT_HEIGHT(W)      \
+  (WINDOW_TOTAL_HEIGHT ((W))           \
+   - WINDOW_MODE_LINE_HEIGHT ((W))     \
    - WINDOW_HEADER_LINE_HEIGHT ((W)))
 
 
 /* Convert window W relative pixel X to frame pixel coordinates.  */
 
-#define WINDOW_TO_FRAME_PIXEL_X(W, X)          \
+#define WINDOW_TO_FRAME_PIXEL_X(W, X)  \
   ((X) + WINDOW_BOX_LEFT_EDGE_X ((W)))
 
 /* Convert window W relative pixel Y to frame pixel coordinates.  */
 
-#define WINDOW_TO_FRAME_PIXEL_Y(W, Y)          \
+#define WINDOW_TO_FRAME_PIXEL_Y(W, Y)  \
   ((Y) + WINDOW_TOP_EDGE_Y ((W)))
 
 /* Convert frame relative pixel X to window relative pixel X.  */
 
-#define FRAME_TO_WINDOW_PIXEL_X(W, X)          \
+#define FRAME_TO_WINDOW_PIXEL_X(W, X)  \
   ((X) - WINDOW_BOX_LEFT_EDGE_X ((W)))
 
 /* Convert frame relative pixel Y to window relative pixel Y.  */
 
-#define FRAME_TO_WINDOW_PIXEL_Y(W, Y)          \
+#define FRAME_TO_WINDOW_PIXEL_Y(W, Y)  \
   ((Y) - WINDOW_TOP_EDGE_Y ((W)))
 
 /* Convert a text area relative x-position in window W to frame X
    pixel coordinates.  */
 
-#define WINDOW_TEXT_TO_FRAME_PIXEL_X(W, X)             \
+#define WINDOW_TEXT_TO_FRAME_PIXEL_X(W, X)     \
   (window_box_left ((W), TEXT_AREA) + (X))
 
 /* This is the window in which the terminal's cursor should
@@ -810,14 +896,9 @@ 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 resize_frame_windows (struct frame *, int, int);
 extern void delete_all_child_windows (Lisp_Object);
 extern void freeze_window_starts (struct frame *, int);
@@ -852,13 +933,8 @@ extern EMACS_INT minibuf_level;
 
 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 */
+   redisplay that finished */
 
 extern int windows_or_buffers_changed;
 
@@ -866,11 +942,6 @@ extern int windows_or_buffers_changed;
 
 extern int cursor_type_changed;
 
-/* Number of windows displaying the selected buffer.  Normally this is
-   1, but it can be more.  */
-
-extern int buffer_shared;
-
 /* If *ROWS or *COLS are too small a size for FRAME, set them to the
    minimum allowable size.  */
 
@@ -882,38 +953,47 @@ extern void check_frame_size (struct frame *frame, int *rows, int *cols);
 
 struct glyph *get_phys_cursor_glyph (struct window *w);
 
-/* Value is non-zero if WINDOW is a live window.  */
+/* Value is non-zero if WINDOW is a valid window.  */
+#define WINDOW_VALID_P(WINDOW)                         \
+  (WINDOWP (WINDOW)                                    \
+   && (!NILP (XWINDOW (WINDOW)->buffer)                        \
+       || !NILP (XWINDOW (WINDOW)->vchild)             \
+       || !NILP (XWINDOW (WINDOW)->hchild)))
 
-#define WINDOW_LIVE_P(WINDOW) \
-     (WINDOWP ((WINDOW)) && !NILP (XWINDOW ((WINDOW))->buffer))
+/* A window of any sort, leaf or interior, is "valid" if one
+   of its buffer, vchild, or hchild members is non-nil.  */
+#define CHECK_VALID_WINDOW(WINDOW)                             \
+  CHECK_TYPE (WINDOW_VALID_P (WINDOW), Qwindow_valid_p, WINDOW)
 
+/* Value is non-zero if WINDOW is a live window.  */
+#define WINDOW_LIVE_P(WINDOW)                                  \
+  (WINDOWP (WINDOW) && !NILP (XWINDOW (WINDOW)->buffer))
+
+/* A window is "live" if and only if it shows a buffer.  */
+#define CHECK_LIVE_WINDOW(WINDOW)                              \
+  CHECK_TYPE (WINDOW_LIVE_P (WINDOW), Qwindow_live_p, WINDOW)
 
 /* These used to be in lisp.h.  */
 
 extern Lisp_Object Qwindowp, Qwindow_live_p;
 extern Lisp_Object Vwindow_list;
 
-EXFUN (Fwindow_buffer, 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 (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 struct window *decode_live_window (Lisp_Object);
+extern struct window *decode_any_window (Lisp_Object);
+extern bool compare_window_configurations (Lisp_Object, Lisp_Object, bool);
 extern void mark_window_cursors_off (struct window *);
 extern int window_internal_height (struct window *);
 extern int window_body_cols (struct window *w);
-EXFUN (Frecenter, 1);
 extern void temp_output_buffer_show (Lisp_Object);
 extern void replace_buffer_in_windows (Lisp_Object);
 extern void replace_buffer_in_windows_safely (Lisp_Object);
+/* This looks like a setter, but it is a bit special.  */
+extern void wset_buffer (struct window *, 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);
 
+INLINE_HEADER_END
+
 #endif /* not WINDOW_H_INCLUDED */