summaryrefslogtreecommitdiff
path: root/src/window.h
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2022-09-25 16:15:16 -0400
committerStefan Monnier <monnier@iro.umontreal.ca>2022-09-25 16:15:16 -0400
commit650c20f1ca4e07591a727e1cfcc74b3363d15985 (patch)
tree85d11f6437cde22f410c25e0e5f71a3131ebd07d /src/window.h
parent8869332684c2302b5ba1ead4568bbc7ba1c0183e (diff)
parent4b85ae6a24380fb67a3315eaec9233f17a872473 (diff)
downloademacs-650c20f1ca4e07591a727e1cfcc74b3363d15985.tar.gz
emacs-650c20f1ca4e07591a727e1cfcc74b3363d15985.tar.bz2
emacs-650c20f1ca4e07591a727e1cfcc74b3363d15985.zip
Merge 'master' into noverlay
Diffstat (limited to 'src/window.h')
-rw-r--r--src/window.h300
1 files changed, 192 insertions, 108 deletions
diff --git a/src/window.h b/src/window.h
index 324d30b57f9..b5d0c69ab52 100644
--- a/src/window.h
+++ b/src/window.h
@@ -1,5 +1,5 @@
/* Window definitions for GNU Emacs.
- Copyright (C) 1985-1986, 1993, 1995, 1997-2017 Free Software
+ Copyright (C) 1985-1986, 1993, 1995, 1997-2022 Free Software
Foundation, Inc.
This file is part of GNU Emacs.
@@ -24,57 +24,69 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
INLINE_HEADER_BEGIN
-/* Windows are allocated as if they were vectors, but then the
-Lisp data type is changed to Lisp_Window. They are garbage
-collected along with the vectors.
+/* Windows are allocated as if they were vectors, but then the Lisp
+data type is changed to Lisp_Window. They are garbage collected along
+with the vectors.
All windows in use are arranged into a tree, with pointers up and down.
-Windows that are leaves of the tree are actually displayed
-and show the contents of buffers. Windows that are not leaves
-are used for representing the way groups of leaf windows are
-arranged on the frame. Leaf windows never become non-leaves.
-They are deleted only by calling delete-window on them (but
-this can be done implicitly). Combination windows can be created
-and deleted at any time.
-
-A leaf window has a buffer stored in contents field and markers in its start
-and pointm fields. Non-leaf windows have nil in the latter two fields.
-
-Non-leaf windows are either vertical or horizontal combinations.
-
-A vertical combination window has children that are arranged on the frame
-one above the next. Its contents field points to the uppermost child.
-The parent field of each of the children points to the vertical
-combination window. The next field of each child points to the
-child below it, or is nil for the lowest child. The prev field
-of each child points to the child above it, or is nil for the
-highest child.
-
-A horizontal combination window has children that are side by side.
-Its contents field points to the leftmost child. In each child
-the next field points to the child to the right and the prev field
-points to the child to the left.
-
-The children of a vertical combination window may be leaf windows
-or horizontal combination windows. The children of a horizontal
-combination window may be leaf windows or vertical combination windows.
-
-At the top of the tree are two windows which have nil as parent.
-The second of these is minibuf_window. The first one manages all
-the frame area that is not minibuffer, and is called the root window.
-Different windows can be the root at different times;
-initially the root window is a leaf window, but if more windows
-are created then that leaf window ceases to be root and a newly
-made combination window becomes root instead.
-
-In any case, on screens which have an ordinary window and a
-minibuffer, prev of the minibuf window is the root window and next of
-the root window is the minibuf window. On minibufferless screens or
-minibuffer-only screens, the root window and the minibuffer window are
-one and the same, so its prev and next members are nil.
-
-A dead window has its contents field set to nil. */
+Windows that are leaves of the tree are actually displayed and show
+the contents of buffers. Windows that are not leaves are used for
+representing the way groups of leaf windows are arranged on the frame.
+Leaf windows never become non-leaves. They are deleted only by
+calling `delete-window' on them (but this can be done implicitly).
+Non-leaf windows never become leaf windows and can be created and
+deleted at any time by the window management code. Non-leaf windows
+can be seen but not directly manipulated by Lisp functions.
+
+A leaf window has a buffer stored in its contents field and markers in
+its 'start' and 'pointm' fields. Non-leaf windows have nil in the
+latter two fields. Non-leaf windows are either vertical or horizontal
+combinations.
+
+A vertical combination window has children that are arranged on the
+frame one above the next. Its 'contents' field points to the
+uppermost child. The 'parent' field of each of the children points to
+the vertical combination window. The 'next' field of each child
+points to the child below it, or is nil for the lowest child. The
+'prev' field of each child points to the child above it, or is nil for
+the highest child.
+
+A horizontal combination window has children that are arranged side by
+side. Its 'contents' field points to the leftmost child. In each
+child the 'next' field points to the child to the right and the 'prev'
+field points to the child to the left.
+
+On each frame there are at least one and at most two windows which
+have nil as parent. The second of these, if present, is the frame's
+minibuffer window and shows the minibuffer or the echo area. The
+first one manages the remaining frame area and is called the frame's
+root window. Different windows can be the root at different times;
+initially the root window is a leaf window, but if more windows are
+created, then that leaf window ceases to be root and a newly made
+combination window becomes the root instead.
+
+On frames which have an ordinary window and a minibuffer window,
+'prev' of the minibuffer window is the root window and 'next' of the
+root window is the minibuffer window. On minibuffer-less frames there
+is only a root window and 'next' of the root window is nil. On
+minibuffer-only frames, the root window and the minibuffer window are
+one and the same, so its 'prev' and 'next' members are nil. In any
+case, 'prev' of a root window and 'next' of a minibuffer window are
+always nil.
+
+In Lisp parlance, leaf windows are called "live windows" and non-leaf
+windows are called "internal windows". Together, live and internal
+windows form the set of "valid windows". A window that has been
+deleted is considered "dead" regardless of whether it formerly was a
+leaf or a non-leaf window. A dead window has its 'contents' field set
+to nil.
+
+Frames may also contain pseudo windows, windows that are not exposed
+directly to Lisp code. Pseudo windows are currently either used to
+display the menu bar or the tool bar (when Emacs uses toolkits that
+don't display their own menu bar and tool bar) or a tooltip in a
+tooltip frame (when tooltips are not display by the toolkit). */
struct cursor_pos
{
@@ -88,34 +100,53 @@ struct cursor_pos
struct window
{
/* This is for Lisp; the terminal code does not refer to it. */
- struct vectorlike_header header;
+ union vectorlike_header header;
/* The frame this window is on. */
Lisp_Object frame;
- /* Following (to right or down) and preceding (to left or up) child
- at same level of tree. */
+ /* Following (to right or down) and preceding (to left or up)
+ child at same level of tree. Whether this is left/right or
+ up/down is determined by the parent window's 'horizontal' flag,
+ see below. On a frame that is neither a minibuffer-only nor a
+ minibuffer-less frame, 'next' of the root window points to the
+ frame's minibuffer window and 'prev' of the minibuffer window
+ points to the frame's root window. In all other cases, 'next'
+ of the root window and 'prev' of the minibuffer window, if
+ present, are nil. 'prev' of the root window and 'next' of the
+ minibuffer window are always nil. */
Lisp_Object next;
Lisp_Object prev;
- /* The window this one is a child of. */
+ /* The window this one is a child of. For the root and a
+ minibuffer window this is always nil. */
Lisp_Object parent;
- /* The normal size of the window. These are fractions, but we do
- not use C doubles to avoid creating new Lisp_Float objects while
- interfacing Lisp in Fwindow_normal_size. */
+ /* The "normal" size of the window. These are fractions, but we
+ do not use C doubles to avoid creating new Lisp_Float objects
+ while interfacing Lisp in Fwindow_normal_size. */
Lisp_Object normal_lines;
Lisp_Object normal_cols;
- /* New sizes of the window. Note that Lisp code may set new_normal
- to something beyond an integer, so C int can't be used here. */
+ /* The new sizes of the window as proposed by the window resizing
+ functions. Note that Lisp code may set new_normal to something
+ beyond an integer, so C int can't be used here. */
Lisp_Object new_total;
Lisp_Object new_normal;
Lisp_Object new_pixel;
- /* May be buffer, window, or nil. */
+ /* For a leaf window or a tooltip window this is the buffer shown
+ in the window; for a combination window this is the first of
+ its child windows; for a pseudo window showing the menu bar or
+ tool bar this is nil. It is a buffer for a minibuffer window
+ as well. */
Lisp_Object contents;
+ /* The old buffer of this window, set to this window's buffer by
+ run_window_change_functions every time it sees this window.
+ Unused for internal windows. */
+ Lisp_Object old_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
@@ -168,19 +199,17 @@ struct window
and Qt, so bitfield can't be used here. */
Lisp_Object dedicated;
- /* If redisplay in this window goes beyond this buffer position,
- must run the redisplay-end-trigger-hook. */
- Lisp_Object redisplay_end_trigger;
-
/* t means this window's child windows are not (re-)combined. */
Lisp_Object combination_limit;
/* An alist with parameters. */
Lisp_Object window_parameters;
- /* No Lisp data may follow below this point without changing
- mark_object in alloc.c. The member current_matrix must be the
- first non-Lisp member. */
+ /* The help echo text for this window. Qnil if there's none. */
+ Lisp_Object mode_line_help_echo;
+
+ /* No Lisp data may follow this point; mode_line_help_echo must be
+ the last Lisp member. */
/* Glyph matrices. */
struct glyph_matrix *current_matrix;
@@ -188,7 +217,7 @@ struct window
/* 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
+ /* A list 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. */
@@ -200,6 +229,14 @@ struct window
/* Unique number of window assigned when it was created. */
EMACS_INT sequence_number;
+ /* The change stamp of this window. Set to 0 when the window is
+ created, it is set to its frame's change stamp every time
+ run_window_change_functions is run on that frame with this
+ window live. It is left alone when the window exists only
+ within a window configuration. Not useful for internal
+ windows. */
+ int change_stamp;
+
/* The upper left corner pixel coordinates of this window, as
integers relative to upper left corner of frame = 0, 0. */
int pixel_left;
@@ -214,10 +251,13 @@ struct window
int pixel_width;
int pixel_height;
- /* The pixel sizes of the window at the last time
- `window-size-change-functions' was run. */
- int pixel_width_before_size_change;
- int pixel_height_before_size_change;
+ /* The pixel and pixel body sizes of the window at the last time
+ run_window_change_functions was run with this window live. Not
+ useful for internal windows. */
+ int old_pixel_width;
+ int old_pixel_height;
+ int old_body_pixel_width;
+ int old_body_pixel_height;
/* The size of the window. */
int total_cols;
@@ -236,11 +276,11 @@ struct window
/* Displayed buffer's text modification events counter as of last time
display completed. */
- EMACS_INT last_modified;
+ modiff_count last_modified;
/* Displayed buffer's overlays modification events counter as of last
complete update. */
- EMACS_INT last_overlay_modified;
+ modiff_count last_overlay_modified;
/* Value of point at that time. Since this is a position in a buffer,
it should be positive. */
@@ -317,6 +357,9 @@ struct window
/* Effective height of the header line, or -1 if not known. */
int header_line_height;
+ /* Effective height of the tab line, or -1 if not known. */
+ int tab_line_height;
+
/* Z - the buffer position of the last glyph in the current
matrix of W. Only valid if window_end_valid is true. */
ptrdiff_t window_end_pos;
@@ -370,13 +413,22 @@ struct window
bool_bf must_be_updated_p : 1;
/* Flag indicating that this window is not a real one.
- Currently only used for menu bar windows of frames. */
+ Currently only used for menu bar windows, for tool bar windows,
+ and for tooltips. */
bool_bf pseudo_window_p : 1;
/* True means fringes are drawn outside display margins.
Otherwise draw them between margin areas and text. */
bool_bf fringes_outside_margins : 1;
+ /* True if this window's fringe specifications are persistent,
+ i.e., always survive Fset_window_buffer. */
+ bool_bf fringes_persistent : 1;
+
+ /* True if this window's scroll bar specifications are persistent,
+ i.e., always survive Fset_window_buffer. */
+ bool_bf scroll_bars_persistent : 1;
+
/* True if window_end_pos and window_end_vpos are truly valid.
This is false if nontrivial redisplay is preempted since in that case
the frame image that window_end_pos did not get onto the frame. */
@@ -389,6 +441,10 @@ struct window
window. */
bool_bf suspend_auto_hscroll : 1;
+ /* True if vscroll should be preserved while forcing the start due
+ to a frozen window. */
+ bool_bf preserve_vscroll_p : 1;
+
/* Amount by which lines of this window are scrolled in
y-direction (smooth scrolling). */
int vscroll;
@@ -396,7 +452,7 @@ struct window
/* 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 true. */
ptrdiff_t window_end_bytepos;
- };
+ } GCALIGNED_STRUCT;
INLINE bool
WINDOWP (Lisp_Object a)
@@ -414,7 +470,7 @@ INLINE struct window *
XWINDOW (Lisp_Object a)
{
eassert (WINDOWP (a));
- return XUNTAG (a, Lisp_Vectorlike);
+ return XUNTAG (a, Lisp_Vectorlike, struct window);
}
/* Most code should use these functions to set Lisp fields in struct
@@ -438,9 +494,9 @@ wset_prev (struct window *w, Lisp_Object val)
}
INLINE void
-wset_redisplay_end_trigger (struct window *w, Lisp_Object val)
+wset_mode_line_help_echo (struct window *w, Lisp_Object val)
{
- w->redisplay_end_trigger = val;
+ w->mode_line_help_echo = val;
}
INLINE void
@@ -544,7 +600,14 @@ wset_next_buffers (struct window *w, Lisp_Object val)
#define WINDOW_BUFFER(W) \
(WINDOW_LEAF_P(W) \
? (W)->contents \
- : Qnil) \
+ : Qnil)
+
+/* Local value of variable V in window W's buffer. Nil if W has no
+ buffer. */
+#define WINDOW_BUFFER_LOCAL_VALUE(V, W) \
+ (BUFFERP ((W)->contents) \
+ ? buffer_local_value(V, (W)->contents) \
+ : Qnil)
/* Return the canonical column width of the frame of window W. */
#define WINDOW_FRAME_COLUMN_WIDTH(W) \
@@ -598,7 +661,7 @@ wset_next_buffers (struct window *w, Lisp_Object val)
#define WINDOW_RIGHTMOST_P(W) \
(WINDOW_RIGHT_PIXEL_EDGE (W) \
== (WINDOW_RIGHT_PIXEL_EDGE \
- (XWINDOW (FRAME_ROOT_WINDOW (WINDOW_XFRAME (W)))))) \
+ (XWINDOW (FRAME_ROOT_WINDOW (WINDOW_XFRAME (W))))))
/* True if window W has no other windows below it on its frame (the
minibuffer window is not counted in this respect unless W itself is a
@@ -606,13 +669,13 @@ wset_next_buffers (struct window *w, Lisp_Object val)
#define WINDOW_BOTTOMMOST_P(W) \
(WINDOW_BOTTOM_PIXEL_EDGE (W) \
== (WINDOW_BOTTOM_PIXEL_EDGE \
- (XWINDOW (FRAME_ROOT_WINDOW (WINDOW_XFRAME (W)))))) \
+ (XWINDOW (FRAME_ROOT_WINDOW (WINDOW_XFRAME (W))))))
/* True if window W takes up the full width of its frame. */
#define WINDOW_FULL_WIDTH_P(W) \
(WINDOW_PIXEL_WIDTH (W) \
== (WINDOW_PIXEL_WIDTH \
- (XWINDOW (FRAME_ROOT_WINDOW (WINDOW_XFRAME (W)))))) \
+ (XWINDOW (FRAME_ROOT_WINDOW (WINDOW_XFRAME (W))))))
/* Width of right divider of window W. */
#define WINDOW_RIGHT_DIVIDER_WIDTH(W) \
@@ -638,7 +701,7 @@ wset_next_buffers (struct window *w, Lisp_Object val)
(WINDOW_LEFT_EDGE_COL (W) + WINDOW_TOTAL_COLS (W))
/* Return the canonical frame line at which window W starts.
- This includes a header line, if any. */
+ This includes a header/tab line, if any. */
#define WINDOW_TOP_EDGE_LINE(W) (W)->top_line
/* Return the canonical frame line before which window W ends.
@@ -656,7 +719,7 @@ wset_next_buffers (struct window *w, Lisp_Object val)
(WINDOW_LEFT_PIXEL_EDGE (W) + WINDOW_PIXEL_WIDTH (W))
/* Return the top pixel edge at which window W starts.
- This includes a header line, if any. */
+ This includes a header/tab line, if any. */
#define WINDOW_TOP_PIXEL_EDGE(W) (W)->pixel_top
/* Return the bottom pixel edge before which window W ends.
@@ -686,8 +749,17 @@ wset_next_buffers (struct window *w, Lisp_Object val)
#define WINDOW_MENU_BAR_P(W) false
#endif
+/* True if W is a tab bar window. */
+#if defined (HAVE_WINDOW_SYSTEM) && !defined (HAVE_PGTK)
+# define WINDOW_TAB_BAR_P(W) \
+ (WINDOWP (WINDOW_XFRAME (W)->tab_bar_window) \
+ && (W) == XWINDOW (WINDOW_XFRAME (W)->tab_bar_window))
+#else
+# define WINDOW_TAB_BAR_P(W) false
+#endif
+
/* True if W is a tool bar window. */
-#if defined (HAVE_WINDOW_SYSTEM) && ! defined (USE_GTK) && ! defined (HAVE_NS)
+#if defined (HAVE_WINDOW_SYSTEM) && ! defined (HAVE_EXT_TOOL_BAR)
#define WINDOW_TOOL_BAR_P(W) \
(WINDOWP (WINDOW_XFRAME (W)->tool_bar_window) \
&& (W) == XWINDOW (WINDOW_XFRAME (W)->tool_bar_window))
@@ -697,13 +769,13 @@ wset_next_buffers (struct window *w, Lisp_Object val)
/* Return the frame y-position at which window W starts. */
#define WINDOW_TOP_EDGE_Y(W) \
- (((WINDOW_MENU_BAR_P (W) || WINDOW_TOOL_BAR_P (W)) \
+ (((WINDOW_MENU_BAR_P (W) || WINDOW_TAB_BAR_P (W) || WINDOW_TOOL_BAR_P (W)) \
? 0 : FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W))) \
+ WINDOW_TOP_PIXEL_EDGE (W))
/* Return the frame y-position before which window W ends. */
#define WINDOW_BOTTOM_EDGE_Y(W) \
- (((WINDOW_MENU_BAR_P (W) || WINDOW_TOOL_BAR_P (W)) \
+ (((WINDOW_MENU_BAR_P (W) || WINDOW_TAB_BAR_P (W) || WINDOW_TOOL_BAR_P (W)) \
? 0 : FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W))) \
+ WINDOW_BOTTOM_PIXEL_EDGE (W))
@@ -809,7 +881,9 @@ wset_next_buffers (struct window *w, Lisp_Object val)
W. Horizontal scrollbars exist for toolkit versions only. */
#if USE_HORIZONTAL_SCROLL_BARS
#define WINDOW_HAS_HORIZONTAL_SCROLL_BAR(W) \
- ((WINDOW_PSEUDO_P (W) || MINI_NON_ONLY_WINDOW_P (W)) \
+ ((WINDOW_PSEUDO_P (W) \
+ || (MINI_WINDOW_P (W) \
+ && !EQ (W->horizontal_scroll_bar_type, Qbottom))) \
? false \
: EQ (W->horizontal_scroll_bar_type, Qt) \
? FRAME_HAS_HORIZONTAL_SCROLL_BARS (WINDOW_XFRAME (W)) \
@@ -935,6 +1009,16 @@ wset_next_buffers (struct window *w, Lisp_Object val)
#define WINDOW_HEADER_LINE_LINES(W) \
window_wants_header_line (W)
+/* Height in pixels of the tab line.
+ Zero if W doesn't have a tab line. */
+#define WINDOW_TAB_LINE_HEIGHT(W) \
+ (window_wants_tab_line (W) \
+ ? CURRENT_TAB_LINE_HEIGHT (W) \
+ : 0)
+
+#define WINDOW_TAB_LINE_LINES(W) \
+ window_wants_tab_line (W)
+
/* Pixel height of window W without mode line, bottom scroll bar and
bottom divider. */
#define WINDOW_BOX_HEIGHT_NO_MODE_LINE(W) \
@@ -943,14 +1027,15 @@ wset_next_buffers (struct window *w, Lisp_Object val)
- WINDOW_SCROLL_BAR_AREA_HEIGHT (W) \
- WINDOW_MODE_LINE_HEIGHT (W))
-/* Pixel height of window W without mode and header line and bottom
+/* Pixel height of window W without mode and header/tab line and bottom
divider. */
#define WINDOW_BOX_TEXT_HEIGHT(W) \
(WINDOW_PIXEL_HEIGHT ((W)) \
- WINDOW_BOTTOM_DIVIDER_WIDTH (W) \
- WINDOW_SCROLL_BAR_AREA_HEIGHT (W) \
- WINDOW_MODE_LINE_HEIGHT (W) \
- - WINDOW_HEADER_LINE_HEIGHT (W))
+ - WINDOW_HEADER_LINE_HEIGHT (W) \
+ - WINDOW_TAB_LINE_HEIGHT (W))
/* Return the frame position where the horizontal scroll bar of window W
starts. */
@@ -1007,15 +1092,15 @@ extern Lisp_Object minibuf_selected_window;
extern Lisp_Object make_window (void);
extern Lisp_Object window_from_coordinates (struct frame *, int, int,
- enum window_part *, bool);
-extern void resize_frame_windows (struct frame *, int, bool, bool);
+ enum window_part *, bool, bool);
+extern void resize_frame_windows (struct frame *, int, bool);
extern void restore_window_configuration (Lisp_Object);
extern void delete_all_child_windows (Lisp_Object);
-extern void grow_mini_window (struct window *, int, bool);
-extern void shrink_mini_window (struct window *, bool);
+extern void grow_mini_window (struct window *, int);
+extern void shrink_mini_window (struct window *);
extern int window_relative_x_coord (struct window *, enum window_part, int);
-void run_window_size_change_functions (Lisp_Object);
+void run_window_change_functions (void);
/* Make WINDOW display BUFFER. RUN_HOOKS_P means it's allowed
to run hooks. See make_frame for a case where it's not allowed. */
@@ -1029,14 +1114,6 @@ void set_window_buffer (Lisp_Object window, Lisp_Object buffer,
extern Lisp_Object echo_area_window;
-/* Depth in recursive edits. */
-
-extern EMACS_INT command_loop_level;
-
-/* Depth in minibuffer invocations. */
-
-extern EMACS_INT minibuf_level;
-
/* Non-zero if we should redraw the mode lines on the next redisplay.
Usually set to a unique small integer so we can track the main causes of
full redisplays in `redisplay--mode-lines-cause'. */
@@ -1058,6 +1135,7 @@ extern void wset_redisplay (struct window *w);
extern void fset_redisplay (struct frame *f);
extern void bset_redisplay (struct buffer *b);
extern void bset_update_mode_line (struct buffer *b);
+extern void wset_update_mode_line (struct window *w);
/* Call this to tell redisplay to look for other windows than selected-window
that need to be redisplayed. Calling one of the *set_redisplay functions
above already does it, so it's only needed in unusual cases. */
@@ -1071,7 +1149,7 @@ struct glyph *get_phys_cursor_glyph (struct window *w);
/* True if WINDOW is a valid window. */
#define WINDOW_VALID_P(WINDOW) \
- (WINDOWP (WINDOW) && !NILP (XWINDOW (WINDOW)->contents)) \
+ (WINDOWP (WINDOW) && !NILP (XWINDOW (WINDOW)->contents))
/* A window of any sort, leaf or interior, is "valid" if its
contents slot is non-nil. */
@@ -1093,25 +1171,31 @@ extern Lisp_Object window_list (void);
extern Lisp_Object window_parameter (struct window *, Lisp_Object parameter);
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 bool window_wants_mode_line (struct window *);
extern bool window_wants_header_line (struct window *);
+extern bool window_wants_tab_line (struct window *);
extern int window_internal_height (struct window *);
-extern int window_body_width (struct window *w, bool);
+enum window_body_unit
+ {
+ WINDOW_BODY_IN_CANONICAL_CHARS,
+ WINDOW_BODY_IN_PIXELS,
+ WINDOW_BODY_IN_REMAPPED_CHARS
+ };
+extern int window_body_width (struct window *w, enum window_body_unit);
+extern int window_body_height (struct window *w, enum window_body_unit);
enum margin_unit { MARGIN_IN_LINES, MARGIN_IN_PIXELS };
extern int window_scroll_margin (struct window *, enum margin_unit);
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);
-extern void sanitize_window_sizes (Lisp_Object horizontal);
/* This looks like a setter, but it is a bit special. */
extern void wset_buffer (struct window *, Lisp_Object);
extern bool window_outdated (struct window *);
+extern ptrdiff_t window_point (struct window *w);
extern void init_window_once (void);
extern void init_window (void);
extern void syms_of_window (void);
-extern void keys_of_window (void);
/* Move cursor to row/column position VPOS/HPOS, pixel coordinates
Y/X. HPOS/VPOS are window-relative row and column numbers and X/Y
are window-relative pixel positions. This is always done during