window.h 43.6 KB
Newer Older
Jim Blandy's avatar
Jim Blandy committed
1
/* Window definitions for GNU Emacs.
Paul Eggert's avatar
Paul Eggert committed
2
   Copyright (C) 1985-1986, 1993, 1995, 1997-2020 Free Software
3
   Foundation, Inc.
Jim Blandy's avatar
Jim Blandy committed
4 5 6

This file is part of GNU Emacs.

7
GNU Emacs is free software: you can redistribute it and/or modify
Jim Blandy's avatar
Jim Blandy committed
8
it under the terms of the GNU General Public License as published by
9 10
the Free Software Foundation, either version 3 of the License, or (at
your option) any later version.
Jim Blandy's avatar
Jim Blandy committed
11 12 13 14 15 16 17

GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
18
along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
Jim Blandy's avatar
Jim Blandy committed
19

Gerd Moellmann's avatar
Gerd Moellmann committed
20 21 22 23
#ifndef WINDOW_H_INCLUDED
#define WINDOW_H_INCLUDED

#include "dispextern.h"
Jim Blandy's avatar
Jim Blandy committed
24

Paul Eggert's avatar
Paul Eggert committed
25 26
INLINE_HEADER_BEGIN

27 28 29
/* 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.
Jim Blandy's avatar
Jim Blandy committed
30 31 32

All windows in use are arranged into a tree, with pointers up and down.

33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
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).  */
Jim Blandy's avatar
Jim Blandy committed
90

Gerd Moellmann's avatar
Gerd Moellmann committed
91 92 93 94 95 96 97 98 99
struct cursor_pos
{
  /* Pixel position.  These are always window relative.  */
  int x, y;

  /* Glyph matrix position.  */
  int hpos, vpos;
};

Jim Blandy's avatar
Jim Blandy committed
100 101
struct window
  {
102
    /* This is for Lisp; the terminal code does not refer to it.  */
103
    union vectorlike_header header;
104

Jim Blandy's avatar
Jim Blandy committed
105
    /* The frame this window is on.  */
106
    Lisp_Object frame;
107

108 109
    /* Following (to right or down) and preceding (to left or up)
       child at same level of tree.  Whether this is left/right or
110 111 112 113 114 115 116 117
       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.  */
118 119
    Lisp_Object next;
    Lisp_Object prev;
120

121 122
    /* The window this one is a child of.  For the root and a
       minibuffer window this is always nil.  */
123
    Lisp_Object parent;
124

125 126 127
    /* 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.  */
128 129
    Lisp_Object normal_lines;
    Lisp_Object normal_cols;
130

131 132 133
    /* 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.  */
134 135
    Lisp_Object new_total;
    Lisp_Object new_normal;
136
    Lisp_Object new_pixel;
137

138 139 140 141 142
    /* 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.  */
143
    Lisp_Object contents;
144

145 146 147 148 149
    /* 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;

150 151 152 153
    /* A marker pointing to where in the text to start displaying.
       BIDI Note: This is the _logical-order_ start, i.e. the smallest
       buffer position visible in the window, not necessarily the
       character displayed in the top left corner of the window.  */
154
    Lisp_Object start;
155

Jim Blandy's avatar
Jim Blandy committed
156 157 158 159
    /* A marker pointing to where in the text point is in this window,
       used only when the window is not selected.
       This exists so that when multiple windows show one buffer
       each one can have its own value of point.  */
160
    Lisp_Object pointm;
161

162 163 164 165 166
    /* A marker pointing to where in the text point was in this window
       at the time of last redisplay.  The value is saved for the
       selected window too.  */
    Lisp_Object old_pointm;

167 168
    /* No permanent meaning; used by save-window-excursion's
       bookkeeping.  */
169
    Lisp_Object temslot;
170

171 172 173 174 175
    /* This window's vertical scroll bar.  This field is only for use by
       the window-system-dependent code which implements the scroll
       bars; it can store anything it likes here.  If this window is
       newly created and we haven't displayed a scroll bar in it yet, or
       if the frame doesn't have any scroll bars, this is nil.  */
176
    Lisp_Object vertical_scroll_bar;
177

178 179
    /* Type of vertical scroll bar.  A value of nil means
       no scroll bar.  A value of t means use frame value.  */
180
    Lisp_Object vertical_scroll_bar_type;
Gerd Moellmann's avatar
Gerd Moellmann committed
181

182 183 184 185 186 187 188 189 190 191 192
    /* This window's horizontal scroll bar.  This field is only for use
       by the window-system-dependent code which implements the scroll
       bars; it can store anything it likes here.  If this window is
       newly created and we haven't displayed a scroll bar in it yet, or
       if the frame doesn't have any scroll bars, this is nil.  */
    Lisp_Object horizontal_scroll_bar;

    /* Type of horizontal scroll bar.  A value of nil means
       no scroll bar.  A value of t means use frame value.  */
    Lisp_Object horizontal_scroll_bar_type;

Jim Blandy's avatar
Jim Blandy committed
193 194
    /* Display-table to use for displaying chars in this window.
       Nil means use the buffer's own display-table.  */
195
    Lisp_Object display_table;
196

197 198 199
    /* 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.  */
200
    Lisp_Object dedicated;
201

202 203
    /* If redisplay in this window goes beyond this buffer position,
       must run the redisplay-end-trigger-hook.  */
204
    Lisp_Object redisplay_end_trigger;
205

206
    /* t means this window's child windows are not (re-)combined.  */
207
    Lisp_Object combination_limit;
208

Paul Eggert's avatar
Paul Eggert committed
209
    /* An alist with parameters.  */
210
    Lisp_Object window_parameters;
211

212 213 214
    /* The help echo text for this window.  Qnil if there's none.  */
    Lisp_Object mode_line_help_echo;

215 216
    /* No Lisp data may follow this point; mode_line_help_echo must be
       the last Lisp member.  */
Gerd Moellmann's avatar
Gerd Moellmann committed
217 218 219 220 221

    /* Glyph matrices.  */
    struct glyph_matrix *current_matrix;
    struct glyph_matrix *desired_matrix;

222 223
    /* The two Lisp_Object fields below are marked in a special way,
       which is why they're placed after `current_matrix'.  */
224
    /* A list of <buffer, window-start, window-point> triples listing
225 226 227 228 229
       buffers previously shown in this window.  */
    Lisp_Object prev_buffers;
    /* List of buffers re-shown in this window.  */
    Lisp_Object next_buffers;

230
    /* Number saying how recently window was selected.  */
231
    EMACS_INT use_time;
232

233
    /* Unique number of window assigned when it was created.  */
234
    EMACS_INT sequence_number;
235

236 237 238 239 240 241 242 243
    /* 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;

244 245 246 247 248
    /* 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;

249 250 251 252 253
    /* The upper left corner coordinates of this window,
       relative to upper left corner of frame = 0, 0.  */
    int left_col;
    int top_line;

254 255 256 257
    /* The pixel size of the window.  */
    int pixel_width;
    int pixel_height;

258 259 260 261 262 263 264
    /* 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;
265

266 267
    /* The size of the window.  */
    int total_cols;
268
    int total_lines;
269

270
    /* Number of columns display within the window is scrolled to the left.  */
271
    ptrdiff_t hscroll;
272 273 274

    /* Minimum hscroll for automatic hscrolling.  This is the value
       the user has set, by set-window-hscroll for example.  */
275
    ptrdiff_t min_hscroll;
276

277 278 279 280
    /* Maximum line length in pixels within window bound by size of
       window (set up by set_horizontal_scroll_bar).  */
    ptrdiff_t hscroll_whole;

281 282
    /* Displayed buffer's text modification events counter as of last time
       display completed.  */
283
    modiff_count last_modified;
284 285 286

    /* Displayed buffer's overlays modification events counter as of last
       complete update.  */
287
    modiff_count last_overlay_modified;
288 289

    /* Value of point at that time.  Since this is a position in a buffer,
290
       it should be positive.  */
291 292
    ptrdiff_t last_point;

293 294 295 296 297 298 299 300 301 302 303 304 305
    /* Line number and position of a line somewhere above the top of the
       screen.  If this field is zero, it means we don't have a base line.  */
    ptrdiff_t base_line_number;

    /* If this field is zero, it means we don't have a base line.
       If it is -1, it means don't display the line number as long
       as the window shows its buffer.  */
    ptrdiff_t base_line_pos;

    /* The column number currently displayed in this window's mode
       line, or -1 if column numbers are not being displayed.  */
    ptrdiff_t column_number_displayed;

306 307
    /* Scaling factor for the glyph_matrix size calculation in this window.
       Used if window contains many small images or uses proportional fonts,
Paul Eggert's avatar
Paul Eggert committed
308
       as the normal may yield a matrix which is too small.  */
309 310
    int nrows_scale_factor, ncols_scale_factor;

Gerd Moellmann's avatar
Gerd Moellmann committed
311 312 313
    /* Intended cursor position.   This is a position within the
       glyph matrix.  */
    struct cursor_pos cursor;
314

Gerd Moellmann's avatar
Gerd Moellmann committed
315 316
    /* Where the cursor actually is.  */
    struct cursor_pos phys_cursor;
317

318 319 320
    /* Internally used for redisplay purposes.  */
    struct cursor_pos output_cursor;

321 322 323 324
    /* Vertical cursor position as of last update that completed
       without pause.  This is the position of last_point.  */
    int last_cursor_vpos;

325 326 327 328 329 330 331
#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;
Gerd Moellmann's avatar
Gerd Moellmann committed
332 333 334

    /* This is handy for undrawing the cursor.  */
    int phys_cursor_ascent, phys_cursor_height;
335

336 337
#endif /* HAVE_WINDOW_SYSTEM */

338 339 340 341 342
    /* Width of left and right fringes, in pixels.
       A value of -1 means use frame values.  */
    int left_fringe_width;
    int right_fringe_width;

343 344 345 346
    /* Requested width of left and right marginal areas in columns.  A
       value of 0 means no margin.  The actual values are recorded in
       the window's glyph matrix, in the left_margin_glyphs and
       right_margin_glyphs members.  */
347 348 349
    int left_margin_cols;
    int right_margin_cols;

350 351 352 353
    /* Pixel width of scroll bars.
       A value of -1 means use frame values.  */
    int scroll_bar_width;

354 355 356 357
    /* Pixel height of scroll bars.
       A value of -1 means use frame values.  */
    int scroll_bar_height;

358 359 360 361 362 363
    /* Effective height of the mode line, or -1 if not known.  */
    int mode_line_height;

    /* Effective height of the header line, or -1 if not known.  */
    int header_line_height;

364 365 366
    /* Effective height of the tab line, or -1 if not known.  */
    int tab_line_height;

367
    /* Z - the buffer position of the last glyph in the current
368
       matrix of W.  Only valid if window_end_valid is true.  */
369 370 371
    ptrdiff_t window_end_pos;

    /* Glyph matrix row of the last glyph in the current matrix
372
       of W.  Only valid if window_end_valid is true.  */
373 374
    int window_end_vpos;

375 376
    /* True if this window is a minibuffer window.  */
    bool_bf mini : 1;
377

378 379 380
    /* Meaningful for internal windows only: true if this window is a
       horizontal combination, false if it is a vertical
       combination.  */
381
    bool_bf horizontal : 1;
382

383 384
    /* True means must regenerate mode line of this window.  */
    bool_bf update_mode_line : 1;
385

386
    /* True if the buffer was "modified" when the window
387
       was last updated.  */
388
    bool_bf last_had_star : 1;
389

390
    /* True means current value of `start'
391
       was the beginning of a line when it was chosen.  */
392
    bool_bf start_at_line_beg : 1;
393

394
    /* True means next redisplay must use the value of start
395
       set up for it in advance.  Set by scrolling commands.  */
396
    bool_bf force_start : 1;
397

398
    /* True means we have explicitly changed the value of start,
399 400 401
       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.  */
402
    bool_bf optional_new_start : 1;
403

404
    /* True means the cursor is currently displayed.  This can be
Gerd Moellmann's avatar
Gerd Moellmann committed
405
       set to zero by functions overpainting the cursor image.  */
406
    bool_bf phys_cursor_on_p : 1;
Gerd Moellmann's avatar
Gerd Moellmann committed
407

408
    /* False means cursor is logically on, true means it's off.  Used for
Gerd Moellmann's avatar
Gerd Moellmann committed
409
       blinking cursor.  */
410
    bool_bf cursor_off_p : 1;
Gerd Moellmann's avatar
Gerd Moellmann committed
411 412

    /* Value of cursor_off_p as of the last redisplay.  */
413
    bool_bf last_cursor_off_p : 1;
Gerd Moellmann's avatar
Gerd Moellmann committed
414

415
    /* True means desired matrix has been build and window must be
Gerd Moellmann's avatar
Gerd Moellmann committed
416
       updated in update_frame.  */
417
    bool_bf must_be_updated_p : 1;
Gerd Moellmann's avatar
Gerd Moellmann committed
418 419

    /* Flag indicating that this window is not a real one.
420 421
       Currently only used for menu bar windows, for tool bar windows,
       and for tooltips.  */
422
    bool_bf pseudo_window_p : 1;
Gerd Moellmann's avatar
Gerd Moellmann committed
423

424
    /* True means fringes are drawn outside display margins.
425
       Otherwise draw them between margin areas and text.  */
426
    bool_bf fringes_outside_margins : 1;
427

428 429 430 431
    /* True if this window's fringe specifications are persistent,
       i.e., always survive Fset_window_buffer.  */
    bool_bf fringes_persistent : 1;

Paul Eggert's avatar
Paul Eggert committed
432
    /* True if this window's scroll bar specifications are persistent,
433 434 435
       i.e., always survive Fset_window_buffer.  */
    bool_bf scroll_bars_persistent : 1;

436 437
    /* True if window_end_pos and window_end_vpos are truly valid.
       This is false if nontrivial redisplay is preempted since in that case
438
       the frame image that window_end_pos did not get onto the frame.  */
439
    bool_bf window_end_valid : 1;
440 441

    /* True if it needs to be redisplayed.  */
442
    bool_bf redisplay : 1;
443

444 445 446 447
    /* True if auto hscrolling is currently suspended in this
       window.  */
    bool_bf suspend_auto_hscroll : 1;

Gerd Moellmann's avatar
Gerd Moellmann committed
448 449 450
    /* Amount by which lines of this window are scrolled in
       y-direction (smooth scrolling).  */
    int vscroll;
451

452
    /* Z_BYTE - buffer position of the last glyph in the current matrix of W.
453
       Should be nonnegative, and only valid if window_end_valid is true.  */
454
    ptrdiff_t window_end_bytepos;
Paul Eggert's avatar
Paul Eggert committed
455
  } GCALIGNED_STRUCT;
Jim Blandy's avatar
Jim Blandy committed
456

457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472
INLINE bool
WINDOWP (Lisp_Object a)
{
  return PSEUDOVECTORP (a, PVEC_WINDOW);
}

INLINE void
CHECK_WINDOW (Lisp_Object x)
{
  CHECK_TYPE (WINDOWP (x), Qwindowp, x);
}

INLINE struct window *
XWINDOW (Lisp_Object a)
{
  eassert (WINDOWP (a));
473
  return XUNTAG (a, Lisp_Vectorlike, struct window);
474 475
}

Paul Eggert's avatar
Paul Eggert committed
476 477
/* Most code should use these functions to set Lisp fields in struct
   window.  */
Paul Eggert's avatar
Paul Eggert committed
478
INLINE void
Paul Eggert's avatar
Paul Eggert committed
479 480 481 482
wset_frame (struct window *w, Lisp_Object val)
{
  w->frame = val;
}
483

Paul Eggert's avatar
Paul Eggert committed
484
INLINE void
Paul Eggert's avatar
Paul Eggert committed
485 486 487 488
wset_next (struct window *w, Lisp_Object val)
{
  w->next = val;
}
489

Paul Eggert's avatar
Paul Eggert committed
490
INLINE void
Paul Eggert's avatar
Paul Eggert committed
491 492 493 494
wset_prev (struct window *w, Lisp_Object val)
{
  w->prev = val;
}
495

Paul Eggert's avatar
Paul Eggert committed
496
INLINE void
Paul Eggert's avatar
Paul Eggert committed
497 498 499 500
wset_redisplay_end_trigger (struct window *w, Lisp_Object val)
{
  w->redisplay_end_trigger = val;
}
501

502 503 504 505 506 507
INLINE void
wset_mode_line_help_echo (struct window *w, Lisp_Object val)
{
  w->mode_line_help_echo = val;
}

508 509 510 511 512 513
INLINE void
wset_new_pixel (struct window *w, Lisp_Object val)
{
  w->new_pixel = val;
}

Paul Eggert's avatar
Paul Eggert committed
514
INLINE void
Paul Eggert's avatar
Paul Eggert committed
515 516 517 518
wset_vertical_scroll_bar (struct window *w, Lisp_Object val)
{
  w->vertical_scroll_bar = val;
}
519

520 521 522 523 524 525 526 527 528 529 530 531
INLINE void
wset_horizontal_scroll_bar (struct window *w, Lisp_Object val)
{
  w->horizontal_scroll_bar = val;
}

INLINE void
wset_horizontal_scroll_bar_type (struct window *w, Lisp_Object val)
{
  w->horizontal_scroll_bar_type = val;
}

Paul Eggert's avatar
Paul Eggert committed
532
INLINE void
533 534 535 536
wset_prev_buffers (struct window *w, Lisp_Object val)
{
  w->prev_buffers = val;
}
537

Paul Eggert's avatar
Paul Eggert committed
538
INLINE void
539 540 541 542
wset_next_buffers (struct window *w, Lisp_Object val)
{
  w->next_buffers = val;
}
Paul Eggert's avatar
Paul Eggert committed
543

544
/* True if W is a minibuffer window.  */
545
#define MINI_WINDOW_P(W) ((W)->mini)
Jim Blandy's avatar
Jim Blandy committed
546

547 548 549 550
/* True if W is a minibuffer window on a frame that contains at least
   one other window.  */
#define MINI_NON_ONLY_WINDOW_P(W)	 \
  (MINI_WINDOW_P (W) && !NILP ((W)->prev))
551

552 553 554
/* True if W is a minibuffer window that is alone on its frame.  */
#define MINI_ONLY_WINDOW_P(W)		 \
  (MINI_WINDOW_P (W) && NILP ((W)->prev))
Jim Blandy's avatar
Jim Blandy committed
555

556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576
/* General window layout:

   LEFT_EDGE_COL         RIGHT_EDGE_COL
   |                                  |
   |                                  |
   |  BOX_LEFT_EDGE_COL               |
   |  |           BOX_RIGHT_EDGE_COL  |
   |  |                            |  |
   v  v                            v  v
   <-><-><---><-----------><---><-><->
    ^  ^   ^        ^        ^   ^  ^
    |  |   |        |        |   |  |
    |  |   |        |        |   |  +-- RIGHT_SCROLL_BAR_COLS
    |  |   |        |        |   +----- RIGHT_FRINGE_WIDTH
    |  |   |        |        +--------- RIGHT_MARGIN_COLS
    |  |   |        |
    |  |   |        +------------------ TEXT_AREA_COLS
    |  |   |
    |  |   +--------------------------- LEFT_MARGIN_COLS
    |  +------------------------------- LEFT_FRINGE_WIDTH
    +---------------------------------- LEFT_SCROLL_BAR_COLS
577

578 579 580 581 582
*/


/* A handy macro.  */

583
/* Non-nil if window W is leaf window (has a buffer).  */
584 585 586
#define WINDOW_LEAF_P(W) \
  (BUFFERP ((W)->contents))

587
/* Non-nil if window W is internal (is a parent window).  */
588 589
#define WINDOW_INTERNAL_P(W) \
  (WINDOWP ((W)->contents))
590

591
/* True if window W is a horizontal combination of windows.  */
592
#define WINDOW_HORIZONTAL_COMBINATION_P(W) \
593
  (WINDOW_INTERNAL_P (W) && (W)->horizontal)
594

595
/* True if window W is a vertical combination of windows.  */
596
#define WINDOW_VERTICAL_COMBINATION_P(W) \
597
  (WINDOW_INTERNAL_P (W) && !(W)->horizontal)
598

599
/* Window W's XFRAME.  */
600
#define WINDOW_XFRAME(W) (XFRAME (WINDOW_FRAME ((W))))
601

602
/* Whether window W is a pseudo window.  */
603
#define WINDOW_PSEUDO_P(W) ((W)->pseudo_window_p)
604

605 606 607 608
/* Window W's buffer.  */
#define WINDOW_BUFFER(W)			\
  (WINDOW_LEAF_P(W)				\
   ? (W)->contents				\
609
   : Qnil)
610

611 612 613 614 615 616 617
/* 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)

618
/* Return the canonical column width of the frame of window W.  */
619 620 621
#define WINDOW_FRAME_COLUMN_WIDTH(W) \
  (FRAME_COLUMN_WIDTH (WINDOW_XFRAME ((W))))

622
/* Return the canonical line height of the frame of window W.  */
623 624 625
#define WINDOW_FRAME_LINE_HEIGHT(W) \
  (FRAME_LINE_HEIGHT (WINDOW_XFRAME ((W))))

626 627
/* Return the pixel width of window W.  This includes dividers, scroll
   bars, fringes and margins, if any.  */
628
#define WINDOW_PIXEL_WIDTH(W) (W)->pixel_width
629

630 631
/* Return the pixel height of window W.  This includes dividers, scroll
   bars, header and mode lines, if any.  */
632 633
#define WINDOW_PIXEL_HEIGHT(W) (W)->pixel_height

634 635 636
/* Return the width of window W in canonical column units.  This
   includes dividers, scroll bars, fringes and margins, if any.  The
   value is adjusted such that the sum of the widths of all child
637
   windows equals the width of their parent window.  */
638
#define WINDOW_TOTAL_COLS(W) (W)->total_cols
639

640 641 642 643
/* Return the height of window W in canonical line units.  This includes
   dividers, scroll bars, header and mode lines, if any.  The value is
   adjusted such that the sum of the heights of all child windows equals
   the height of their parent window.  */
644
#define WINDOW_TOTAL_LINES(W) (W)->total_lines
645

646 647
/* The smallest acceptable dimensions for a window.  Anything smaller
   might crash Emacs.  */
648 649 650 651
#define MIN_SAFE_WINDOW_WIDTH (2)

#define MIN_SAFE_WINDOW_PIXEL_WIDTH(W) \
  (2 * WINDOW_FRAME_COLUMN_WIDTH (W))
652 653

#define MIN_SAFE_WINDOW_HEIGHT (1)
654

655 656 657
#define MIN_SAFE_WINDOW_PIXEL_HEIGHT(W) \
  (WINDOW_FRAME_LINE_HEIGHT (W))

658 659 660 661 662 663 664 665 666 667 668 669
/* True if window W has no other windows to its left on its frame.  */
#define WINDOW_LEFTMOST_P(W)			\
  (WINDOW_LEFT_PIXEL_EDGE (W) == 0)

/* True if window W has no other windows above it on its frame.  */
#define WINDOW_TOPMOST_P(W)			\
  (WINDOW_TOP_PIXEL_EDGE (W) == 0)

/* True if window W has no other windows to its right on its frame.  */
#define WINDOW_RIGHTMOST_P(W)					\
  (WINDOW_RIGHT_PIXEL_EDGE (W)					\
   == (WINDOW_RIGHT_PIXEL_EDGE					\
670
       (XWINDOW (FRAME_ROOT_WINDOW (WINDOW_XFRAME (W))))))
671 672 673 674 675 676 677

/* 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
   minibuffer window).  */
#define WINDOW_BOTTOMMOST_P(W)					\
  (WINDOW_BOTTOM_PIXEL_EDGE (W)					\
   == (WINDOW_BOTTOM_PIXEL_EDGE					\
678
       (XWINDOW (FRAME_ROOT_WINDOW (WINDOW_XFRAME (W))))))
679 680 681 682 683

/* 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					\
684
       (XWINDOW (FRAME_ROOT_WINDOW (WINDOW_XFRAME (W))))))
685

686 687
/* Width of right divider of window W.  */
#define WINDOW_RIGHT_DIVIDER_WIDTH(W)				\
688 689 690 691 692 693 694 695 696 697 698
  (WINDOW_RIGHTMOST_P (W)					\
   ? 0 : FRAME_RIGHT_DIVIDER_WIDTH (WINDOW_XFRAME (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)))
699

700 701
/* Return the canonical frame column at which window W starts.
   This includes a left-hand scroll bar, if any.  */
702
#define WINDOW_LEFT_EDGE_COL(W) (W)->left_col
703 704

/* Return the canonical frame column before which window W ends.
705
   This includes a right-hand scroll bar, if any.  */
706 707
#define WINDOW_RIGHT_EDGE_COL(W) \
  (WINDOW_LEFT_EDGE_COL (W) + WINDOW_TOTAL_COLS (W))
708

709
/* Return the canonical frame line at which window W starts.
710
   This includes a header/tab line, if any.  */
711
#define WINDOW_TOP_EDGE_LINE(W) (W)->top_line
712 713 714 715 716 717

/* Return the canonical frame line before which window W ends.
   This includes a mode line, if any.  */
#define WINDOW_BOTTOM_EDGE_LINE(W) \
  (WINDOW_TOP_EDGE_LINE (W) + WINDOW_TOTAL_LINES (W))

718 719 720 721 722 723 724 725 726 727
/* 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.
728
   This includes a header/tab line, if any.  */
729 730 731 732 733 734
#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))
735 736 737 738 739

/* 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)) \
740
   + WINDOW_LEFT_PIXEL_EDGE (W))
741 742 743 744 745

/* 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)) \
746
   + WINDOW_RIGHT_PIXEL_EDGE (W))
747

748
/* True if W is a menu bar window.  */
749
#if defined (HAVE_X_WINDOWS) && ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK)
750
#define WINDOW_MENU_BAR_P(W) \
751 752
  (WINDOWP (WINDOW_XFRAME (W)->menu_bar_window) \
   && (W) == XWINDOW (WINDOW_XFRAME (W)->menu_bar_window))
753 754
#else
/* No menu bar windows if X toolkit is in use.  */
755
#define WINDOW_MENU_BAR_P(W) false
756
#endif
757

758 759
/* True if W is a tab bar window.  */
#if defined (HAVE_WINDOW_SYSTEM)
760 761 762
# define WINDOW_TAB_BAR_P(W) \
   (WINDOWP (WINDOW_XFRAME (W)->tab_bar_window) \
    && (W) == XWINDOW (WINDOW_XFRAME (W)->tab_bar_window))
763
#else
764
# define WINDOW_TAB_BAR_P(W) false
765 766
#endif

767
/* True if W is a tool bar window.  */
768
#if defined (HAVE_WINDOW_SYSTEM) && ! defined (HAVE_EXT_TOOL_BAR)
769
#define WINDOW_TOOL_BAR_P(W) \
770 771
  (WINDOWP (WINDOW_XFRAME (W)->tool_bar_window) \
   && (W) == XWINDOW (WINDOW_XFRAME (W)->tool_bar_window))
772
#else
773
#define WINDOW_TOOL_BAR_P(W) false
774
#endif
775

776
/* Return the frame y-position at which window W starts.  */
777
#define WINDOW_TOP_EDGE_Y(W) \
778
  (((WINDOW_MENU_BAR_P (W) || WINDOW_TAB_BAR_P (W) || WINDOW_TOOL_BAR_P (W)) \
779
    ? 0 : FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W))) \
780
   + WINDOW_TOP_PIXEL_EDGE (W))
781

782
/* Return the frame y-position before which window W ends.  */
783
#define WINDOW_BOTTOM_EDGE_Y(W)				   \
784
  (((WINDOW_MENU_BAR_P (W) || WINDOW_TAB_BAR_P (W) || WINDOW_TOOL_BAR_P (W))	   \
785
    ? 0 : FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W))) \
786
   + WINDOW_BOTTOM_PIXEL_EDGE (W))
787

788 789
/* Return the pixel value where the text (or left fringe) in window W
   starts.  */
790 791 792 793 794 795 796 797 798 799 800 801
#define WINDOW_BOX_LEFT_PIXEL_EDGE(W)		\
  (WINDOW_LEFT_PIXEL_EDGE (W)			\
   + WINDOW_LEFT_SCROLL_BAR_AREA_WIDTH (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))
802

803 804 805
/* Return the frame x-position at which the text (or left fringe) in
   window W starts.  This does not include a left-hand scroll bar if
   any.  */
806
#define WINDOW_BOX_LEFT_EDGE_X(W)		   \
807
  (FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W)) \
808
   + WINDOW_BOX_LEFT_PIXEL_EDGE (W))
809

810 811 812
/* Return the frame x-position before which the text in window W ends.
   This does not include a scroll bar, divider or window-separating line
   on the right edge.  */
813
#define WINDOW_BOX_RIGHT_EDGE_X(W)		   \
814
  (FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W)) \
815
   + WINDOW_BOX_RIGHT_PIXEL_EDGE (W))
816

817
/* Widths of marginal areas in columns.  */
818
#define WINDOW_LEFT_MARGIN_COLS(W) (W->left_margin_cols)
819

820
#define WINDOW_RIGHT_MARGIN_COLS(W) (W->right_margin_cols)
821

822 823 824
#define WINDOW_MARGINS_COLS(W)			\
  (WINDOW_LEFT_MARGIN_COLS (W)			\
   + WINDOW_RIGHT_MARGIN_COLS (W))
825

826
/* Widths of marginal areas in pixels.  */
827 828
#define WINDOW_LEFT_MARGIN_WIDTH(W)			\
  (W->left_margin_cols * WINDOW_FRAME_COLUMN_WIDTH (W))
829

830
#define WINDOW_RIGHT_MARGIN_WIDTH(W)				\
831
  (W->right_margin_cols * WINDOW_FRAME_COLUMN_WIDTH (W))
832

833 834 835
#define WINDOW_MARGINS_WIDTH(W)			\
  (WINDOW_LEFT_MARGIN_WIDTH (W)			\
   + WINDOW_RIGHT_MARGIN_WIDTH (W))
836

837 838 839 840 841 842 843 844 845 846 847 848 849 850
/* 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))

851 852
/* Are fringes outside display margins in window W.  */
#define WINDOW_HAS_FRINGES_OUTSIDE_MARGINS(W)	\
853
  ((W)->fringes_outside_margins)
854

855
/* Say whether vertical scroll bars are currently enabled for window W,
856
   and which side they are on.  */
857 858 859 860 861 862
#define WINDOW_VERTICAL_SCROLL_BAR_TYPE(W)		\
  (WINDOW_PSEUDO_P (W)					\
   ? vertical_scroll_bar_none				\
   : EQ (W->vertical_scroll_bar_type, Qt)		\
   ? FRAME_VERTICAL_SCROLL_BAR_TYPE (WINDOW_XFRAME (W))	\
   : EQ (W->vertical_scroll_bar_type, Qleft)		\
863
   ? vertical_scroll_bar_left				\
864
   : EQ (W->vertical_scroll_bar_type, Qright)		\
865
   ? vertical_scroll_bar_right				\
866 867 868 869 870 871 872 873 874 875 876 877
   : vertical_scroll_bar_none)

#define WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT(W)			\
  (WINDOW_VERTICAL_SCROLL_BAR_TYPE (W) == vertical_scroll_bar_left)

#define WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT(W)			\
  (WINDOW_VERTICAL_SCROLL_BAR_TYPE (W) == vertical_scroll_bar_right)

#define WINDOW_HAS_VERTICAL_SCROLL_BAR(W)		\
  (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (W)		\
   || WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (W))

878
#if (defined (HAVE_WINDOW_SYSTEM)					\
879
     && ((defined (USE_TOOLKIT_SCROLL_BARS))	\
880
	 || defined (HAVE_NTGUI)))
881 882 883 884 885 886 887 888
# define USE_HORIZONTAL_SCROLL_BARS true
#else
# define USE_HORIZONTAL_SCROLL_BARS false
#endif

/* Say whether horizontal scroll bars are currently enabled for window
   W.  Horizontal scrollbars exist for toolkit versions only.  */
#if USE_HORIZONTAL_SCROLL_BARS
889
#define WINDOW_HAS_HORIZONTAL_SCROLL_BAR(W)			\
890 891 892
  ((WINDOW_PSEUDO_P (W)						\
    || (MINI_WINDOW_P (W)					\
	&& !EQ (W->horizontal_scroll_bar_type, Qbottom)))	\
893 894 895 896 897 898 899 900 901
   ? false							\
   : EQ (W->horizontal_scroll_bar_type, Qt)			\
   ? FRAME_HAS_HORIZONTAL_SCROLL_BARS (WINDOW_XFRAME (W))	\
   : EQ (W->horizontal_scroll_bar_type, Qbottom)		\
   ? true							\
   : false)
#else
#define WINDOW_HAS_HORIZONTAL_SCROLL_BAR(W) false
#endif
902 903 904 905

/* 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.  */
906 907 908 909
#define WINDOW_CONFIG_SCROLL_BAR_WIDTH(W)		\
  (W->scroll_bar_width >= 0				\
   ? W->scroll_bar_width				\
   : FRAME_CONFIG_SCROLL_BAR_WIDTH (WINDOW_XFRAME (W)))
910 911 912 913

/* 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.  */
914 915 916 917 918 919
#define WINDOW_CONFIG_SCROLL_BAR_COLS(W)		\
  (W->scroll_bar_width >= 0				\
   ? ((W->scroll_bar_width				\
       + WINDOW_FRAME_COLUMN_WIDTH (W) - 1)		\
      / WINDOW_FRAME_COLUMN_WIDTH (W))			\
   : FRAME_CONFIG_SCROLL_BAR_COLS (WINDOW_XFRAME (W)))
920

921 922 923
/* 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.  */
924 925 926
#define WINDOW_LEFT_SCROLL_BAR_COLS(W)	       \
  (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (W)  \
   ? (WINDOW_CONFIG_SCROLL_BAR_COLS (W))       \
927 928
   : 0)

929 930 931
/* 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.  */
932 933 934
#define WINDOW_RIGHT_SCROLL_BAR_COLS(W)		\
  (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (W)	\
   ? WINDOW_CONFIG_SCROLL_BAR_COLS (W)		\
935 936
   : 0)

937
/* Width of a scroll bar in window W, measured in columns.  */
938 939 940
#define WINDOW_SCROLL_BAR_COLS(W)	       \
  (WINDOW_HAS_VERTICAL_SCROLL_BAR (W)	       \
   ? WINDOW_CONFIG_SCROLL_BAR_COLS (W)	       \
941 942
   : 0)

943
/* Width of a left scroll bar area in window W, measured in pixels.  */
944 945 946
#define WINDOW_LEFT_SCROLL_BAR_AREA_WIDTH(W)				\
  (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (W)				\
   ? WINDOW_CONFIG_SCROLL_BAR_WIDTH (W)					\
947
   : 0)
948

949
/* Width of a right scroll bar area in window W, measured in pixels.  */
950 951 952
#define WINDOW_RIGHT_SCROLL_BAR_AREA_WIDTH(W)				\
  (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (W)				\
   ? WINDOW_CONFIG_SCROLL_BAR_WIDTH (W)					\
953 954
   : 0)

955
/* Width of scroll bar area in window W, measured in pixels.  */
956 957 958
#define WINDOW_SCROLL_BAR_AREA_WIDTH(W)					\
  (WINDOW_HAS_VERTICAL_SCROLL_BAR (W)					\
   ? WINDOW_CONFIG_SCROLL_BAR_WIDTH (W)					\
959
   : 0)
960

961 962
/* Return the frame position where the vertical scroll bar of window W
   starts.  */
963 964 965 966 967
#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))

968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997
/* Height 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_HEIGHT(W)			\
  (W->scroll_bar_height >= 0					\
   ? W->scroll_bar_height					\
   : FRAME_CONFIG_SCROLL_BAR_HEIGHT (WINDOW_XFRAME (W)))

/* Height that a scroll bar in window W should have, if there is one.
   Measured in lines (characters).  If scroll bars are turned off, this
   is still nonzero.  */
#define WINDOW_CONFIG_SCROLL_BAR_LINES(W)		\
  (W->scroll_bar_height >= 0				\
   ? ((W->scroll_bar_height				\
       + WINDOW_FRAME_LINE_HEIGHT (W) - 1)		\
      / WINDOW_FRAME_LINE_HEIGHT (W))			\
   : FRAME_CONFIG_SCROLL_BAR_LINES (WINDOW_XFRAME (W)))

/* Height of a scroll bar in window W, measured in columns.  */
#define WINDOW_SCROLL_BAR_LINES(W)	       \
  (WINDOW_HAS_HORIZONTAL_SCROLL_BAR (W)	       \
   ? WINDOW_CONFIG_SCROLL_BAR_LINES (W)	       \
   : 0)

/* Height of scroll bar area in window W, measured in pixels.  */
#define WINDOW_SCROLL_BAR_AREA_HEIGHT(W)	\
  (WINDOW_HAS_HORIZONTAL_SCROLL_BAR (W)		\
   ? WINDOW_CONFIG_SCROLL_BAR_HEIGHT (W)	\
   : 0)

998
/* Height in pixels of the mode line.
999
   May be zero if W doesn't have a mode line.  */
1000
#define WINDOW_MODE_LINE_HEIGHT(W)	\
1001
  (window_wants_mode_line ((W))		\
1002 1003 1004
   ? CURRENT_MODE_LINE_HEIGHT (W)	\
   : 0)

1005
#define WINDOW_MODE_LINE_LINES(W)	\
1006
  window_wants_mode_line (W)
1007

1008
/* Height in pixels of the header line.
1009
   Zero if W doesn't have a header line.  */
1010
#define WINDOW_HEADER_LINE_HEIGHT(W)	\
1011
  (window_wants_header_line (W)		\
1012 1013 1014
   ? CURRENT_HEADER_LINE_HEIGHT (W)	\
   : 0)

1015
#define WINDOW_HEADER_LINE_LINES(W)	\
1016
  window_wants_header_line (W)
1017

1018 1019 1020 1021 1022 1023 1024 1025 1026 1027
/* 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)

1028 1029
/* Pixel height of window W without mode line, bottom scroll bar and
   bottom divider.  */
1030
#define WINDOW_BOX_HEIGHT_NO_MODE_LINE(W)	\
1031
  (WINDOW_PIXEL_HEIGHT (W)			\
1032
   - WINDOW_BOTTOM_DIVIDER_WIDTH (W)		\
1033 1034
   - WINDOW_SCROLL_BAR_AREA_HEIGHT (W)		\
   - WINDOW_MODE_LINE_HEIGHT (W))
1035

1036
/* Pixel height of window W without mode and header/tab line and bottom
1037
   divider.  */
1038
#define WINDOW_BOX_TEXT_HEIGHT(W)	\
1039 1040
  (WINDOW_PIXEL_HEIGHT ((W))		\
   - WINDOW_BOTTOM_DIVIDER_WIDTH (W)	\
1041 1042
   - WINDOW_SCROLL_BAR_AREA_HEIGHT (W)	\
   - WINDOW_MODE_LINE_HEIGHT (W)	\
1043 1044
   - WINDOW_HEADER_LINE_HEIGHT (W)	\
   - WINDOW_TAB_LINE_HEIGHT (W))
1045 1046 1047 1048 1049 1050 1051

/* Return the frame position where the horizontal scroll bar of window W
   starts.  */
#define WINDOW_SCROLL_BAR_AREA_Y(W)			\
  (WINDOW_TOP_EDGE_Y (W)				\
   + (WINDOW_HAS_HORIZONTAL_SCROLL_BAR (W)		\
      ? WINDOW_BOX_HEIGHT_NO_MODE_LINE (W) : 0))
1052 1053

/* Convert window W relative pixel X to frame pixel coordinates.  */
1054
#define WINDOW_TO_FRAME_PIXEL_X(W, X)	\
1055 1056 1057
  ((X) + WINDOW_BOX_LEFT_EDGE_X ((W)))

/* Convert window W relative pixel Y to frame pixel coordinates.  */
1058 1059
#define WINDOW_TO_FRAME_PIXEL_Y(W, Y)		\
  ((Y) + WINDOW_TOP_EDGE_Y (W))
1060 1061

/* Convert frame relative pixel X to window relative pixel X.  */
1062
#define FRAME_TO_WINDOW_PIXEL_X(W, X)		\
1063 1064 1065
  ((X) - WINDOW_BOX_LEFT_EDGE_X ((W)))

/* Convert frame relative pixel Y to window relative pixel Y.  */
1066 1067
#define FRAME_TO_WINDOW_PIXEL_Y(W, Y)		\
  ((Y) - WINDOW_TOP_EDGE_Y (W))
1068 1069 1070

/* Convert a text area relative x-position in window W to frame X
   pixel coordinates.  */
1071
#define WINDOW_TEXT_TO_FRAME_PIXEL_X(W, X)	\
1072
  (window_box_left ((W), TEXT_AREA) + (X))
Gerd Moellmann's avatar
Gerd Moellmann committed
1073

1074 1075 1076 1077 1078
/* This is the window in which the terminal's cursor should be left when
   nothing is being done with it.  This must always be a leaf window, and its
   buffer is selected by the top level editing loop at the end of each command.

   This value is always the same as FRAME_SELECTED_WINDOW (selected_frame).  */
Jim Blandy's avatar
Jim Blandy committed
1079 1080 1081 1082 1083

extern Lisp_Object selected_window;

/* This is a time stamp for window selection, so we can find the least
   recently used window.  Its only users are Fselect_window,
Jim Blandy's avatar
Jim Blandy committed
1084
   init_window_once, and make_frame.  */
Jim Blandy's avatar
Jim Blandy committed
1085

1086
extern EMACS_INT window_select_count;
Jim Blandy's avatar
Jim Blandy committed
1087

Jim Blandy's avatar
Jim Blandy committed
1088
/* The minibuffer window of the selected frame.
Jim Blandy's avatar
Jim Blandy committed
1089
   Note that you cannot test for minibufferness of an arbitrary window
Jim Blandy's avatar
Jim Blandy committed
1090
   by comparing against this; use the MINI_WINDOW_P macro instead.  */
Jim Blandy's avatar
Jim Blandy committed
1091 1092 1093

extern Lisp_Object minibuf_window;

1094 1095 1096
/* Non-nil means it is the window whose mode line should be
   shown as the selected window when the minibuffer is selected.  */

1097
extern Lisp_Object minibuf_selected_window;
1098

Jan D's avatar
Jan D committed
1099 1100
extern Lisp_Object make_window (void);
extern Lisp_Object window_from_coordinates (struct frame *, int, int,
1101
                                            enum window_part *, bool, bool);
1102
extern void resize_frame_windows (struct frame *, int, bool);
1103
extern void restore_window_configuration (Lisp_Object);
1104
extern void delete_all_child_windows (Lisp_Object);
1105 1106
extern void grow_mini_window (struct window *, int);
extern void shrink_mini_window (struct window *);
1107
extern int window_relative_x_coord (struct window *, enum window_part, int);
1108

1109
void run_window_change_functions (void);
Jim Blandy's avatar
Jim Blandy committed
1110

Paul Eggert's avatar
Paul Eggert committed
1111
/* Make WINDOW display BUFFER.  RUN_HOOKS_P means it's allowed
1112
   to run hooks.  See make_frame for a case where it's not allowed.  */
Gerd Moellmann's avatar
Gerd Moellmann committed
1113

Jan D's avatar
Jan D committed
1114
void set_window_buffer (Lisp_Object window, Lisp_Object buffer,
1115
                        bool run_hooks_p, bool keep_margins_p);
Gerd Moellmann's avatar
Gerd Moellmann committed
1116 1117 1118 1119 1120

/* This is the window where the echo area message was displayed.  It
   is always a minibuffer window, but it may not be the same window
   currently active as a minibuffer.  */

1121 1122
extern Lisp_Object echo_area_window;

Jim Blandy's avatar
Jim Blandy committed
1123
/* Depth in recursive edits.  */
Gerd Moellmann's avatar
Gerd Moellmann committed
1124

1125
extern EMACS_INT command_loop_level;
Jim Blandy's avatar
Jim Blandy committed
1126 1127

/* Depth in minibuffer invocations.  */
Gerd Moellmann's avatar
Gerd Moellmann committed
1128

1129
extern EMACS_INT minibuf_level;
Jim Blandy's avatar
Jim Blandy committed
1130

1131 1132 1133
/* 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'.  */
Gerd Moellmann's avatar
Gerd Moellmann committed
1134

Jim Blandy's avatar
Jim Blandy committed
1135 1136
extern int update_mode_lines;

Gerd Moellmann's avatar
Gerd Moellmann committed
1137
/* Nonzero if window sizes or contents have changed since last
1138 1139 1140
   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'.  */
Gerd Moellmann's avatar
Gerd Moellmann committed
1141