/* Window definitions for GNU Emacs.
- Copyright (C) 1985, 1986, 1992 Free Software Foundation, Inc.
+ Copyright (C) 1985, 1986, 1993, 1995 Free Software Foundation, Inc.
This file is part of GNU Emacs.
You should have received a copy of the GNU General Public License
along with GNU Emacs; see the file COPYING. If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
/* Windows are allocated as if they were vectors, but then the
minibuffer, prev of the minibuf window is the root window and next of
the root window is the minibuf window. On minibufferless screens or
minibuffer-only screens, the root window and the minibuffer window are
-one and the same, so its prev and next members are nil. */
+one and the same, so its prev and next members are nil.
+A dead window has its buffer, hchild, and vchild windows all nil. */
struct window
{
/* The first two fields are really the header of a vector */
/* The window code does not refer to them. */
- int size;
+ EMACS_INT size;
struct Lisp_Vector *vec_next;
/* The frame this window is on. */
Lisp_Object frame;
/* 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. */
+ Lisp_Object optional_new_start;
/* Number of columns display within the window is scrolled to the left. */
Lisp_Object hscroll;
/* Number saying how recently window was selected */
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
+ 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 vertical_scroll_bar;
+
/* The rest are currently not used or only half used */
/* Frame coords of point at that time */
Lisp_Object last_point_x;
Lisp_Object display_table;
/* Non-nil means window is marked as dedicated. */
Lisp_Object dedicated;
+ /* Line number and position of a line somewhere above the
+ top of the screen. */
+ /* If this field is nil, it means we don't have a base line. */
+ Lisp_Object base_line_number;
+ /* If this field is nil, it means we don't have a base line.
+ If it is a buffer, it means don't display the line number
+ as long as the window shows that buffer. */
+ Lisp_Object base_line_pos;
+ /* If we have highlighted the region (or any part of it),
+ this is the mark position that we used, as an integer. */
+ Lisp_Object region_showing;
+ /* The column number currently displayed in this window's mode line,
+ or nil if column numbers are not being displayed. */
+ Lisp_Object column_number_displayed;
+ /* If redisplay in this window goes beyond this buffer position,
+ must run the redisplay-end-trigger-hook. */
+ Lisp_Object redisplay_end_trigger;
};
/* 1 if W is a minibuffer window. */
#define MINI_WINDOW_P(W) (!EQ ((W)->mini_p, Qnil))
+/* Return the frame column at which the text in window W starts.
+ This is different from the `left' field because it does not include
+ a left-hand scroll bar if any. */
+
+#define WINDOW_LEFT_MARGIN(W) \
+ (XFASTINT ((W)->left) \
+ + FRAME_LEFT_SCROLL_BAR_WIDTH (XFRAME (WINDOW_FRAME (W))))
+
+/* Return the frame column before window W ends.
+ This includes a right-hand scroll bar, if any. */
+
+#define WINDOW_RIGHT_EDGE(W) \
+ (XFASTINT ((W)->left) + XFASTINT ((W)->width))
+
+/* Return the frame column before which the text in window W ends.
+ This is different from WINDOW_RIGHT_EDGE because it does not include
+ a scroll bar or window-separating line on the right edge. */
+
+#define WINDOW_RIGHT_MARGIN(W) \
+ (WINDOW_RIGHT_EDGE (W) \
+ - (! FRAME_HAS_VERTICAL_SCROLL_BARS (XFRAME (WINDOW_FRAME (W))) \
+ ? ((WINDOW_RIGHTMOST_P (W)) ? 0 : 1) \
+ : FRAME_HAS_VERTICAL_SCROLL_BARS_ON_RIGHT (XFRAME (WINDOW_FRAME (W))) \
+ ? FRAME_SCROLL_BAR_COLS (XFRAME (WINDOW_FRAME (W))) \
+ : 0))
+
+/* 1 if window W takes up the full width of its frame. */
+
+#define WINDOW_FULL_WIDTH_P(W) \
+ (XFASTINT ((W)->width) == FRAME_WINDOW_WIDTH (XFRAME (WINDOW_FRAME (W))))
+
+/* 1 if window W's has no other windows to its right in its frame. */
+
+#define WINDOW_RIGHTMOST_P(W) \
+ (WINDOW_RIGHT_EDGE (W) == FRAME_WINDOW_WIDTH (XFRAME (WINDOW_FRAME (W))))
+
/* 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
/* Last mouse-click event (nil if no mouse support). */
extern Lisp_Object Vmouse_event;
-extern Lisp_Object Fnext_window ();
-extern Lisp_Object Fselect_window ();
-extern Lisp_Object Fdisplay_buffer ();
-extern Lisp_Object Fset_window_buffer ();
+EXFUN (Fnext_window, 3);
+EXFUN (Fselect_window, 1);
+EXFUN (Fdisplay_buffer, 3);
+EXFUN (Fset_window_buffer, 2);
+extern Lisp_Object make_window P_ ((void));
+extern void delete_window P_ ((Lisp_Object));
+extern Lisp_Object window_from_coordinates P_ ((struct frame *, int, int, int *));
+EXFUN (Fwindow_dedicated_p, 1);
+extern int window_height P_ ((Lisp_Object));
+extern int window_width P_ ((Lisp_Object));
+extern void set_window_height P_ ((Lisp_Object, int, int));
+extern void set_window_width P_ ((Lisp_Object, int, int));
+extern void change_window_height P_ ((int, int));
+extern void delete_all_subwindows P_ ((struct window *));
/* Prompt to display in front of the minibuffer contents. */
-extern char *minibuf_prompt;
+extern Lisp_Object minibuf_prompt;
/* The visual width of the above. */
extern int minibuf_prompt_width;
minibuf_prompt as well as the buffer. */
extern char *echo_area_glyphs;
+/* This is the length of the message in echo_area_glyphs. */
+extern int echo_area_glyphs_length;
+
+/* Value of echo_area_glyphs when it was last acted on.
+ If this is nonzero, there is a message on the frame
+ in the minibuffer and it should be erased as soon
+ as it is no longer requested to appear. */
+extern char *previous_echo_glyphs;
+
+/* 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. */
+extern Lisp_Object echo_area_window;
+
/* Depth in recursive edits. */
extern int command_loop_level;
/* true iff we should redraw the mode lines on the next redisplay. */
extern int update_mode_lines;
-/* Minimum value of GPT since last redisplay that finished. */
+/* Minimum value of GPT - BEG since last redisplay that finished. */
extern int beg_unchanged;
extern int end_unchanged;
/* MODIFF as of last redisplay that finished;
- if it matches MODIFF, beg_unchanged and end_unchangedn
+ if it matches MODIFF, beg_unchanged and end_unchanged
contain no useful information. */
extern int unchanged_modified;
+/* BUF_OVERLAY_MODIFF of current buffer, as of last redisplay that finished;
+ if it matches BUF_OVERLAY_MODIFF, beg_unchanged and end_unchanged
+ contain no useful information. */
+extern int overlay_unchanged_modified;
+
/* Nonzero if BEGV - BEG or Z - ZV of current buffer has changed
since last redisplay that finished. */
extern int clip_changed;
/* If *ROWS or *COLS are too small a size for FRAME, set them to the
minimum allowable size. */
-extern void check_frame_size ( /* FRAME_PTR frame, int *rows, int *cols */ );
+extern void check_frame_size P_ ((struct frame *frame, int *rows, int *cols));