/* 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.
#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
/* 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;
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
/* 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. */
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;
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
/* 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;
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. */
/* 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;
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:
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. */
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. */
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. */
/* 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,
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. */
/* 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.
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)))
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)
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)
/* 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)
? 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.
? 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. */
/* 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
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);
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;
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. */
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 */