]> code.delx.au - gnu-emacs/blobdiff - src/window.h
(Ffile_attributes): Use cast to avoid warnings.
[gnu-emacs] / src / window.h
index 8cb36ef0a8d4577d0924193fce2b5b2a9a7da50f..0e35ad0d8a732c80d1d3e7741fb0c10ba8f68ab5 100644 (file)
@@ -1,5 +1,5 @@
 /* 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.
 
@@ -15,7 +15,8 @@ GNU General Public License for more details.
 
 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
@@ -63,17 +64,19 @@ 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 root instead.
 
-In any case, prev of the minibuf window is the root window and
-next of the root window is the minibuf window.  To find the
-root window at any time, do XWINDOW (minibuf_window)->prev.
+In any case, on screens which have an ordinary window and a
+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.
 
-*/
+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;
@@ -109,6 +112,9 @@ struct window
     /* 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 */
@@ -119,8 +125,20 @@ struct window
     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;
@@ -150,12 +168,63 @@ struct window
     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 right-hand scroll bar if any.  */
+
+#define WINDOW_RIGHT_MARGIN(W) \
+     (WINDOW_RIGHT_EDGE (W) \
+      - (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
@@ -174,8 +243,7 @@ extern int window_select_count;
 
 /* The minibuffer window of the selected frame.
    Note that you cannot test for minibufferness of an arbitrary window
-   by comparing against this; but you can test for minibufferness of
-   the selected window or of any window that is displayed.  */
+   by comparing against this; use the MINI_WINDOW_P macro instead.  */
 
 extern Lisp_Object minibuf_window;
 
@@ -201,9 +269,12 @@ extern Lisp_Object Fnext_window ();
 extern Lisp_Object Fselect_window ();
 extern Lisp_Object Fdisplay_buffer ();
 extern Lisp_Object Fset_window_buffer ();
+extern Lisp_Object make_window ();
+extern Lisp_Object window_from_coordinates ();
+extern Lisp_Object Fwindow_dedicated_p ();
 
 /* 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;
@@ -214,6 +285,20 @@ 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;
 
@@ -223,7 +308,7 @@ extern int minibuf_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;
 
@@ -232,10 +317,15 @@ 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;
@@ -247,3 +337,7 @@ extern int windows_or_buffers_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.  */
+extern void check_frame_size ( /* FRAME_PTR frame, int *rows, int *cols */ );