X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/6e9ddbb313cf7db66550f93a74cbba12e39e93c0..0877d0dc24ee792b9b14592869ea1aa0934aee58:/src/window.h diff --git a/src/window.h b/src/window.h index ea127ca95a..1ebd35a7c6 100644 --- a/src/window.h +++ b/src/window.h @@ -1,6 +1,6 @@ /* Window definitions for GNU Emacs. - Copyright (C) 1985-1986, 1993, 1995, 1997-2012 - Free Software Foundation, Inc. + Copyright (C) 1985-1986, 1993, 1995, 1997-2013 Free Software + Foundation, Inc. This file is part of GNU Emacs. @@ -22,7 +22,10 @@ along with GNU Emacs. If not, see . */ #include "dispextern.h" -extern Lisp_Object Qleft, Qright; +INLINE_HEADER_BEGIN +#ifndef WINDOW_INLINE +# define WINDOW_INLINE INLINE +#endif /* Windows are allocated as if they were vectors, but then the Lisp data type is changed to Lisp_Window. They are garbage @@ -94,18 +97,17 @@ struct window /* The frame this window is on. */ Lisp_Object frame; - /* t if this window is a minibuffer window. */ - Lisp_Object mini_p; - /* Following (to right or down) and preceding (to left or up) child at same level of tree. */ - Lisp_Object next, prev; + Lisp_Object next; + Lisp_Object prev; /* First child of this window: vchild is used if this is a vertical combination, hchild if this is a horizontal combination. Of the fields vchild, hchild and buffer, one and only one is non-nil unless the window is dead. */ - Lisp_Object hchild, vchild; + Lisp_Object hchild; + Lisp_Object vchild; /* The window this one is a child of. */ Lisp_Object parent; @@ -144,42 +146,10 @@ struct window each one can have its own value of point. */ Lisp_Object pointm; - /* Non-nil means next redisplay must use the value of start - set up for it in advance. Set by scrolling commands. */ - Lisp_Object force_start; - /* Non-nil means we have explicitly changed the value of start, - but that the next redisplay is not obliged to use the new value. - This is used in Fdelete_other_windows to force a call to - Vwindow_scroll_functions; also by Frecenter with argument. */ - Lisp_Object optional_new_start; - - /* Number of columns display within the window is scrolled to the left. */ - Lisp_Object hscroll; - /* Minimum hscroll for automatic hscrolling. This is the value - the user has set, by set-window-hscroll for example. */ - Lisp_Object min_hscroll; - - /* Number saying how recently window was selected. */ - Lisp_Object use_time; - - /* Unique number of window assigned when it was created. */ - Lisp_Object sequence_number; - /* No permanent meaning; used by save-window-excursion's bookkeeping. */ Lisp_Object temslot; - /* text.modified of displayed buffer as of last time display - completed. */ - Lisp_Object last_modified; - /* BUF_OVERLAY_MODIFIED of displayed buffer as of last complete update. */ - Lisp_Object last_overlay_modified; - /* Value of point at that time. */ - Lisp_Object last_point; - /* Non-nil if the buffer was "modified" when the window - was last updated. */ - Lisp_Object last_had_star; - /* This window's vertical scroll bar. This field is only for use by the window-system-dependent code which implements the scroll bars; it can store anything it likes here. If this @@ -189,14 +159,13 @@ struct window /* Width of left and right marginal areas. A value of nil means no margin. */ - Lisp_Object left_margin_cols, right_margin_cols; + Lisp_Object left_margin_cols; + Lisp_Object right_margin_cols; /* Width of left and right fringes. A value of nil or t means use frame values. */ - Lisp_Object left_fringe_width, right_fringe_width; - /* Non-nil means fringes are drawn outside display margins; - othersize draw them between margin areas and text. */ - Lisp_Object fringes_outside_margins; + Lisp_Object left_fringe_width; + Lisp_Object right_fringe_width; /* Pixel width of scroll bars. A value of nil or t means use frame values. */ @@ -206,11 +175,6 @@ struct window no scroll bar. A value of t means use frame value. */ Lisp_Object vertical_scroll_bar_type; - /* Frame coords of mark as of last time display completed */ - /* May be nil if mark does not exist or was not on frame */ - Lisp_Object last_mark_x; - Lisp_Object last_mark_y; - /* Z - the buffer position of the last glyph in the current matrix of W. Only valid if WINDOW_END_VALID is not nil. */ Lisp_Object window_end_pos; @@ -223,18 +187,13 @@ struct window did not get onto the frame. */ Lisp_Object window_end_valid; - /* Non-nil means must regenerate mode line of this window */ - Lisp_Object update_mode_line; - - /* Non-nil means current value of `start' - was the beginning of a line when it was chosen. */ - Lisp_Object start_at_line_beg; - /* Display-table to use for displaying chars in this window. Nil means use the buffer's own display-table. */ Lisp_Object display_table; - /* Non-nil means window is marked as dedicated. */ + /* Non-nil usually means window is marked as dedicated. + Note Lisp code may set this to something beyond Qnil + and Qt, so bitfield can't be used here. */ Lisp_Object dedicated; /* Line number and position of a line somewhere above the top of the @@ -261,13 +220,6 @@ struct window /* t means this window's child windows are not (re-)combined. */ Lisp_Object combination_limit; - /* Alist of triples listing - buffers previously shown in this window. */ - Lisp_Object prev_buffers; - - /* List of buffers re-shown in this window. */ - Lisp_Object next_buffers; - /* An alist with parameters. */ Lisp_Object window_parameters; @@ -279,6 +231,39 @@ struct window struct glyph_matrix *current_matrix; struct glyph_matrix *desired_matrix; + /* The two Lisp_Object fields below are marked in a special way, + which is why they're placed after `current_matrix'. */ + /* Alist of triples listing + buffers previously shown in this window. */ + Lisp_Object prev_buffers; + /* List of buffers re-shown in this window. */ + Lisp_Object next_buffers; + + /* Number saying how recently window was selected. */ + int use_time; + + /* Unique number of window assigned when it was created. */ + int sequence_number; + + /* Number of columns display within the window is scrolled to the left. */ + ptrdiff_t hscroll; + + /* Minimum hscroll for automatic hscrolling. This is the value + the user has set, by set-window-hscroll for example. */ + ptrdiff_t min_hscroll; + + /* Displayed buffer's text modification events counter as of last time + display completed. */ + EMACS_INT last_modified; + + /* Displayed buffer's overlays modification events counter as of last + complete update. */ + EMACS_INT last_overlay_modified; + + /* Value of point at that time. Since this is a position in a buffer, + it should be positive. */ + ptrdiff_t last_point; + /* Scaling factor for the glyph_matrix size calculation in this window. Used if window contains many small images or uses proportional fonts, as the normal may yield a matrix which is too small. */ @@ -302,6 +287,30 @@ struct window /* This is handy for undrawing the cursor. */ int phys_cursor_ascent, phys_cursor_height; + /* Non-zero if this window is a minibuffer window. */ + unsigned mini : 1; + + /* Non-zero means must regenerate mode line of this window. */ + unsigned update_mode_line : 1; + + /* Non-nil if the buffer was "modified" when the window + was last updated. */ + unsigned last_had_star : 1; + + /* Non-zero means current value of `start' + was the beginning of a line when it was chosen. */ + unsigned start_at_line_beg : 1; + + /* Non-zero means next redisplay must use the value of start + set up for it in advance. Set by scrolling commands. */ + unsigned force_start : 1; + + /* Non-zero means we have explicitly changed the value of start, + but that the next redisplay is not obliged to use the new value. + This is used in Fdelete_other_windows to force a call to + Vwindow_scroll_functions; also by Frecenter with argument. */ + unsigned optional_new_start : 1; + /* Non-zero means the cursor is currently displayed. This can be set to zero by functions overpainting the cursor image. */ unsigned phys_cursor_on_p : 1; @@ -326,18 +335,95 @@ struct window accept that. */ unsigned frozen_window_start_p : 1; + /* Non-zero means fringes are drawn outside display margins. + Otherwise draw them between margin areas and text. */ + unsigned fringes_outside_margins : 1; + /* Amount by which lines of this window are scrolled in y-direction (smooth scrolling). */ int vscroll; - /* Z_BYTE - the buffer position of the last glyph in the current matrix - of W. Only valid if WINDOW_END_VALID is not nil. */ - int window_end_bytepos; + /* Z_BYTE - Buffer position of the last glyph in the current matrix of W. + Should be nonnegative, and only valid if window_end_valid is not nil. */ + ptrdiff_t window_end_bytepos; }; +/* Most code should use these functions to set Lisp fields in struct + window. */ +WINDOW_INLINE void +wset_frame (struct window *w, Lisp_Object val) +{ + w->frame = val; +} +WINDOW_INLINE void +wset_left_col (struct window *w, Lisp_Object val) +{ + w->left_col = val; +} +WINDOW_INLINE void +wset_next (struct window *w, Lisp_Object val) +{ + w->next = val; +} +WINDOW_INLINE void +wset_prev (struct window *w, Lisp_Object val) +{ + w->prev = val; +} +WINDOW_INLINE void +wset_redisplay_end_trigger (struct window *w, Lisp_Object val) +{ + w->redisplay_end_trigger = val; +} +WINDOW_INLINE void +wset_top_line (struct window *w, Lisp_Object val) +{ + w->top_line = val; +} +WINDOW_INLINE void +wset_total_cols (struct window *w, Lisp_Object val) +{ + w->total_cols = val; +} +WINDOW_INLINE void +wset_total_lines (struct window *w, Lisp_Object val) +{ + w->total_lines = val; +} +WINDOW_INLINE void +wset_vertical_scroll_bar (struct window *w, Lisp_Object val) +{ + w->vertical_scroll_bar = val; +} +WINDOW_INLINE void +wset_window_end_pos (struct window *w, Lisp_Object val) +{ + w->window_end_pos = val; +} +WINDOW_INLINE void +wset_window_end_valid (struct window *w, Lisp_Object val) +{ + w->window_end_valid = val; +} +WINDOW_INLINE void +wset_window_end_vpos (struct window *w, Lisp_Object val) +{ + w->window_end_vpos = val; +} +WINDOW_INLINE void +wset_prev_buffers (struct window *w, Lisp_Object val) +{ + w->prev_buffers = val; +} +WINDOW_INLINE void +wset_next_buffers (struct window *w, Lisp_Object val) +{ + w->next_buffers = val; +} + /* 1 if W is a minibuffer window. */ -#define MINI_WINDOW_P(W) (!NILP ((W)->mini_p)) +#define MINI_WINDOW_P(W) ((W)->mini) /* General window layout: @@ -383,13 +469,13 @@ struct window This includes scroll bars and fringes. */ #define WINDOW_TOTAL_COLS(W) \ - (XFASTINT ((W)->total_cols)) + (XFASTINT (W->total_cols)) /* Return the height of window W in canonical line units. This includes header and mode lines, if any. */ #define WINDOW_TOTAL_LINES(W) \ - (XFASTINT ((W)->total_lines)) + (XFASTINT (W->total_lines)) /* Return the total pixel width of window W. */ @@ -417,7 +503,7 @@ struct window This includes a left-hand scroll bar, if any. */ #define WINDOW_LEFT_EDGE_COL(W) \ - (XFASTINT ((W)->left_col)) + (XFASTINT (W->left_col)) /* Return the canonical frame column before which window W ends. This includes a right-hand scroll bar, if any. */ @@ -429,7 +515,7 @@ struct window This includes a header line, if any. */ #define WINDOW_TOP_EDGE_LINE(W) \ - (XFASTINT ((W)->top_line)) + (XFASTINT (W->top_line)) /* Return the canonical frame line before which window W ends. This includes a mode line, if any. */ @@ -533,32 +619,32 @@ struct window /* Width of left margin area in columns. */ -#define WINDOW_LEFT_MARGIN_COLS(W) \ - (NILP ((W)->left_margin_cols) \ - ? 0 \ - : XINT ((W)->left_margin_cols)) +#define WINDOW_LEFT_MARGIN_COLS(W) \ + (NILP (W->left_margin_cols) \ + ? 0 \ + : XINT (W->left_margin_cols)) /* Width of right marginal area in columns. */ -#define WINDOW_RIGHT_MARGIN_COLS(W) \ - (NILP ((W)->right_margin_cols) \ - ? 0 \ - : XINT ((W)->right_margin_cols)) +#define WINDOW_RIGHT_MARGIN_COLS(W) \ + (NILP (W->right_margin_cols) \ + ? 0 \ + : XINT (W->right_margin_cols)) /* Width of left margin area in pixels. */ -#define WINDOW_LEFT_MARGIN_WIDTH(W) \ - (NILP ((W)->left_margin_cols) \ - ? 0 \ - : (XINT ((W)->left_margin_cols) \ +#define WINDOW_LEFT_MARGIN_WIDTH(W) \ + (NILP (W->left_margin_cols) \ + ? 0 \ + : (XINT (W->left_margin_cols) \ * WINDOW_FRAME_COLUMN_WIDTH (W))) /* Width of right marginal area in pixels. */ -#define WINDOW_RIGHT_MARGIN_WIDTH(W) \ - (NILP ((W)->right_margin_cols) \ - ? 0 \ - : (XINT ((W)->right_margin_cols) \ +#define WINDOW_RIGHT_MARGIN_WIDTH(W) \ + (NILP (W->right_margin_cols) \ + ? 0 \ + : (XINT (W->right_margin_cols) \ * WINDOW_FRAME_COLUMN_WIDTH (W))) /* Total width of fringes reserved for drawing truncation bitmaps, @@ -567,37 +653,37 @@ struct window sizes aren't pixel values. If it weren't the case, we wouldn't be able to split windows horizontally nicely. */ -#define WINDOW_FRINGE_COLS(W) \ - ((INTEGERP ((W)->left_fringe_width) \ - || INTEGERP ((W)->right_fringe_width)) \ - ? ((WINDOW_LEFT_FRINGE_WIDTH (W) \ - + WINDOW_RIGHT_FRINGE_WIDTH (W) \ - + WINDOW_FRAME_COLUMN_WIDTH (W) - 1) \ - / WINDOW_FRAME_COLUMN_WIDTH (W)) \ +#define WINDOW_FRINGE_COLS(W) \ + ((INTEGERP (W->left_fringe_width) \ + || INTEGERP (W->right_fringe_width)) \ + ? ((WINDOW_LEFT_FRINGE_WIDTH (W) \ + + WINDOW_RIGHT_FRINGE_WIDTH (W) \ + + WINDOW_FRAME_COLUMN_WIDTH (W) - 1) \ + / WINDOW_FRAME_COLUMN_WIDTH (W)) \ : FRAME_FRINGE_COLS (WINDOW_XFRAME (W))) /* Column-width of the left and right fringe. */ -#define WINDOW_LEFT_FRINGE_COLS(W) \ - ((WINDOW_LEFT_FRINGE_WIDTH ((W)) \ - + WINDOW_FRAME_COLUMN_WIDTH (W) - 1) \ +#define WINDOW_LEFT_FRINGE_COLS(W) \ + ((WINDOW_LEFT_FRINGE_WIDTH ((W)) \ + + WINDOW_FRAME_COLUMN_WIDTH (W) - 1) \ / WINDOW_FRAME_COLUMN_WIDTH (W)) -#define WINDOW_RIGHT_FRINGE_COLS(W) \ - ((WINDOW_RIGHT_FRINGE_WIDTH ((W)) \ - + WINDOW_FRAME_COLUMN_WIDTH (W) - 1) \ +#define WINDOW_RIGHT_FRINGE_COLS(W) \ + ((WINDOW_RIGHT_FRINGE_WIDTH ((W)) \ + + WINDOW_FRAME_COLUMN_WIDTH (W) - 1) \ / WINDOW_FRAME_COLUMN_WIDTH (W)) /* Pixel-width of the left and right fringe. */ #define WINDOW_LEFT_FRINGE_WIDTH(W) \ - (INTEGERP ((W)->left_fringe_width) \ - ? XFASTINT ((W)->left_fringe_width) \ + (INTEGERP (W->left_fringe_width) \ + ? XFASTINT (W->left_fringe_width) \ : FRAME_LEFT_FRINGE_WIDTH (WINDOW_XFRAME (W))) #define WINDOW_RIGHT_FRINGE_WIDTH(W) \ - (INTEGERP ((W)->right_fringe_width) \ - ? XFASTINT ((W)->right_fringe_width) \ + (INTEGERP (W->right_fringe_width) \ + ? XFASTINT (W->right_fringe_width) \ : FRAME_RIGHT_FRINGE_WIDTH (WINDOW_XFRAME (W))) /* Total width of fringes in pixels. */ @@ -608,42 +694,42 @@ struct window /* Are fringes outside display margins in window W. */ #define WINDOW_HAS_FRINGES_OUTSIDE_MARGINS(W) \ - (!NILP ((W)->fringes_outside_margins)) + ((W)->fringes_outside_margins) /* Say whether scroll bars are currently enabled for window W, and which side they are on. */ #define WINDOW_VERTICAL_SCROLL_BAR_TYPE(w) \ - (EQ ((w)->vertical_scroll_bar_type, Qt) \ + (EQ (w->vertical_scroll_bar_type, Qt) \ ? FRAME_VERTICAL_SCROLL_BAR_TYPE (WINDOW_XFRAME (w)) \ - : EQ ((w)->vertical_scroll_bar_type, Qleft) \ + : EQ (w->vertical_scroll_bar_type, Qleft) \ ? vertical_scroll_bar_left \ - : EQ ((w)->vertical_scroll_bar_type, Qright) \ + : EQ (w->vertical_scroll_bar_type, Qright) \ ? vertical_scroll_bar_right \ : vertical_scroll_bar_none) \ #define WINDOW_HAS_VERTICAL_SCROLL_BAR(w) \ - (EQ ((w)->vertical_scroll_bar_type, Qt) \ + (EQ (w->vertical_scroll_bar_type, Qt) \ ? FRAME_HAS_VERTICAL_SCROLL_BARS (WINDOW_XFRAME (w)) \ - : !NILP ((w)->vertical_scroll_bar_type)) + : !NILP (w->vertical_scroll_bar_type)) #define WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT(w) \ - (EQ ((w)->vertical_scroll_bar_type, Qt) \ + (EQ (w->vertical_scroll_bar_type, Qt) \ ? FRAME_HAS_VERTICAL_SCROLL_BARS_ON_LEFT (WINDOW_XFRAME (w)) \ - : EQ ((w)->vertical_scroll_bar_type, Qleft)) + : EQ (w->vertical_scroll_bar_type, Qleft)) -#define WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT(w) \ - (EQ ((w)->vertical_scroll_bar_type, Qt) \ - ? FRAME_HAS_VERTICAL_SCROLL_BARS_ON_RIGHT (WINDOW_XFRAME (w))\ - : EQ ((w)->vertical_scroll_bar_type, Qright)) +#define WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT(w) \ + (EQ (w->vertical_scroll_bar_type, Qt) \ + ? FRAME_HAS_VERTICAL_SCROLL_BARS_ON_RIGHT (WINDOW_XFRAME (w)) \ + : EQ (w->vertical_scroll_bar_type, Qright)) /* Width that a scroll bar in window W should have, if there is one. Measured in pixels. If scroll bars are turned off, this is still nonzero. */ #define WINDOW_CONFIG_SCROLL_BAR_WIDTH(w) \ - (INTEGERP ((w)->scroll_bar_width) \ - ? XFASTINT ((w)->scroll_bar_width) \ + (INTEGERP (w->scroll_bar_width) \ + ? XFASTINT (w->scroll_bar_width) \ : FRAME_CONFIG_SCROLL_BAR_WIDTH (WINDOW_XFRAME (w))) /* Width that a scroll bar in window W should have, if there is one. @@ -651,8 +737,8 @@ struct window this is still nonzero. */ #define WINDOW_CONFIG_SCROLL_BAR_COLS(w) \ - (INTEGERP ((w)->scroll_bar_width) \ - ? ((XFASTINT ((w)->scroll_bar_width) \ + (INTEGERP (w->scroll_bar_width) \ + ? ((XFASTINT (w->scroll_bar_width) \ + WINDOW_FRAME_COLUMN_WIDTH (w) - 1) \ / WINDOW_FRAME_COLUMN_WIDTH (w)) \ : FRAME_CONFIG_SCROLL_BAR_COLS (WINDOW_XFRAME (w))) @@ -662,14 +748,14 @@ struct window the right in this frame, or there are no scroll bars, value is 0. */ #define WINDOW_LEFT_SCROLL_BAR_COLS(w) \ - (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (w) \ + (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (w) \ ? (WINDOW_CONFIG_SCROLL_BAR_COLS (w)) \ : 0) /* Width of a left scroll bar area in window W , measured in pixels. */ -#define WINDOW_LEFT_SCROLL_BAR_AREA_WIDTH(w) \ - (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (w) \ +#define WINDOW_LEFT_SCROLL_BAR_AREA_WIDTH(w) \ + (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (w) \ ? (WINDOW_CONFIG_SCROLL_BAR_COLS (w) * WINDOW_FRAME_COLUMN_WIDTH (w)) \ : 0) @@ -678,7 +764,7 @@ struct window the left in this frame, or there are no scroll bars, value is 0. */ #define WINDOW_RIGHT_SCROLL_BAR_COLS(w) \ - (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (w) \ + (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (w) \ ? WINDOW_CONFIG_SCROLL_BAR_COLS (w) \ : 0) @@ -700,7 +786,7 @@ struct window /* Width of a left scroll bar area in window W , measured in pixels. */ #define WINDOW_SCROLL_BAR_AREA_WIDTH(w) \ - (WINDOW_HAS_VERTICAL_SCROLL_BAR (w) \ + (WINDOW_HAS_VERTICAL_SCROLL_BAR (w) \ ? (WINDOW_CONFIG_SCROLL_BAR_COLS (w) * WINDOW_FRAME_COLUMN_WIDTH (w)) \ : 0) @@ -721,7 +807,7 @@ struct window ? CURRENT_MODE_LINE_HEIGHT (W) \ : 0) -#define WINDOW_MODE_LINE_LINES(W) \ +#define WINDOW_MODE_LINE_LINES(W) \ (!! WINDOW_WANTS_MODELINE_P ((W))) /* Height in pixels, and in lines, of the header line. @@ -732,7 +818,7 @@ struct window ? CURRENT_HEADER_LINE_HEIGHT (W) \ : 0) -#define WINDOW_HEADER_LINE_LINES(W) \ +#define WINDOW_HEADER_LINE_LINES(W) \ (!! WINDOW_WANTS_HEADER_LINE_P ((W))) /* Pixel height of window W without mode line. */ @@ -743,36 +829,36 @@ struct window /* Pixel height of window W without mode and header line. */ -#define WINDOW_BOX_TEXT_HEIGHT(W) \ - (WINDOW_TOTAL_HEIGHT ((W)) \ - - WINDOW_MODE_LINE_HEIGHT ((W)) \ +#define WINDOW_BOX_TEXT_HEIGHT(W) \ + (WINDOW_TOTAL_HEIGHT ((W)) \ + - WINDOW_MODE_LINE_HEIGHT ((W)) \ - WINDOW_HEADER_LINE_HEIGHT ((W))) /* Convert window W relative pixel X to frame pixel coordinates. */ -#define WINDOW_TO_FRAME_PIXEL_X(W, X) \ +#define WINDOW_TO_FRAME_PIXEL_X(W, X) \ ((X) + WINDOW_BOX_LEFT_EDGE_X ((W))) /* Convert window W relative pixel Y to frame pixel coordinates. */ -#define WINDOW_TO_FRAME_PIXEL_Y(W, Y) \ +#define WINDOW_TO_FRAME_PIXEL_Y(W, Y) \ ((Y) + WINDOW_TOP_EDGE_Y ((W))) /* Convert frame relative pixel X to window relative pixel X. */ -#define FRAME_TO_WINDOW_PIXEL_X(W, X) \ +#define FRAME_TO_WINDOW_PIXEL_X(W, X) \ ((X) - WINDOW_BOX_LEFT_EDGE_X ((W))) /* Convert frame relative pixel Y to window relative pixel Y. */ -#define FRAME_TO_WINDOW_PIXEL_Y(W, Y) \ +#define FRAME_TO_WINDOW_PIXEL_Y(W, Y) \ ((Y) - WINDOW_TOP_EDGE_Y ((W))) /* Convert a text area relative x-position in window W to frame X pixel coordinates. */ -#define WINDOW_TEXT_TO_FRAME_PIXEL_X(W, X) \ +#define WINDOW_TEXT_TO_FRAME_PIXEL_X(W, X) \ (window_box_left ((W), TEXT_AREA) + (X)) /* This is the window in which the terminal's cursor should @@ -810,14 +896,9 @@ extern Lisp_Object Vmouse_window; extern Lisp_Object Vmouse_event; -EXFUN (Fnext_window, 3); -EXFUN (Fselect_window, 2); -EXFUN (Fset_window_buffer, 3); -EXFUN (Fset_window_point, 2); extern Lisp_Object make_window (void); extern Lisp_Object window_from_coordinates (struct frame *, int, int, enum window_part *, int); -EXFUN (Fwindow_dedicated_p, 1); extern void resize_frame_windows (struct frame *, int, int); extern void delete_all_child_windows (Lisp_Object); extern void freeze_window_starts (struct frame *, int); @@ -852,13 +933,8 @@ extern EMACS_INT minibuf_level; extern int update_mode_lines; -/* Nonzero if BEGV - BEG or Z - ZV of current buffer has changed since - last redisplay that finished. */ - -extern int clip_changed; - /* Nonzero if window sizes or contents have changed since last - redisplay that finished */ + redisplay that finished. */ extern int windows_or_buffers_changed; @@ -866,11 +942,6 @@ extern int windows_or_buffers_changed; extern int cursor_type_changed; -/* Number of windows displaying the selected buffer. Normally this is - 1, but it can be more. */ - -extern int buffer_shared; - /* If *ROWS or *COLS are too small a size for FRAME, set them to the minimum allowable size. */ @@ -882,38 +953,47 @@ extern void check_frame_size (struct frame *frame, int *rows, int *cols); struct glyph *get_phys_cursor_glyph (struct window *w); -/* Value is non-zero if WINDOW is a live window. */ +/* Value is non-zero if WINDOW is a valid window. */ +#define WINDOW_VALID_P(WINDOW) \ + (WINDOWP (WINDOW) \ + && (!NILP (XWINDOW (WINDOW)->buffer) \ + || !NILP (XWINDOW (WINDOW)->vchild) \ + || !NILP (XWINDOW (WINDOW)->hchild))) -#define WINDOW_LIVE_P(WINDOW) \ - (WINDOWP ((WINDOW)) && !NILP (XWINDOW ((WINDOW))->buffer)) +/* A window of any sort, leaf or interior, is "valid" if one + of its buffer, vchild, or hchild members is non-nil. */ +#define CHECK_VALID_WINDOW(WINDOW) \ + CHECK_TYPE (WINDOW_VALID_P (WINDOW), Qwindow_valid_p, WINDOW) +/* Value is non-zero if WINDOW is a live window. */ +#define WINDOW_LIVE_P(WINDOW) \ + (WINDOWP (WINDOW) && !NILP (XWINDOW (WINDOW)->buffer)) + +/* A window is "live" if and only if it shows a buffer. */ +#define CHECK_LIVE_WINDOW(WINDOW) \ + CHECK_TYPE (WINDOW_LIVE_P (WINDOW), Qwindow_live_p, WINDOW) /* These used to be in lisp.h. */ extern Lisp_Object Qwindowp, Qwindow_live_p; extern Lisp_Object Vwindow_list; -EXFUN (Fwindow_buffer, 1); -EXFUN (Fget_buffer_window, 2); -EXFUN (Fwindow_minibuffer_p, 1); -EXFUN (Fselected_window, 0); -EXFUN (Fframe_root_window, 1); -EXFUN (Fframe_first_window, 1); -EXFUN (Fset_frame_selected_window, 3); -EXFUN (Fset_window_configuration, 1); -EXFUN (Fcurrent_window_configuration, 1); -extern int compare_window_configurations (Lisp_Object, Lisp_Object, int); -EXFUN (Fpos_visible_in_window_p, 3); +extern struct window *decode_live_window (Lisp_Object); +extern struct window *decode_any_window (Lisp_Object); +extern bool compare_window_configurations (Lisp_Object, Lisp_Object, bool); extern void mark_window_cursors_off (struct window *); extern int window_internal_height (struct window *); extern int window_body_cols (struct window *w); -EXFUN (Frecenter, 1); extern void temp_output_buffer_show (Lisp_Object); extern void replace_buffer_in_windows (Lisp_Object); extern void replace_buffer_in_windows_safely (Lisp_Object); +/* This looks like a setter, but it is a bit special. */ +extern void wset_buffer (struct window *, Lisp_Object); extern void init_window_once (void); extern void init_window (void); extern void syms_of_window (void); extern void keys_of_window (void); +INLINE_HEADER_END + #endif /* not WINDOW_H_INCLUDED */