/* Window definitions for GNU Emacs.
- Copyright (C) 1985-1986, 1993, 1995, 1997-2013 Free Software
+ Copyright (C) 1985-1986, 1993, 1995, 1997-2014 Free Software
Foundation, Inc.
This file is part of GNU Emacs.
#include "dispextern.h"
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
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. */
Lisp_Object contents;
/* 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. */
-
/* Glyph matrices. */
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;
+
+ /* The upper left corner pixel coordinates of this window, as
+ integers relative to upper left corner of frame = 0, 0. */
+ int pixel_left;
+ int pixel_top;
+
/* The upper left corner coordinates of this window,
relative to upper left corner of frame = 0, 0. */
int left_col;
int top_line;
+ /* The pixel size of the window. */
+ int pixel_width;
+ int pixel_height;
+
/* The size of the window. */
- int total_lines;
int total_cols;
+ int total_lines;
/* Number of columns display within the window is scrolled to the left. */
ptrdiff_t hscroll;
without pause. This is the position of last_point. */
int last_cursor_vpos;
- /* Cursor type and width of last cursor drawn on the window.
- Used for X and w32 frames; -1 initially. */
- int phys_cursor_type, phys_cursor_width;
+#ifdef HAVE_WINDOW_SYSTEM
+
+ /* Cursor type of last cursor drawn on the window. */
+ enum text_cursor_kinds phys_cursor_type;
+
+ /* Width of the cursor above. */
+ int phys_cursor_width;
/* This is handy for undrawing the cursor. */
int phys_cursor_ascent, phys_cursor_height;
+#endif /* HAVE_WINDOW_SYSTEM */
+
/* Width of left and right fringes, in pixels.
A value of -1 means use frame values. */
int left_fringe_width;
int header_line_height;
/* Z - the buffer position of the last glyph in the current
- matrix of W. Only valid if window_end_valid is nonzero. */
+ matrix of W. Only valid if window_end_valid is true. */
ptrdiff_t window_end_pos;
/* Glyph matrix row of the last glyph in the current matrix
- of W. Only valid if window_end_valid is nonzero. */
+ of W. Only valid if window_end_valid is true. */
int window_end_vpos;
- /* Non-zero if this window is a minibuffer window. */
- unsigned mini : 1;
+ /* True if this window is a minibuffer window. */
+ bool_bf mini : 1;
/* Meaningful only if contents is a window, non-zero if this
internal window is used in horizontal combination. */
- unsigned horizontal : 1;
+ bool_bf horizontal : 1;
- /* Non-zero means must regenerate mode line of this window. */
- unsigned update_mode_line : 1;
+ /* True means must regenerate mode line of this window. */
+ bool_bf update_mode_line : 1;
- /* Non-nil if the buffer was "modified" when the window
+ /* True if the buffer was "modified" when the window
was last updated. */
- unsigned last_had_star : 1;
+ bool_bf last_had_star : 1;
- /* Non-zero means current value of `start'
+ /* True means current value of `start'
was the beginning of a line when it was chosen. */
- unsigned start_at_line_beg : 1;
+ bool_bf start_at_line_beg : 1;
- /* Non-zero means next redisplay must use the value of start
+ /* True means next redisplay must use the value of start
set up for it in advance. Set by scrolling commands. */
- unsigned force_start : 1;
+ bool_bf force_start : 1;
- /* Non-zero means we have explicitly changed the value of start,
+ /* True 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;
+ bool_bf optional_new_start : 1;
- /* Non-zero means the cursor is currently displayed. This can be
+ /* True means the cursor is currently displayed. This can be
set to zero by functions overpainting the cursor image. */
- unsigned phys_cursor_on_p : 1;
+ bool_bf phys_cursor_on_p : 1;
- /* 0 means cursor is logically on, 1 means it's off. Used for
+ /* False means cursor is logically on, true means it's off. Used for
blinking cursor. */
- unsigned cursor_off_p : 1;
+ bool_bf cursor_off_p : 1;
/* Value of cursor_off_p as of the last redisplay. */
- unsigned last_cursor_off_p : 1;
+ bool_bf last_cursor_off_p : 1;
- /* 1 means desired matrix has been build and window must be
+ /* True means desired matrix has been build and window must be
updated in update_frame. */
- unsigned must_be_updated_p : 1;
+ 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. */
- unsigned pseudo_window_p : 1;
+ bool_bf pseudo_window_p : 1;
- /* Non-zero means fringes are drawn outside display margins.
+ /* True means fringes are drawn outside display margins.
Otherwise draw them between margin areas and text. */
- unsigned fringes_outside_margins : 1;
+ bool_bf fringes_outside_margins : 1;
- /* Nonzero if window_end_pos and window_end_vpos are truly valid.
- This is zero if nontrivial redisplay is preempted since in that case
+ /* 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. */
- unsigned window_end_valid : 1;
+ bool_bf window_end_valid : 1;
+
+ /* True if it needs to be redisplayed. */
+ bool_bf redisplay : 1;
/* Amount by which lines of this window are scrolled in
y-direction (smooth scrolling). */
int vscroll;
- /* If we have highlighted the region (or any part of it), the mark
- (region start) position; otherwise zero. */
- ptrdiff_t region_showing;
-
/* 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 nonzero. */
+ Should be nonnegative, and only valid if window_end_valid is true. */
ptrdiff_t window_end_bytepos;
-};
+ };
/* Most code should use these functions to set Lisp fields in struct
window. */
-WINDOW_INLINE void
+INLINE void
wset_frame (struct window *w, Lisp_Object val)
{
w->frame = val;
}
-WINDOW_INLINE void
+
+INLINE void
wset_next (struct window *w, Lisp_Object val)
{
w->next = val;
}
-WINDOW_INLINE void
+
+INLINE void
wset_prev (struct window *w, Lisp_Object val)
{
w->prev = val;
}
-WINDOW_INLINE void
+
+INLINE void
wset_redisplay_end_trigger (struct window *w, Lisp_Object val)
{
w->redisplay_end_trigger = val;
}
-WINDOW_INLINE void
+
+INLINE void
+wset_new_pixel (struct window *w, Lisp_Object val)
+{
+ w->new_pixel = val;
+}
+
+INLINE void
wset_vertical_scroll_bar (struct window *w, Lisp_Object val)
{
w->vertical_scroll_bar = val;
}
-WINDOW_INLINE void
+
+INLINE void
wset_prev_buffers (struct window *w, Lisp_Object val)
{
w->prev_buffers = val;
}
-WINDOW_INLINE void
+
+INLINE void
wset_next_buffers (struct window *w, Lisp_Object val)
{
w->next_buffers = val;
}
-/* 1 if W is a minibuffer window. */
+/* True if W is a minibuffer window. */
#define MINI_WINDOW_P(W) ((W)->mini)
/* A handy macro. */
-/* Non-zero if W is leaf (carry the buffer). */
+/* Non-nil if W is leaf (carry the buffer). */
#define WINDOW_LEAF_P(W) \
(BUFFERP ((W)->contents))
-/* Non-zero if W is a member of horizontal combination. */
+/* True if W is a member of horizontal combination. */
#define WINDOW_HORIZONTAL_COMBINATION_P(W) \
(WINDOWP ((W)->contents) && (W)->horizontal)
-/* Non-zero if W is a member of vertical combination. */
+/* True if W is a member of vertical combination. */
#define WINDOW_VERTICAL_COMBINATION_P(W) \
(WINDOWP ((W)->contents) && !(W)->horizontal)
#define WINDOW_FRAME_LINE_HEIGHT(W) \
(FRAME_LINE_HEIGHT (WINDOW_XFRAME ((W))))
-/* Return the width of window W in canonical column units.
+/* Return the pixel width of window W.
This includes scroll bars and fringes. */
+#define WINDOW_PIXEL_WIDTH(W) (W)->pixel_width
+
+/* Return the pixel height of window W.
+ This includes header and mode lines, if any. */
+#define WINDOW_PIXEL_HEIGHT(W) (W)->pixel_height
+/* Return the width of window W in canonical column units.
+ This includes scroll bars and fringes.
+ This value is adjusted such that the sum of the widths of all child
+ windows equals the width of their parent window. */
#define WINDOW_TOTAL_COLS(W) (W)->total_cols
/* Return the height of window W in canonical line units.
- This includes header and mode lines, if any. */
-
+ This includes header and mode lines, if any.
+ This value is adjusted such that the sum of the heights of all child
+ windows equals the height of their parent window. */
#define WINDOW_TOTAL_LINES(W) (W)->total_lines
-/* Return the total pixel width of window W. */
-
-#define WINDOW_TOTAL_WIDTH(W) \
- (WINDOW_TOTAL_COLS (W) * WINDOW_FRAME_COLUMN_WIDTH (W))
-
-/* Return the total pixel height of window W. */
-
-#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_PIXEL_WIDTH(W) \
+ (2 * WINDOW_FRAME_COLUMN_WIDTH (W))
-#define MIN_SAFE_WINDOW_WIDTH (2)
#define MIN_SAFE_WINDOW_HEIGHT (1)
+#define MIN_SAFE_WINDOW_PIXEL_HEIGHT(W) \
+ (WINDOW_FRAME_LINE_HEIGHT (W))
+
+/* Width of right divider of window W. */
+#define WINDOW_RIGHT_DIVIDER_WIDTH(W) \
+ ((WINDOW_RIGHTMOST_P (W) || MINI_WINDOW_P (W)) \
+ ? 0 \
+ : FRAME_RIGHT_DIVIDER_WIDTH (WINDOW_XFRAME (W)))
+
/* Return the canonical frame column at which window W starts.
This includes a left-hand scroll bar, if any. */
#define WINDOW_BOTTOM_EDGE_LINE(W) \
(WINDOW_TOP_EDGE_LINE (W) + WINDOW_TOTAL_LINES (W))
+/* Return the left pixel edge at which window W starts.
+ This includes a left-hand scroll bar, if any. */
+#define WINDOW_LEFT_PIXEL_EDGE(W) (W)->pixel_left
+
+/* Return the right pixel edge before which window W ends.
+ This includes a right-hand scroll bar, if any. */
+#define WINDOW_RIGHT_PIXEL_EDGE(W) \
+ (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. */
+#define WINDOW_TOP_PIXEL_EDGE(W) (W)->pixel_top
+
+/* Return the bottom pixel edge before which window W ends.
+ This includes a mode line, if any. */
+#define WINDOW_BOTTOM_PIXEL_EDGE(W) \
+ (WINDOW_TOP_PIXEL_EDGE (W) + WINDOW_PIXEL_HEIGHT (W))
/* Return the frame x-position at which window W starts.
This includes a left-hand scroll bar, if any. */
#define WINDOW_LEFT_EDGE_X(W) \
(FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W)) \
- + WINDOW_LEFT_EDGE_COL (W) * WINDOW_FRAME_COLUMN_WIDTH (W))
+ + WINDOW_LEFT_PIXEL_EDGE (W))
/* Return the frame x- position before which window W ends.
This includes a right-hand scroll bar, if any. */
#define WINDOW_RIGHT_EDGE_X(W) \
(FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W)) \
- + WINDOW_RIGHT_EDGE_COL (W) * WINDOW_FRAME_COLUMN_WIDTH (W))
+ + WINDOW_RIGHT_PIXEL_EDGE (W))
-/* 1 if W is a menu bar window. */
+/* True if W is a menu bar window. */
#if defined (HAVE_X_WINDOWS) && ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK)
#define WINDOW_MENU_BAR_P(W) \
&& (W) == XWINDOW (WINDOW_XFRAME (W)->menu_bar_window))
#else
/* No menu bar windows if X toolkit is in use. */
-#define WINDOW_MENU_BAR_P(W) (0)
+#define WINDOW_MENU_BAR_P(W) false
#endif
-/* 1 if W is a tool bar window. */
+/* True if W is a tool bar window. */
#if defined (HAVE_WINDOW_SYSTEM) && ! defined (USE_GTK) && ! defined (HAVE_NS)
#define WINDOW_TOOL_BAR_P(W) \
(WINDOWP (WINDOW_XFRAME (W)->tool_bar_window) \
&& (W) == XWINDOW (WINDOW_XFRAME (W)->tool_bar_window))
#else
-#define WINDOW_TOOL_BAR_P(W) (0)
+#define WINDOW_TOOL_BAR_P(W) false
#endif
/* Return the frame y-position at which window W starts.
- This includes a header line, if any. */
+ This includes a header line, if any.
+ PXW: With a menu or tool bar this is not symmetric to the _X values
+ since it _does_ include the internal border width. */
#define WINDOW_TOP_EDGE_Y(W) \
(((WINDOW_MENU_BAR_P (W) || WINDOW_TOOL_BAR_P (W)) \
? 0 : FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W))) \
- + WINDOW_TOP_EDGE_LINE (W) * WINDOW_FRAME_LINE_HEIGHT (W))
+ + WINDOW_TOP_PIXEL_EDGE (W))
/* Return the frame y-position before which window W ends.
This includes a mode line, if any. */
-
-#define WINDOW_BOTTOM_EDGE_Y(W) \
- (((WINDOW_MENU_BAR_P (W) || WINDOW_TOOL_BAR_P (W)) \
+#define WINDOW_BOTTOM_EDGE_Y(W) \
+ (((WINDOW_MENU_BAR_P (W) || WINDOW_TOOL_BAR_P (W)) \
? 0 : FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W))) \
- + WINDOW_BOTTOM_EDGE_LINE (W) * WINDOW_FRAME_LINE_HEIGHT (W))
-
+ + WINDOW_BOTTOM_PIXEL_EDGE (W))
-/* 1 if window W takes up the full width of its frame. */
+/* 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)))))) \
-#define WINDOW_FULL_WIDTH_P(W) \
- (WINDOW_TOTAL_COLS (W) == FRAME_TOTAL_COLS (WINDOW_XFRAME (W)))
-
-/* 1 if window W's has no other windows to its left in its frame. */
+/* True if window W's has no other windows to its left in its frame. */
#define WINDOW_LEFTMOST_P(W) \
- (WINDOW_LEFT_EDGE_COL (W) == 0)
-
-/* 1 if window W's has no other windows to its right in its frame. */
+ (WINDOW_LEFT_PIXEL_EDGE (W) == 0)
-#define WINDOW_RIGHTMOST_P(W) \
- (WINDOW_RIGHT_EDGE_COL (W) == FRAME_TOTAL_COLS (WINDOW_XFRAME (W)))
+/* True if window W's has no other windows to its right in its frame. */
+#define WINDOW_RIGHTMOST_P(W) \
+ (WINDOW_RIGHT_PIXEL_EDGE (W) \
+ == (WINDOW_RIGHT_PIXEL_EDGE \
+ (XWINDOW (FRAME_ROOT_WINDOW (WINDOW_XFRAME (W)))))) \
+/* True if window W's has no other windows below it in its frame
+ (the minibuffer window is not counted in this respect). */
+#define WINDOW_BOTTOMMOST_P(W) \
+ (WINDOW_BOTTOM_PIXEL_EDGE (W) \
+ == (WINDOW_BOTTOM_PIXEL_EDGE \
+ (XWINDOW (FRAME_ROOT_WINDOW (WINDOW_XFRAME (W)))))) \
/* Return the frame column at which the text (or left fringe) in
window W starts. This is different from the `LEFT_EDGE' because it
(WINDOW_LEFT_EDGE_COL (W) \
+ WINDOW_LEFT_SCROLL_BAR_COLS (W))
+/* Return the pixel value where the text (or left fringe) in
+ window W starts. This is different from the `LEFT_EDGE' because it
+ does not include a left-hand scroll bar if any. */
+#define WINDOW_BOX_LEFT_PIXEL_EDGE(W) \
+ (WINDOW_LEFT_PIXEL_EDGE (W) \
+ + WINDOW_LEFT_SCROLL_BAR_AREA_WIDTH (W))
+
/* Return the window column before which the text in window W ends.
This is different from WINDOW_RIGHT_EDGE_COL because it does not
include a scroll bar or window-separating line on the right edge. */
(WINDOW_RIGHT_EDGE_COL (W) \
- WINDOW_RIGHT_SCROLL_BAR_COLS (W))
+/* Return the pixel value before which the text in window W ends. This
+ is different from the `RIGHT_EDGE' because it does not include a
+ right-hand scroll bar or window-separating line on the right
+ edge. */
+#define WINDOW_BOX_RIGHT_PIXEL_EDGE(W) \
+ (WINDOW_RIGHT_PIXEL_EDGE (W) \
+ - WINDOW_RIGHT_DIVIDER_WIDTH (W) \
+ - WINDOW_RIGHT_SCROLL_BAR_AREA_WIDTH (W))
/* Return the frame position at which the text (or left fringe) in
window W starts. This is different from the `LEFT_EDGE' because it
does not include a left-hand scroll bar if any. */
-
-#define WINDOW_BOX_LEFT_EDGE_X(W) \
+#define WINDOW_BOX_LEFT_EDGE_X(W) \
(FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W)) \
- + WINDOW_BOX_LEFT_EDGE_COL (W) * WINDOW_FRAME_COLUMN_WIDTH (W))
+ + WINDOW_BOX_LEFT_PIXEL_EDGE (W))
/* Return the window column before which the text in window W ends.
This is different from WINDOW_RIGHT_EDGE_COL because it does not
include a scroll bar or window-separating line on the right edge. */
-
-#define WINDOW_BOX_RIGHT_EDGE_X(W) \
+#define WINDOW_BOX_RIGHT_EDGE_X(W) \
(FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W)) \
- + WINDOW_BOX_RIGHT_EDGE_COL (W) * WINDOW_FRAME_COLUMN_WIDTH (W))
-
-
-/* Width of left margin area in columns. */
+ + WINDOW_BOX_RIGHT_PIXEL_EDGE (W))
+/* Widths of marginal areas in columns. */
#define WINDOW_LEFT_MARGIN_COLS(W) (W->left_margin_cols)
-/* Width of right marginal area in columns. */
-
#define WINDOW_RIGHT_MARGIN_COLS(W) (W->right_margin_cols)
-/* Width of left margin area in pixels. */
+#define WINDOW_MARGINS_COLS(W) \
+ (WINDOW_LEFT_MARGIN_COLS (W) \
+ + WINDOW_RIGHT_MARGIN_COLS (W))
+/* Widths of marginal areas in pixels. */
#define WINDOW_LEFT_MARGIN_WIDTH(W) \
(W->left_margin_cols * WINDOW_FRAME_COLUMN_WIDTH (W))
-/* Width of right marginal area in pixels. */
-
-#define WINDOW_RIGHT_MARGIN_WIDTH(W) \
+#define WINDOW_RIGHT_MARGIN_WIDTH(W) \
(W->right_margin_cols * WINDOW_FRAME_COLUMN_WIDTH (W))
-/* Total width of fringes reserved for drawing truncation bitmaps,
- continuation bitmaps and alike. The width is in canonical char
- units of the frame. This must currently be the case because window
- sizes aren't pixel values. If it weren't the case, we wouldn't be
- able to split windows horizontally nicely. */
+#define WINDOW_MARGINS_WIDTH(W) \
+ (WINDOW_LEFT_MARGIN_WIDTH (W) \
+ + WINDOW_RIGHT_MARGIN_WIDTH (W))
+
+/* Pixel-widths of fringes. */
+#define WINDOW_LEFT_FRINGE_WIDTH(W) \
+ (W->left_fringe_width >= 0 \
+ ? W->left_fringe_width \
+ : FRAME_LEFT_FRINGE_WIDTH (WINDOW_XFRAME (W)))
+
+#define WINDOW_RIGHT_FRINGE_WIDTH(W) \
+ (W->right_fringe_width >= 0 \
+ ? W->right_fringe_width \
+ : FRAME_RIGHT_FRINGE_WIDTH (WINDOW_XFRAME (W)))
+#define WINDOW_FRINGES_WIDTH(W) \
+ (WINDOW_LEFT_FRINGE_WIDTH (W) + WINDOW_RIGHT_FRINGE_WIDTH (W))
+
+/* Widths of fringes in columns. */
#define WINDOW_FRINGE_COLS(W) \
((W->left_fringe_width >= 0 \
&& W->right_fringe_width >= 0) \
- ? ((W->left_fringe_width \
- + W->right_fringe_width \
+ ? ((WINDOW_FRINGES_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) \
+ 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) \
- (W->left_fringe_width >= 0 ? W->left_fringe_width \
- : FRAME_LEFT_FRINGE_WIDTH (WINDOW_XFRAME (W)))
-
-#define WINDOW_RIGHT_FRINGE_WIDTH(W) \
- (W->right_fringe_width >= 0 ? W->right_fringe_width \
- : FRAME_RIGHT_FRINGE_WIDTH (WINDOW_XFRAME (W)))
-
-/* Total width of fringes in pixels. */
-
-#define WINDOW_TOTAL_FRINGE_WIDTH(W) \
- (WINDOW_LEFT_FRINGE_WIDTH (W) + WINDOW_RIGHT_FRINGE_WIDTH (W))
-
/* Are fringes outside display margins in window W. */
-
#define WINDOW_HAS_FRINGES_OUTSIDE_MARGINS(W) \
((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) \
? FRAME_VERTICAL_SCROLL_BAR_TYPE (WINDOW_XFRAME (w)) \
/* 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) \
- (w->scroll_bar_width >= 0 ? w->scroll_bar_width \
+ (w->scroll_bar_width >= 0 \
+ ? 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.
Measured in columns (characters). If scroll bars are turned off,
this is still nonzero. */
-
#define WINDOW_CONFIG_SCROLL_BAR_COLS(w) \
(w->scroll_bar_width >= 0 \
? ((w->scroll_bar_width \
/ WINDOW_FRAME_COLUMN_WIDTH (w)) \
: FRAME_CONFIG_SCROLL_BAR_COLS (WINDOW_XFRAME (w)))
-/* Width of a scroll bar in window W, measured in columns (characters),
- but only if scroll bars are on the left. If scroll bars are on
- the right in this frame, or there are no scroll bars, value is 0. */
-
+/* Width of left scroll bar in window W, measured in columns
+ (characters). If scroll bars are on 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_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) \
- ? (WINDOW_CONFIG_SCROLL_BAR_COLS (w) * WINDOW_FRAME_COLUMN_WIDTH (w)) \
- : 0)
-
-/* Width of a scroll bar in window W, measured in columns (characters),
- but only if scroll bars are on the right. If scroll bars are on
- the left in this frame, or there are no scroll bars, value is 0. */
-
+/* Width of right scroll bar in window W, measured in columns
+ (characters). If scroll bars are on 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_CONFIG_SCROLL_BAR_COLS (w) \
: 0)
-/* Width of a left scroll bar area in window W , measured in pixels. */
-
-#define WINDOW_RIGHT_SCROLL_BAR_AREA_WIDTH(w) \
- (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (w) \
- ? (WINDOW_CONFIG_SCROLL_BAR_COLS (w) * WINDOW_FRAME_COLUMN_WIDTH (w)) \
- : 0)
-
-
-/* Actual width of a scroll bar in window W, measured in columns. */
-
+/* Width of a scroll bar in window W, measured in columns. */
#define WINDOW_SCROLL_BAR_COLS(w) \
(WINDOW_HAS_VERTICAL_SCROLL_BAR (w) \
? WINDOW_CONFIG_SCROLL_BAR_COLS (w) \
: 0)
-/* Width of a left scroll bar area in window W , measured in pixels. */
+/* 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) \
+ ? WINDOW_CONFIG_SCROLL_BAR_WIDTH (w) \
+ : 0)
-#define WINDOW_SCROLL_BAR_AREA_WIDTH(w) \
- (WINDOW_HAS_VERTICAL_SCROLL_BAR (w) \
- ? (WINDOW_CONFIG_SCROLL_BAR_COLS (w) * WINDOW_FRAME_COLUMN_WIDTH (w)) \
+/* Width of a right scroll bar area in window W, measured in pixels. */
+#define WINDOW_RIGHT_SCROLL_BAR_AREA_WIDTH(w) \
+ (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (w) \
+ ? WINDOW_CONFIG_SCROLL_BAR_WIDTH (w) \
: 0)
+/* Width of scroll bar area in window W, measured in pixels. */
+#define WINDOW_SCROLL_BAR_AREA_WIDTH(w) \
+ (WINDOW_HAS_VERTICAL_SCROLL_BAR (w) \
+ ? WINDOW_CONFIG_SCROLL_BAR_WIDTH (w) \
+ : 0)
/* Return the frame position where the scroll bar of window W starts. */
-
#define WINDOW_SCROLL_BAR_AREA_X(W) \
(WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (W) \
? WINDOW_BOX_RIGHT_EDGE_X (W) \
: WINDOW_LEFT_EDGE_X (W))
+/* Width of bottom divider of window W. */
+#define WINDOW_BOTTOM_DIVIDER_WIDTH(W) \
+ (((WINDOW_BOTTOMMOST_P (W) \
+ && NILP ((XWINDOW (FRAME_ROOT_WINDOW \
+ (WINDOW_XFRAME (W))))->next)) \
+ || EQ ((W)->prev, FRAME_ROOT_WINDOW (WINDOW_XFRAME (W))) \
+ || (W)->pseudo_window_p) \
+ ? 0 \
+ : FRAME_BOTTOM_DIVIDER_WIDTH (WINDOW_XFRAME (W)))
/* Height in pixels, and in lines, of the mode line.
May be zero if W doesn't have a mode line. */
-
#define WINDOW_MODE_LINE_HEIGHT(W) \
(WINDOW_WANTS_MODELINE_P ((W)) \
? CURRENT_MODE_LINE_HEIGHT (W) \
/* Height in pixels, and in lines, of the header line.
Zero if W doesn't have a header line. */
-
#define WINDOW_HEADER_LINE_HEIGHT(W) \
(WINDOW_WANTS_HEADER_LINE_P ((W)) \
? CURRENT_HEADER_LINE_HEIGHT (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 line and bottom divider. */
#define WINDOW_BOX_HEIGHT_NO_MODE_LINE(W) \
- (WINDOW_TOTAL_HEIGHT ((W)) \
+ (WINDOW_PIXEL_HEIGHT ((W)) \
+ - WINDOW_BOTTOM_DIVIDER_WIDTH (W) \
- WINDOW_MODE_LINE_HEIGHT ((W)))
-/* Pixel height of window W without mode and header line. */
-
+/* Pixel height of window W without mode and header line and bottom
+ divider. */
#define WINDOW_BOX_TEXT_HEIGHT(W) \
- (WINDOW_TOTAL_HEIGHT ((W)) \
+ (WINDOW_PIXEL_HEIGHT ((W)) \
+ - WINDOW_BOTTOM_DIVIDER_WIDTH (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) \
((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) \
((Y) + WINDOW_TOP_EDGE_Y ((W)))
/* Convert frame relative pixel X to window relative pixel 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) \
((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) \
(window_box_left ((W), TEXT_AREA) + (X))
-/* Nonzero if the background of the window W's fringe that is adjacent to
+/* True if the background of the window W's fringe that is adjacent to
a scroll bar is extended to the gap between the fringe and the bar. */
#define WINDOW_FRINGE_EXTENDED_P(w) \
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);
+extern void resize_frame_windows (struct frame *, int, bool, bool);
extern void restore_window_configuration (Lisp_Object);
extern void delete_all_child_windows (Lisp_Object);
-extern void grow_mini_window (struct window *, int);
-extern void shrink_mini_window (struct window *);
+extern void grow_mini_window (struct window *, int, bool);
+extern void shrink_mini_window (struct window *, bool);
extern int window_relative_x_coord (struct window *, enum window_part, int);
void run_window_configuration_change_hook (struct frame *f);
-/* Make WINDOW display BUFFER as its contents. RUN_HOOKS_P non-zero
- means it's allowed to run hooks. See make_frame for a case where
- it's not allowed. */
+/* Make WINDOW display BUFFER. RUN_HOOKS_P non-zero means it's allowed
+ to run hooks. See make_frame for a case where it's not allowed. */
void set_window_buffer (Lisp_Object window, Lisp_Object buffer,
bool run_hooks_p, bool keep_margins_p);
extern EMACS_INT minibuf_level;
-/* true if we should redraw the mode lines on the next redisplay. */
+/* 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'. */
extern int update_mode_lines;
/* Nonzero if window sizes or contents have changed since last
- redisplay that finished. */
+ redisplay that finished. Usually set to a unique small integer so
+ we can track the main causes of full redisplays in
+ `redisplay--all-windows-cause'. */
extern int windows_or_buffers_changed;
+/* The main redisplay routine usually only redisplays the selected-window,
+ so when something's changed elsewhere, we call one of the functions below
+ to indicate which other windows might also need to be redisplayed. */
+
+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);
+/* 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. */
+extern void redisplay_other_windows (void);
+
/* If *ROWS or *COLS are too small a size for FRAME, set them to the
minimum allowable size. */
-extern void check_frame_size (struct frame *frame, int *rows, int *cols);
+extern void check_frame_size (struct frame *frame, int *width, int *height, bool pixelwise);
/* 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 meaningful glyph
extern Lisp_Object Qwindow_live_p;
extern Lisp_Object Vwindow_list;
+extern Lisp_Object window_list (void);
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);
+extern int window_body_width (struct window *w, bool);
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);
window update, so the position is the future output cursor position
for currently updated window W. */
-WINDOW_INLINE void
+INLINE void
output_cursor_to (struct window *w, int vpos, int hpos, int y, int x)
{
eassert (w);