; * lisp/ldefs-boot.el: Update.
[emacs.git] / src / window.h
blob72c58e7abfe99368ef5b09d3db82900f2ebaf72c
1 /* Window definitions for GNU Emacs.
2 Copyright (C) 1985-1986, 1993, 1995, 1997-2019 Free Software
3 Foundation, Inc.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or (at
10 your option) any later version.
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 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/>. */
20 #ifndef WINDOW_H_INCLUDED
21 #define WINDOW_H_INCLUDED
23 #include "dispextern.h"
25 INLINE_HEADER_BEGIN
27 /* Windows are allocated as if they were vectors, but then the Lisp
28 data type is changed to Lisp_Window. They are garbage collected along
29 with the vectors.
31 All windows in use are arranged into a tree, with pointers up and down.
33 Windows that are leaves of the tree are actually displayed and show
34 the contents of buffers. Windows that are not leaves are used for
35 representing the way groups of leaf windows are arranged on the frame.
36 Leaf windows never become non-leaves. They are deleted only by
37 calling `delete-window' on them (but this can be done implicitly).
38 Non-leaf windows never become leaf windows and can be created and
39 deleted at any time by the window management code. Non-leaf windows
40 can be seen but not directly manipulated by Lisp functions.
42 A leaf window has a buffer stored in its contents field and markers in
43 its 'start' and 'pointm' fields. Non-leaf windows have nil in the
44 latter two fields. Non-leaf windows are either vertical or horizontal
45 combinations.
47 A vertical combination window has children that are arranged on the
48 frame one above the next. Its 'contents' field points to the
49 uppermost child. The 'parent' field of each of the children points to
50 the vertical combination window. The 'next' field of each child
51 points to the child below it, or is nil for the lowest child. The
52 'prev' field of each child points to the child above it, or is nil for
53 the highest child.
55 A horizontal combination window has children that are arranged side by
56 side. Its 'contents' field points to the leftmost child. In each
57 child the 'next' field points to the child to the right and the 'prev'
58 field points to the child to the left.
60 On each frame there are at least one and at most two windows which
61 have nil as parent. The second of these, if present, is the frame's
62 minibuffer window and shows the minibuffer or the echo area. The
63 first one manages the remaining frame area and is called the frame's
64 root window. Different windows can be the root at different times;
65 initially the root window is a leaf window, but if more windows are
66 created, then that leaf window ceases to be root and a newly made
67 combination window becomes the root instead.
69 On frames which have an ordinary window and a minibuffer window,
70 'prev' of the minibuffer window is the root window and 'next' of the
71 root window is the minibuffer window. On minibuffer-less frames there
72 is only a root window and 'next' of the root window is nil. On
73 minibuffer-only frames, the root window and the minibuffer window are
74 one and the same, so its 'prev' and 'next' members are nil. In any
75 case, 'prev' of a root window and 'next' of a minibuffer window are
76 always nil.
78 In Lisp parlance, leaf windows are called "live windows" and non-leaf
79 windows are called "internal windows". Together, live and internal
80 windows form the set of "valid windows". A window that has been
81 deleted is considered "dead" regardless of whether it formerly was a
82 leaf or a non-leaf window. A dead window has its 'contents' field set
83 to nil.
85 Frames may also contain pseudo windows, windows that are not exposed
86 directly to Lisp code. Pseudo windows are currently either used to
87 display the menu bar or the tool bar (when Emacs uses toolkits that
88 don't display their own menu bar and tool bar) or a tooltip in a
89 tooltip frame (when tooltips are not display by the toolkit). */
91 struct cursor_pos
93 /* Pixel position. These are always window relative. */
94 int x, y;
96 /* Glyph matrix position. */
97 int hpos, vpos;
100 struct window
102 /* This is for Lisp; the terminal code does not refer to it. */
103 union vectorlike_header header;
105 /* The frame this window is on. */
106 Lisp_Object frame;
108 /* Following (to right or down) and preceding (to left or up)
109 child at same level of tree. Whether this is left/right or
110 up/down is determined by the parent window's 'horizontal' flag,
111 see below. On a frame that is neither a minibuffer-only nor a
112 minibuffer-less frame, 'next' of the root window points to the
113 frame's minibuffer window and 'prev' of the minibuffer window
114 points to the frame's root window. In all other cases, 'next'
115 of the root window and 'prev' of the minibuffer window, if
116 present, are nil. 'prev' of the root window and 'next' of the
117 minibuffer window are always nil. */
118 Lisp_Object next;
119 Lisp_Object prev;
121 /* The window this one is a child of. For the root and a
122 minibuffer window this is always nil. */
123 Lisp_Object parent;
125 /* The "normal" size of the window. These are fractions, but we
126 do not use C doubles to avoid creating new Lisp_Float objects
127 while interfacing Lisp in Fwindow_normal_size. */
128 Lisp_Object normal_lines;
129 Lisp_Object normal_cols;
131 /* The new sizes of the window as proposed by the window resizing
132 functions. Note that Lisp code may set new_normal to something
133 beyond an integer, so C int can't be used here. */
134 Lisp_Object new_total;
135 Lisp_Object new_normal;
136 Lisp_Object new_pixel;
138 /* For a leaf window or a tooltip window this is the buffer shown
139 in the window; for a combination window this is the first of
140 its child windows; for a pseudo window showing the menu bar or
141 tool bar this is nil. It is a buffer for a minibuffer window
142 as well. */
143 Lisp_Object contents;
145 /* A marker pointing to where in the text to start displaying.
146 BIDI Note: This is the _logical-order_ start, i.e. the smallest
147 buffer position visible in the window, not necessarily the
148 character displayed in the top left corner of the window. */
149 Lisp_Object start;
151 /* A marker pointing to where in the text point is in this window,
152 used only when the window is not selected.
153 This exists so that when multiple windows show one buffer
154 each one can have its own value of point. */
155 Lisp_Object pointm;
157 /* A marker pointing to where in the text point was in this window
158 at the time of last redisplay. The value is saved for the
159 selected window too. */
160 Lisp_Object old_pointm;
162 /* No permanent meaning; used by save-window-excursion's
163 bookkeeping. */
164 Lisp_Object temslot;
166 /* This window's vertical scroll bar. This field is only for use by
167 the window-system-dependent code which implements the scroll
168 bars; it can store anything it likes here. If this window is
169 newly created and we haven't displayed a scroll bar in it yet, or
170 if the frame doesn't have any scroll bars, this is nil. */
171 Lisp_Object vertical_scroll_bar;
173 /* Type of vertical scroll bar. A value of nil means
174 no scroll bar. A value of t means use frame value. */
175 Lisp_Object vertical_scroll_bar_type;
177 /* This window's horizontal scroll bar. This field is only for use
178 by the window-system-dependent code which implements the scroll
179 bars; it can store anything it likes here. If this window is
180 newly created and we haven't displayed a scroll bar in it yet, or
181 if the frame doesn't have any scroll bars, this is nil. */
182 Lisp_Object horizontal_scroll_bar;
184 /* Type of horizontal scroll bar. A value of nil means
185 no scroll bar. A value of t means use frame value. */
186 Lisp_Object horizontal_scroll_bar_type;
188 /* Display-table to use for displaying chars in this window.
189 Nil means use the buffer's own display-table. */
190 Lisp_Object display_table;
192 /* Non-nil usually means window is marked as dedicated.
193 Note Lisp code may set this to something beyond Qnil
194 and Qt, so bitfield can't be used here. */
195 Lisp_Object dedicated;
197 /* If redisplay in this window goes beyond this buffer position,
198 must run the redisplay-end-trigger-hook. */
199 Lisp_Object redisplay_end_trigger;
201 /* t means this window's child windows are not (re-)combined. */
202 Lisp_Object combination_limit;
204 /* An alist with parameters. */
205 Lisp_Object window_parameters;
207 /* No Lisp data may follow below this point without changing
208 mark_object in alloc.c. The member current_matrix must be the
209 first non-Lisp member. */
211 /* Glyph matrices. */
212 struct glyph_matrix *current_matrix;
213 struct glyph_matrix *desired_matrix;
215 /* The two Lisp_Object fields below are marked in a special way,
216 which is why they're placed after `current_matrix'. */
217 /* A list of <buffer, window-start, window-point> triples listing
218 buffers previously shown in this window. */
219 Lisp_Object prev_buffers;
220 /* List of buffers re-shown in this window. */
221 Lisp_Object next_buffers;
223 /* Number saying how recently window was selected. */
224 EMACS_INT use_time;
226 /* Unique number of window assigned when it was created. */
227 EMACS_INT sequence_number;
229 /* The upper left corner pixel coordinates of this window, as
230 integers relative to upper left corner of frame = 0, 0. */
231 int pixel_left;
232 int pixel_top;
234 /* The upper left corner coordinates of this window,
235 relative to upper left corner of frame = 0, 0. */
236 int left_col;
237 int top_line;
239 /* The pixel size of the window. */
240 int pixel_width;
241 int pixel_height;
243 /* The pixel sizes of the window at the last time
244 `window-size-change-functions' was run. */
245 int pixel_width_before_size_change;
246 int pixel_height_before_size_change;
248 /* The size of the window. */
249 int total_cols;
250 int total_lines;
252 /* Number of columns display within the window is scrolled to the left. */
253 ptrdiff_t hscroll;
255 /* Minimum hscroll for automatic hscrolling. This is the value
256 the user has set, by set-window-hscroll for example. */
257 ptrdiff_t min_hscroll;
259 /* Maximum line length in pixels within window bound by size of
260 window (set up by set_horizontal_scroll_bar). */
261 ptrdiff_t hscroll_whole;
263 /* Displayed buffer's text modification events counter as of last time
264 display completed. */
265 EMACS_INT last_modified;
267 /* Displayed buffer's overlays modification events counter as of last
268 complete update. */
269 EMACS_INT last_overlay_modified;
271 /* Value of point at that time. Since this is a position in a buffer,
272 it should be positive. */
273 ptrdiff_t last_point;
275 /* Line number and position of a line somewhere above the top of the
276 screen. If this field is zero, it means we don't have a base line. */
277 ptrdiff_t base_line_number;
279 /* If this field is zero, it means we don't have a base line.
280 If it is -1, it means don't display the line number as long
281 as the window shows its buffer. */
282 ptrdiff_t base_line_pos;
284 /* The column number currently displayed in this window's mode
285 line, or -1 if column numbers are not being displayed. */
286 ptrdiff_t column_number_displayed;
288 /* Scaling factor for the glyph_matrix size calculation in this window.
289 Used if window contains many small images or uses proportional fonts,
290 as the normal may yield a matrix which is too small. */
291 int nrows_scale_factor, ncols_scale_factor;
293 /* Intended cursor position. This is a position within the
294 glyph matrix. */
295 struct cursor_pos cursor;
297 /* Where the cursor actually is. */
298 struct cursor_pos phys_cursor;
300 /* Internally used for redisplay purposes. */
301 struct cursor_pos output_cursor;
303 /* Vertical cursor position as of last update that completed
304 without pause. This is the position of last_point. */
305 int last_cursor_vpos;
307 #ifdef HAVE_WINDOW_SYSTEM
309 /* Cursor type of last cursor drawn on the window. */
310 enum text_cursor_kinds phys_cursor_type;
312 /* Width of the cursor above. */
313 int phys_cursor_width;
315 /* This is handy for undrawing the cursor. */
316 int phys_cursor_ascent, phys_cursor_height;
318 #endif /* HAVE_WINDOW_SYSTEM */
320 /* Width of left and right fringes, in pixels.
321 A value of -1 means use frame values. */
322 int left_fringe_width;
323 int right_fringe_width;
325 /* Requested width of left and right marginal areas in columns. A
326 value of 0 means no margin. The actual values are recorded in
327 the window's glyph matrix, in the left_margin_glyphs and
328 right_margin_glyphs members. */
329 int left_margin_cols;
330 int right_margin_cols;
332 /* Pixel width of scroll bars.
333 A value of -1 means use frame values. */
334 int scroll_bar_width;
336 /* Pixel height of scroll bars.
337 A value of -1 means use frame values. */
338 int scroll_bar_height;
340 /* Effective height of the mode line, or -1 if not known. */
341 int mode_line_height;
343 /* Effective height of the header line, or -1 if not known. */
344 int header_line_height;
346 /* Z - the buffer position of the last glyph in the current
347 matrix of W. Only valid if window_end_valid is true. */
348 ptrdiff_t window_end_pos;
350 /* Glyph matrix row of the last glyph in the current matrix
351 of W. Only valid if window_end_valid is true. */
352 int window_end_vpos;
354 /* True if this window is a minibuffer window. */
355 bool_bf mini : 1;
357 /* Meaningful for internal windows only: true if this window is a
358 horizontal combination, false if it is a vertical
359 combination. */
360 bool_bf horizontal : 1;
362 /* True means must regenerate mode line of this window. */
363 bool_bf update_mode_line : 1;
365 /* True if the buffer was "modified" when the window
366 was last updated. */
367 bool_bf last_had_star : 1;
369 /* True means current value of `start'
370 was the beginning of a line when it was chosen. */
371 bool_bf start_at_line_beg : 1;
373 /* True means next redisplay must use the value of start
374 set up for it in advance. Set by scrolling commands. */
375 bool_bf force_start : 1;
377 /* True means we have explicitly changed the value of start,
378 but that the next redisplay is not obliged to use the new value.
379 This is used in Fdelete_other_windows to force a call to
380 Vwindow_scroll_functions; also by Frecenter with argument. */
381 bool_bf optional_new_start : 1;
383 /* True means the cursor is currently displayed. This can be
384 set to zero by functions overpainting the cursor image. */
385 bool_bf phys_cursor_on_p : 1;
387 /* False means cursor is logically on, true means it's off. Used for
388 blinking cursor. */
389 bool_bf cursor_off_p : 1;
391 /* Value of cursor_off_p as of the last redisplay. */
392 bool_bf last_cursor_off_p : 1;
394 /* True means desired matrix has been build and window must be
395 updated in update_frame. */
396 bool_bf must_be_updated_p : 1;
398 /* Flag indicating that this window is not a real one.
399 Currently only used for menu bar windows, for tool bar windows,
400 and for tooltips. */
401 bool_bf pseudo_window_p : 1;
403 /* True means fringes are drawn outside display margins.
404 Otherwise draw them between margin areas and text. */
405 bool_bf fringes_outside_margins : 1;
407 /* True if window_end_pos and window_end_vpos are truly valid.
408 This is false if nontrivial redisplay is preempted since in that case
409 the frame image that window_end_pos did not get onto the frame. */
410 bool_bf window_end_valid : 1;
412 /* True if it needs to be redisplayed. */
413 bool_bf redisplay : 1;
415 /* True if auto hscrolling is currently suspended in this
416 window. */
417 bool_bf suspend_auto_hscroll : 1;
419 /* Amount by which lines of this window are scrolled in
420 y-direction (smooth scrolling). */
421 int vscroll;
423 /* Z_BYTE - buffer position of the last glyph in the current matrix of W.
424 Should be nonnegative, and only valid if window_end_valid is true. */
425 ptrdiff_t window_end_bytepos;
428 INLINE bool
429 WINDOWP (Lisp_Object a)
431 return PSEUDOVECTORP (a, PVEC_WINDOW);
434 INLINE void
435 CHECK_WINDOW (Lisp_Object x)
437 CHECK_TYPE (WINDOWP (x), Qwindowp, x);
440 INLINE struct window *
441 XWINDOW (Lisp_Object a)
443 eassert (WINDOWP (a));
444 return XUNTAG (a, Lisp_Vectorlike);
447 /* Most code should use these functions to set Lisp fields in struct
448 window. */
449 INLINE void
450 wset_frame (struct window *w, Lisp_Object val)
452 w->frame = val;
455 INLINE void
456 wset_next (struct window *w, Lisp_Object val)
458 w->next = val;
461 INLINE void
462 wset_prev (struct window *w, Lisp_Object val)
464 w->prev = val;
467 INLINE void
468 wset_redisplay_end_trigger (struct window *w, Lisp_Object val)
470 w->redisplay_end_trigger = val;
473 INLINE void
474 wset_new_pixel (struct window *w, Lisp_Object val)
476 w->new_pixel = val;
479 INLINE void
480 wset_vertical_scroll_bar (struct window *w, Lisp_Object val)
482 w->vertical_scroll_bar = val;
485 INLINE void
486 wset_horizontal_scroll_bar (struct window *w, Lisp_Object val)
488 w->horizontal_scroll_bar = val;
491 INLINE void
492 wset_horizontal_scroll_bar_type (struct window *w, Lisp_Object val)
494 w->horizontal_scroll_bar_type = val;
497 INLINE void
498 wset_prev_buffers (struct window *w, Lisp_Object val)
500 w->prev_buffers = val;
503 INLINE void
504 wset_next_buffers (struct window *w, Lisp_Object val)
506 w->next_buffers = val;
509 /* True if W is a minibuffer window. */
510 #define MINI_WINDOW_P(W) ((W)->mini)
512 /* True if W is a minibuffer window on a frame that contains at least
513 one other window. */
514 #define MINI_NON_ONLY_WINDOW_P(W) \
515 (MINI_WINDOW_P (W) && !NILP ((W)->prev))
517 /* True if W is a minibuffer window that is alone on its frame. */
518 #define MINI_ONLY_WINDOW_P(W) \
519 (MINI_WINDOW_P (W) && NILP ((W)->prev))
521 /* General window layout:
523 LEFT_EDGE_COL RIGHT_EDGE_COL
526 | BOX_LEFT_EDGE_COL |
527 | | BOX_RIGHT_EDGE_COL |
528 | | | |
529 v v v v
530 <-><-><---><-----------><---><-><->
531 ^ ^ ^ ^ ^ ^ ^
532 | | | | | | |
533 | | | | | | +-- RIGHT_SCROLL_BAR_COLS
534 | | | | | +----- RIGHT_FRINGE_WIDTH
535 | | | | +--------- RIGHT_MARGIN_COLS
536 | | | |
537 | | | +------------------ TEXT_AREA_COLS
538 | | |
539 | | +--------------------------- LEFT_MARGIN_COLS
540 | +------------------------------- LEFT_FRINGE_WIDTH
541 +---------------------------------- LEFT_SCROLL_BAR_COLS
546 /* A handy macro. */
548 /* Non-nil if window W is leaf window (has a buffer). */
549 #define WINDOW_LEAF_P(W) \
550 (BUFFERP ((W)->contents))
552 /* Non-nil if window W is internal (is a parent window). */
553 #define WINDOW_INTERNAL_P(W) \
554 (WINDOWP ((W)->contents))
556 /* True if window W is a horizontal combination of windows. */
557 #define WINDOW_HORIZONTAL_COMBINATION_P(W) \
558 (WINDOW_INTERNAL_P (W) && (W)->horizontal)
560 /* True if window W is a vertical combination of windows. */
561 #define WINDOW_VERTICAL_COMBINATION_P(W) \
562 (WINDOW_INTERNAL_P (W) && !(W)->horizontal)
564 /* Window W's XFRAME. */
565 #define WINDOW_XFRAME(W) (XFRAME (WINDOW_FRAME ((W))))
567 /* Whether window W is a pseudo window. */
568 #define WINDOW_PSEUDO_P(W) ((W)->pseudo_window_p)
570 /* Window W's buffer. */
571 #define WINDOW_BUFFER(W) \
572 (WINDOW_LEAF_P(W) \
573 ? (W)->contents \
574 : Qnil) \
576 /* Return the canonical column width of the frame of window W. */
577 #define WINDOW_FRAME_COLUMN_WIDTH(W) \
578 (FRAME_COLUMN_WIDTH (WINDOW_XFRAME ((W))))
580 /* Return the canonical line height of the frame of window W. */
581 #define WINDOW_FRAME_LINE_HEIGHT(W) \
582 (FRAME_LINE_HEIGHT (WINDOW_XFRAME ((W))))
584 /* Return the pixel width of window W. This includes dividers, scroll
585 bars, fringes and margins, if any. */
586 #define WINDOW_PIXEL_WIDTH(W) (W)->pixel_width
588 /* Return the pixel height of window W. This includes dividers, scroll
589 bars, header and mode lines, if any. */
590 #define WINDOW_PIXEL_HEIGHT(W) (W)->pixel_height
592 /* Return the width of window W in canonical column units. This
593 includes dividers, scroll bars, fringes and margins, if any. The
594 value is adjusted such that the sum of the widths of all child
595 windows equals the width of their parent window. */
596 #define WINDOW_TOTAL_COLS(W) (W)->total_cols
598 /* Return the height of window W in canonical line units. This includes
599 dividers, scroll bars, header and mode lines, if any. The value is
600 adjusted such that the sum of the heights of all child windows equals
601 the height of their parent window. */
602 #define WINDOW_TOTAL_LINES(W) (W)->total_lines
604 /* The smallest acceptable dimensions for a window. Anything smaller
605 might crash Emacs. */
606 #define MIN_SAFE_WINDOW_WIDTH (2)
608 #define MIN_SAFE_WINDOW_PIXEL_WIDTH(W) \
609 (2 * WINDOW_FRAME_COLUMN_WIDTH (W))
611 #define MIN_SAFE_WINDOW_HEIGHT (1)
613 #define MIN_SAFE_WINDOW_PIXEL_HEIGHT(W) \
614 (WINDOW_FRAME_LINE_HEIGHT (W))
616 /* True if window W has no other windows to its left on its frame. */
617 #define WINDOW_LEFTMOST_P(W) \
618 (WINDOW_LEFT_PIXEL_EDGE (W) == 0)
620 /* True if window W has no other windows above it on its frame. */
621 #define WINDOW_TOPMOST_P(W) \
622 (WINDOW_TOP_PIXEL_EDGE (W) == 0)
624 /* True if window W has no other windows to its right on its frame. */
625 #define WINDOW_RIGHTMOST_P(W) \
626 (WINDOW_RIGHT_PIXEL_EDGE (W) \
627 == (WINDOW_RIGHT_PIXEL_EDGE \
628 (XWINDOW (FRAME_ROOT_WINDOW (WINDOW_XFRAME (W)))))) \
630 /* True if window W has no other windows below it on its frame (the
631 minibuffer window is not counted in this respect unless W itself is a
632 minibuffer window). */
633 #define WINDOW_BOTTOMMOST_P(W) \
634 (WINDOW_BOTTOM_PIXEL_EDGE (W) \
635 == (WINDOW_BOTTOM_PIXEL_EDGE \
636 (XWINDOW (FRAME_ROOT_WINDOW (WINDOW_XFRAME (W)))))) \
638 /* True if window W takes up the full width of its frame. */
639 #define WINDOW_FULL_WIDTH_P(W) \
640 (WINDOW_PIXEL_WIDTH (W) \
641 == (WINDOW_PIXEL_WIDTH \
642 (XWINDOW (FRAME_ROOT_WINDOW (WINDOW_XFRAME (W)))))) \
644 /* Width of right divider of window W. */
645 #define WINDOW_RIGHT_DIVIDER_WIDTH(W) \
646 (WINDOW_RIGHTMOST_P (W) \
647 ? 0 : FRAME_RIGHT_DIVIDER_WIDTH (WINDOW_XFRAME (W)))
649 /* Width of bottom divider of window W. */
650 #define WINDOW_BOTTOM_DIVIDER_WIDTH(W) \
651 (((WINDOW_BOTTOMMOST_P (W) \
652 && NILP ((XWINDOW (FRAME_ROOT_WINDOW \
653 (WINDOW_XFRAME (W))))->next)) \
654 || EQ ((W)->prev, FRAME_ROOT_WINDOW (WINDOW_XFRAME (W))) \
655 || (W)->pseudo_window_p) \
656 ? 0 : FRAME_BOTTOM_DIVIDER_WIDTH (WINDOW_XFRAME (W)))
658 /* Return the canonical frame column at which window W starts.
659 This includes a left-hand scroll bar, if any. */
660 #define WINDOW_LEFT_EDGE_COL(W) (W)->left_col
662 /* Return the canonical frame column before which window W ends.
663 This includes a right-hand scroll bar, if any. */
664 #define WINDOW_RIGHT_EDGE_COL(W) \
665 (WINDOW_LEFT_EDGE_COL (W) + WINDOW_TOTAL_COLS (W))
667 /* Return the canonical frame line at which window W starts.
668 This includes a header line, if any. */
669 #define WINDOW_TOP_EDGE_LINE(W) (W)->top_line
671 /* Return the canonical frame line before which window W ends.
672 This includes a mode line, if any. */
673 #define WINDOW_BOTTOM_EDGE_LINE(W) \
674 (WINDOW_TOP_EDGE_LINE (W) + WINDOW_TOTAL_LINES (W))
676 /* Return the left pixel edge at which window W starts.
677 This includes a left-hand scroll bar, if any. */
678 #define WINDOW_LEFT_PIXEL_EDGE(W) (W)->pixel_left
680 /* Return the right pixel edge before which window W ends.
681 This includes a right-hand scroll bar, if any. */
682 #define WINDOW_RIGHT_PIXEL_EDGE(W) \
683 (WINDOW_LEFT_PIXEL_EDGE (W) + WINDOW_PIXEL_WIDTH (W))
685 /* Return the top pixel edge at which window W starts.
686 This includes a header line, if any. */
687 #define WINDOW_TOP_PIXEL_EDGE(W) (W)->pixel_top
689 /* Return the bottom pixel edge before which window W ends.
690 This includes a mode line, if any. */
691 #define WINDOW_BOTTOM_PIXEL_EDGE(W) \
692 (WINDOW_TOP_PIXEL_EDGE (W) + WINDOW_PIXEL_HEIGHT (W))
694 /* Return the frame x-position at which window W starts.
695 This includes a left-hand scroll bar, if any. */
696 #define WINDOW_LEFT_EDGE_X(W) \
697 (FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W)) \
698 + WINDOW_LEFT_PIXEL_EDGE (W))
700 /* Return the frame x- position before which window W ends.
701 This includes a right-hand scroll bar, if any. */
702 #define WINDOW_RIGHT_EDGE_X(W) \
703 (FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W)) \
704 + WINDOW_RIGHT_PIXEL_EDGE (W))
706 /* True if W is a menu bar window. */
707 #if defined (HAVE_X_WINDOWS) && ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK)
708 #define WINDOW_MENU_BAR_P(W) \
709 (WINDOWP (WINDOW_XFRAME (W)->menu_bar_window) \
710 && (W) == XWINDOW (WINDOW_XFRAME (W)->menu_bar_window))
711 #else
712 /* No menu bar windows if X toolkit is in use. */
713 #define WINDOW_MENU_BAR_P(W) false
714 #endif
716 /* True if W is a tool bar window. */
717 #if defined (HAVE_WINDOW_SYSTEM) && ! defined (USE_GTK) && ! defined (HAVE_NS)
718 #define WINDOW_TOOL_BAR_P(W) \
719 (WINDOWP (WINDOW_XFRAME (W)->tool_bar_window) \
720 && (W) == XWINDOW (WINDOW_XFRAME (W)->tool_bar_window))
721 #else
722 #define WINDOW_TOOL_BAR_P(W) false
723 #endif
725 /* Return the frame y-position at which window W starts. */
726 #define WINDOW_TOP_EDGE_Y(W) \
727 (((WINDOW_MENU_BAR_P (W) || WINDOW_TOOL_BAR_P (W)) \
728 ? 0 : FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W))) \
729 + WINDOW_TOP_PIXEL_EDGE (W))
731 /* Return the frame y-position before which window W ends. */
732 #define WINDOW_BOTTOM_EDGE_Y(W) \
733 (((WINDOW_MENU_BAR_P (W) || WINDOW_TOOL_BAR_P (W)) \
734 ? 0 : FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W))) \
735 + WINDOW_BOTTOM_PIXEL_EDGE (W))
737 /* Return the pixel value where the text (or left fringe) in window W
738 starts. */
739 #define WINDOW_BOX_LEFT_PIXEL_EDGE(W) \
740 (WINDOW_LEFT_PIXEL_EDGE (W) \
741 + WINDOW_LEFT_SCROLL_BAR_AREA_WIDTH (W))
743 /* Return the pixel value before which the text in window W ends. This
744 is different from the `RIGHT_EDGE' because it does not include a
745 right-hand scroll bar or window-separating line on the right
746 edge. */
747 #define WINDOW_BOX_RIGHT_PIXEL_EDGE(W) \
748 (WINDOW_RIGHT_PIXEL_EDGE (W) \
749 - WINDOW_RIGHT_DIVIDER_WIDTH (W) \
750 - WINDOW_RIGHT_SCROLL_BAR_AREA_WIDTH (W))
752 /* Return the frame x-position at which the text (or left fringe) in
753 window W starts. This does not include a left-hand scroll bar if
754 any. */
755 #define WINDOW_BOX_LEFT_EDGE_X(W) \
756 (FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W)) \
757 + WINDOW_BOX_LEFT_PIXEL_EDGE (W))
759 /* Return the frame x-position before which the text in window W ends.
760 This does not include a scroll bar, divider or window-separating line
761 on the right edge. */
762 #define WINDOW_BOX_RIGHT_EDGE_X(W) \
763 (FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W)) \
764 + WINDOW_BOX_RIGHT_PIXEL_EDGE (W))
766 /* Widths of marginal areas in columns. */
767 #define WINDOW_LEFT_MARGIN_COLS(W) (W->left_margin_cols)
769 #define WINDOW_RIGHT_MARGIN_COLS(W) (W->right_margin_cols)
771 #define WINDOW_MARGINS_COLS(W) \
772 (WINDOW_LEFT_MARGIN_COLS (W) \
773 + WINDOW_RIGHT_MARGIN_COLS (W))
775 /* Widths of marginal areas in pixels. */
776 #define WINDOW_LEFT_MARGIN_WIDTH(W) \
777 (W->left_margin_cols * WINDOW_FRAME_COLUMN_WIDTH (W))
779 #define WINDOW_RIGHT_MARGIN_WIDTH(W) \
780 (W->right_margin_cols * WINDOW_FRAME_COLUMN_WIDTH (W))
782 #define WINDOW_MARGINS_WIDTH(W) \
783 (WINDOW_LEFT_MARGIN_WIDTH (W) \
784 + WINDOW_RIGHT_MARGIN_WIDTH (W))
786 /* Pixel-widths of fringes. */
787 #define WINDOW_LEFT_FRINGE_WIDTH(W) \
788 (W->left_fringe_width >= 0 \
789 ? W->left_fringe_width \
790 : FRAME_LEFT_FRINGE_WIDTH (WINDOW_XFRAME (W)))
792 #define WINDOW_RIGHT_FRINGE_WIDTH(W) \
793 (W->right_fringe_width >= 0 \
794 ? W->right_fringe_width \
795 : FRAME_RIGHT_FRINGE_WIDTH (WINDOW_XFRAME (W)))
797 #define WINDOW_FRINGES_WIDTH(W) \
798 (WINDOW_LEFT_FRINGE_WIDTH (W) + WINDOW_RIGHT_FRINGE_WIDTH (W))
800 /* Are fringes outside display margins in window W. */
801 #define WINDOW_HAS_FRINGES_OUTSIDE_MARGINS(W) \
802 ((W)->fringes_outside_margins)
804 /* Say whether vertical scroll bars are currently enabled for window W,
805 and which side they are on. */
806 #define WINDOW_VERTICAL_SCROLL_BAR_TYPE(W) \
807 (WINDOW_PSEUDO_P (W) \
808 ? vertical_scroll_bar_none \
809 : EQ (W->vertical_scroll_bar_type, Qt) \
810 ? FRAME_VERTICAL_SCROLL_BAR_TYPE (WINDOW_XFRAME (W)) \
811 : EQ (W->vertical_scroll_bar_type, Qleft) \
812 ? vertical_scroll_bar_left \
813 : EQ (W->vertical_scroll_bar_type, Qright) \
814 ? vertical_scroll_bar_right \
815 : vertical_scroll_bar_none)
817 #define WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT(W) \
818 (WINDOW_VERTICAL_SCROLL_BAR_TYPE (W) == vertical_scroll_bar_left)
820 #define WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT(W) \
821 (WINDOW_VERTICAL_SCROLL_BAR_TYPE (W) == vertical_scroll_bar_right)
823 #define WINDOW_HAS_VERTICAL_SCROLL_BAR(W) \
824 (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (W) \
825 || WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (W))
827 #if (defined (HAVE_WINDOW_SYSTEM) \
828 && ((defined (USE_TOOLKIT_SCROLL_BARS)) \
829 || defined (HAVE_NTGUI)))
830 # define USE_HORIZONTAL_SCROLL_BARS true
831 #else
832 # define USE_HORIZONTAL_SCROLL_BARS false
833 #endif
835 /* Say whether horizontal scroll bars are currently enabled for window
836 W. Horizontal scrollbars exist for toolkit versions only. */
837 #if USE_HORIZONTAL_SCROLL_BARS
838 #define WINDOW_HAS_HORIZONTAL_SCROLL_BAR(W) \
839 ((WINDOW_PSEUDO_P (W) || MINI_NON_ONLY_WINDOW_P (W)) \
840 ? false \
841 : EQ (W->horizontal_scroll_bar_type, Qt) \
842 ? FRAME_HAS_HORIZONTAL_SCROLL_BARS (WINDOW_XFRAME (W)) \
843 : EQ (W->horizontal_scroll_bar_type, Qbottom) \
844 ? true \
845 : false)
846 #else
847 #define WINDOW_HAS_HORIZONTAL_SCROLL_BAR(W) false
848 #endif
850 /* Width that a scroll bar in window W should have, if there is one.
851 Measured in pixels. If scroll bars are turned off, this is still
852 nonzero. */
853 #define WINDOW_CONFIG_SCROLL_BAR_WIDTH(W) \
854 (W->scroll_bar_width >= 0 \
855 ? W->scroll_bar_width \
856 : FRAME_CONFIG_SCROLL_BAR_WIDTH (WINDOW_XFRAME (W)))
858 /* Width that a scroll bar in window W should have, if there is one.
859 Measured in columns (characters). If scroll bars are turned off,
860 this is still nonzero. */
861 #define WINDOW_CONFIG_SCROLL_BAR_COLS(W) \
862 (W->scroll_bar_width >= 0 \
863 ? ((W->scroll_bar_width \
864 + WINDOW_FRAME_COLUMN_WIDTH (W) - 1) \
865 / WINDOW_FRAME_COLUMN_WIDTH (W)) \
866 : FRAME_CONFIG_SCROLL_BAR_COLS (WINDOW_XFRAME (W)))
868 /* Width of left scroll bar in window W, measured in columns
869 (characters). If scroll bars are on the right in this frame, or
870 there are no scroll bars, value is 0. */
871 #define WINDOW_LEFT_SCROLL_BAR_COLS(W) \
872 (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (W) \
873 ? (WINDOW_CONFIG_SCROLL_BAR_COLS (W)) \
874 : 0)
876 /* Width of right scroll bar in window W, measured in columns
877 (characters). If scroll bars are on the left in this frame, or there
878 are no scroll bars, value is 0. */
879 #define WINDOW_RIGHT_SCROLL_BAR_COLS(W) \
880 (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (W) \
881 ? WINDOW_CONFIG_SCROLL_BAR_COLS (W) \
882 : 0)
884 /* Width of a scroll bar in window W, measured in columns. */
885 #define WINDOW_SCROLL_BAR_COLS(W) \
886 (WINDOW_HAS_VERTICAL_SCROLL_BAR (W) \
887 ? WINDOW_CONFIG_SCROLL_BAR_COLS (W) \
888 : 0)
890 /* Width of a left scroll bar area in window W, measured in pixels. */
891 #define WINDOW_LEFT_SCROLL_BAR_AREA_WIDTH(W) \
892 (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (W) \
893 ? WINDOW_CONFIG_SCROLL_BAR_WIDTH (W) \
894 : 0)
896 /* Width of a right scroll bar area in window W, measured in pixels. */
897 #define WINDOW_RIGHT_SCROLL_BAR_AREA_WIDTH(W) \
898 (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (W) \
899 ? WINDOW_CONFIG_SCROLL_BAR_WIDTH (W) \
900 : 0)
902 /* Width of scroll bar area in window W, measured in pixels. */
903 #define WINDOW_SCROLL_BAR_AREA_WIDTH(W) \
904 (WINDOW_HAS_VERTICAL_SCROLL_BAR (W) \
905 ? WINDOW_CONFIG_SCROLL_BAR_WIDTH (W) \
906 : 0)
908 /* Return the frame position where the vertical scroll bar of window W
909 starts. */
910 #define WINDOW_SCROLL_BAR_AREA_X(W) \
911 (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (W) \
912 ? WINDOW_BOX_RIGHT_EDGE_X (W) \
913 : WINDOW_LEFT_EDGE_X (W))
915 /* Height that a scroll bar in window W should have, if there is one.
916 Measured in pixels. If scroll bars are turned off, this is still
917 nonzero. */
918 #define WINDOW_CONFIG_SCROLL_BAR_HEIGHT(W) \
919 (W->scroll_bar_height >= 0 \
920 ? W->scroll_bar_height \
921 : FRAME_CONFIG_SCROLL_BAR_HEIGHT (WINDOW_XFRAME (W)))
923 /* Height that a scroll bar in window W should have, if there is one.
924 Measured in lines (characters). If scroll bars are turned off, this
925 is still nonzero. */
926 #define WINDOW_CONFIG_SCROLL_BAR_LINES(W) \
927 (W->scroll_bar_height >= 0 \
928 ? ((W->scroll_bar_height \
929 + WINDOW_FRAME_LINE_HEIGHT (W) - 1) \
930 / WINDOW_FRAME_LINE_HEIGHT (W)) \
931 : FRAME_CONFIG_SCROLL_BAR_LINES (WINDOW_XFRAME (W)))
933 /* Height of a scroll bar in window W, measured in columns. */
934 #define WINDOW_SCROLL_BAR_LINES(W) \
935 (WINDOW_HAS_HORIZONTAL_SCROLL_BAR (W) \
936 ? WINDOW_CONFIG_SCROLL_BAR_LINES (W) \
937 : 0)
939 /* Height of scroll bar area in window W, measured in pixels. */
940 #define WINDOW_SCROLL_BAR_AREA_HEIGHT(W) \
941 (WINDOW_HAS_HORIZONTAL_SCROLL_BAR (W) \
942 ? WINDOW_CONFIG_SCROLL_BAR_HEIGHT (W) \
943 : 0)
945 /* Height in pixels of the mode line.
946 May be zero if W doesn't have a mode line. */
947 #define WINDOW_MODE_LINE_HEIGHT(W) \
948 (window_wants_mode_line ((W)) \
949 ? CURRENT_MODE_LINE_HEIGHT (W) \
950 : 0)
952 #define WINDOW_MODE_LINE_LINES(W) \
953 window_wants_mode_line (W)
955 /* Height in pixels of the header line.
956 Zero if W doesn't have a header line. */
957 #define WINDOW_HEADER_LINE_HEIGHT(W) \
958 (window_wants_header_line (W) \
959 ? CURRENT_HEADER_LINE_HEIGHT (W) \
960 : 0)
962 #define WINDOW_HEADER_LINE_LINES(W) \
963 window_wants_header_line (W)
965 /* Pixel height of window W without mode line, bottom scroll bar and
966 bottom divider. */
967 #define WINDOW_BOX_HEIGHT_NO_MODE_LINE(W) \
968 (WINDOW_PIXEL_HEIGHT (W) \
969 - WINDOW_BOTTOM_DIVIDER_WIDTH (W) \
970 - WINDOW_SCROLL_BAR_AREA_HEIGHT (W) \
971 - WINDOW_MODE_LINE_HEIGHT (W))
973 /* Pixel height of window W without mode and header line and bottom
974 divider. */
975 #define WINDOW_BOX_TEXT_HEIGHT(W) \
976 (WINDOW_PIXEL_HEIGHT ((W)) \
977 - WINDOW_BOTTOM_DIVIDER_WIDTH (W) \
978 - WINDOW_SCROLL_BAR_AREA_HEIGHT (W) \
979 - WINDOW_MODE_LINE_HEIGHT (W) \
980 - WINDOW_HEADER_LINE_HEIGHT (W))
982 /* Return the frame position where the horizontal scroll bar of window W
983 starts. */
984 #define WINDOW_SCROLL_BAR_AREA_Y(W) \
985 (WINDOW_TOP_EDGE_Y (W) \
986 + (WINDOW_HAS_HORIZONTAL_SCROLL_BAR (W) \
987 ? WINDOW_BOX_HEIGHT_NO_MODE_LINE (W) : 0))
989 /* Convert window W relative pixel X to frame pixel coordinates. */
990 #define WINDOW_TO_FRAME_PIXEL_X(W, X) \
991 ((X) + WINDOW_BOX_LEFT_EDGE_X ((W)))
993 /* Convert window W relative pixel Y to frame pixel coordinates. */
994 #define WINDOW_TO_FRAME_PIXEL_Y(W, Y) \
995 ((Y) + WINDOW_TOP_EDGE_Y (W))
997 /* Convert frame relative pixel X to window relative pixel X. */
998 #define FRAME_TO_WINDOW_PIXEL_X(W, X) \
999 ((X) - WINDOW_BOX_LEFT_EDGE_X ((W)))
1001 /* Convert frame relative pixel Y to window relative pixel Y. */
1002 #define FRAME_TO_WINDOW_PIXEL_Y(W, Y) \
1003 ((Y) - WINDOW_TOP_EDGE_Y (W))
1005 /* Convert a text area relative x-position in window W to frame X
1006 pixel coordinates. */
1007 #define WINDOW_TEXT_TO_FRAME_PIXEL_X(W, X) \
1008 (window_box_left ((W), TEXT_AREA) + (X))
1010 /* This is the window in which the terminal's cursor should be left when
1011 nothing is being done with it. This must always be a leaf window, and its
1012 buffer is selected by the top level editing loop at the end of each command.
1014 This value is always the same as FRAME_SELECTED_WINDOW (selected_frame). */
1016 extern Lisp_Object selected_window;
1018 /* This is a time stamp for window selection, so we can find the least
1019 recently used window. Its only users are Fselect_window,
1020 init_window_once, and make_frame. */
1022 extern EMACS_INT window_select_count;
1024 /* The minibuffer window of the selected frame.
1025 Note that you cannot test for minibufferness of an arbitrary window
1026 by comparing against this; use the MINI_WINDOW_P macro instead. */
1028 extern Lisp_Object minibuf_window;
1030 /* Non-nil means it is the window whose mode line should be
1031 shown as the selected window when the minibuffer is selected. */
1033 extern Lisp_Object minibuf_selected_window;
1035 extern Lisp_Object make_window (void);
1036 extern Lisp_Object window_from_coordinates (struct frame *, int, int,
1037 enum window_part *, bool);
1038 extern void resize_frame_windows (struct frame *, int, bool, bool);
1039 extern void restore_window_configuration (Lisp_Object);
1040 extern void delete_all_child_windows (Lisp_Object);
1041 extern void grow_mini_window (struct window *, int, bool);
1042 extern void shrink_mini_window (struct window *, bool);
1043 extern int window_relative_x_coord (struct window *, enum window_part, int);
1045 void run_window_size_change_functions (Lisp_Object);
1047 /* Make WINDOW display BUFFER. RUN_HOOKS_P means it's allowed
1048 to run hooks. See make_frame for a case where it's not allowed. */
1050 void set_window_buffer (Lisp_Object window, Lisp_Object buffer,
1051 bool run_hooks_p, bool keep_margins_p);
1053 /* This is the window where the echo area message was displayed. It
1054 is always a minibuffer window, but it may not be the same window
1055 currently active as a minibuffer. */
1057 extern Lisp_Object echo_area_window;
1059 /* Depth in recursive edits. */
1061 extern EMACS_INT command_loop_level;
1063 /* Depth in minibuffer invocations. */
1065 extern EMACS_INT minibuf_level;
1067 /* Non-zero if we should redraw the mode lines on the next redisplay.
1068 Usually set to a unique small integer so we can track the main causes of
1069 full redisplays in `redisplay--mode-lines-cause'. */
1071 extern int update_mode_lines;
1073 /* Nonzero if window sizes or contents have changed since last
1074 redisplay that finished. Usually set to a unique small integer so
1075 we can track the main causes of full redisplays in
1076 `redisplay--all-windows-cause'. */
1078 extern int windows_or_buffers_changed;
1080 /* The main redisplay routine usually only redisplays the selected-window,
1081 so when something's changed elsewhere, we call one of the functions below
1082 to indicate which other windows might also need to be redisplayed. */
1084 extern void wset_redisplay (struct window *w);
1085 extern void fset_redisplay (struct frame *f);
1086 extern void bset_redisplay (struct buffer *b);
1087 extern void bset_update_mode_line (struct buffer *b);
1088 /* Call this to tell redisplay to look for other windows than selected-window
1089 that need to be redisplayed. Calling one of the *set_redisplay functions
1090 above already does it, so it's only needed in unusual cases. */
1091 extern void redisplay_other_windows (void);
1093 /* Return a pointer to the glyph W's physical cursor is on. Value is
1094 null if W's current matrix is invalid, so that no meaningful glyph
1095 can be returned. */
1097 struct glyph *get_phys_cursor_glyph (struct window *w);
1099 /* True if WINDOW is a valid window. */
1100 #define WINDOW_VALID_P(WINDOW) \
1101 (WINDOWP (WINDOW) && !NILP (XWINDOW (WINDOW)->contents)) \
1103 /* A window of any sort, leaf or interior, is "valid" if its
1104 contents slot is non-nil. */
1105 #define CHECK_VALID_WINDOW(WINDOW) \
1106 CHECK_TYPE (WINDOW_VALID_P (WINDOW), Qwindow_valid_p, WINDOW)
1108 /* True if WINDOW is a live window. */
1109 #define WINDOW_LIVE_P(WINDOW) \
1110 (WINDOWP (WINDOW) && BUFFERP (XWINDOW (WINDOW)->contents))
1112 /* A window is "live" if and only if it shows a buffer. */
1113 #define CHECK_LIVE_WINDOW(WINDOW) \
1114 CHECK_TYPE (WINDOW_LIVE_P (WINDOW), Qwindow_live_p, WINDOW)
1116 /* These used to be in lisp.h. */
1117 extern Lisp_Object Vwindow_list;
1119 extern Lisp_Object window_list (void);
1120 extern Lisp_Object window_parameter (struct window *, Lisp_Object parameter);
1121 extern struct window *decode_live_window (Lisp_Object);
1122 extern struct window *decode_any_window (Lisp_Object);
1123 extern bool compare_window_configurations (Lisp_Object, Lisp_Object, bool);
1124 extern void mark_window_cursors_off (struct window *);
1125 extern bool window_wants_mode_line (struct window *);
1126 extern bool window_wants_header_line (struct window *);
1127 extern int window_internal_height (struct window *);
1128 extern int window_body_width (struct window *w, bool);
1129 enum margin_unit { MARGIN_IN_LINES, MARGIN_IN_PIXELS };
1130 extern int window_scroll_margin (struct window *, enum margin_unit);
1131 extern void temp_output_buffer_show (Lisp_Object);
1132 extern void replace_buffer_in_windows (Lisp_Object);
1133 extern void replace_buffer_in_windows_safely (Lisp_Object);
1134 extern void sanitize_window_sizes (Lisp_Object horizontal);
1135 /* This looks like a setter, but it is a bit special. */
1136 extern void wset_buffer (struct window *, Lisp_Object);
1137 extern bool window_outdated (struct window *);
1138 extern void init_window_once (void);
1139 extern void init_window (void);
1140 extern void syms_of_window (void);
1141 extern void keys_of_window (void);
1142 /* Move cursor to row/column position VPOS/HPOS, pixel coordinates
1143 Y/X. HPOS/VPOS are window-relative row and column numbers and X/Y
1144 are window-relative pixel positions. This is always done during
1145 window update, so the position is the future output cursor position
1146 for currently updated window W. */
1148 INLINE void
1149 output_cursor_to (struct window *w, int vpos, int hpos, int y, int x)
1151 eassert (w);
1152 w->output_cursor.hpos = hpos;
1153 w->output_cursor.vpos = vpos;
1154 w->output_cursor.x = x;
1155 w->output_cursor.y = y;
1158 INLINE_HEADER_END
1160 #endif /* not WINDOW_H_INCLUDED */