]> code.delx.au - gnu-emacs/blobdiff - src/window.h
(set_properties, add_properties, remove_properties):
[gnu-emacs] / src / window.h
index eedaef3be16628dc9457f0ff1b302ad0f7719f22..ba2f81e53d2c94e29f8a572fc732440f685d6738 100644 (file)
@@ -1,11 +1,11 @@
 /* Window definitions for GNU Emacs.
-   Copyright (C) 1985, 1986 Free Software Foundation, Inc.
+   Copyright (C) 1985, 1986, 1993, 1995 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
 GNU Emacs is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 1, or (at your option)
+the Free Software Foundation; either version 2, or (at your option)
 any later version.
 
 GNU Emacs is distributed in the hope that it will be useful,
@@ -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
@@ -27,7 +28,7 @@ All windows in use are arranged into a tree, with pointers up and down.
 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 screen.  Leaf windows never become non-leaves.
+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).  Combination windows can be created
 and deleted at any time.
@@ -38,7 +39,7 @@ A leaf window has a non-nil buffer field, and also
 
 Non-leaf windows are either vertical or horizontal combinations.
 
-A vertical combination window has children that are arranged on the screen
+A vertical combination window has children that are arranged on the frame
 one above the next.  Its vchild 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
@@ -57,26 +58,28 @@ combination window may be leaf windows or vertical combination windows.
 
 At the top of the tree are two windows which have nil as parent.
 The second of these is minibuf_window.  The first one manages all
-the screen area that is not minibuffer, and is called the root window.
+the frame area that is not minibuffer, and is called the 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 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 screen this window is on.  */
-    Lisp_Object screen;
+    /* The frame this window is on.  */
+    Lisp_Object frame;
     /* t if this window is a minibuffer window.  */
     Lisp_Object mini_p;
     /* Following child (to right or down) at same level of tree */
@@ -90,7 +93,7 @@ struct window
     /* The window this one is a child of. */
     Lisp_Object parent;
     /* The upper left corner coordinates of this window,
-       as integers relative to upper left corner of screen = 0, 0 */
+       as integers relative to upper left corner of frame = 0, 0 */
     Lisp_Object left;
     Lisp_Object top;
     /* The size of the window */
@@ -119,14 +122,26 @@ 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 */
-    /* Screen coords of point at that time */
+    /* Frame coords of point at that time */
     Lisp_Object last_point_x;
     Lisp_Object last_point_y;
-    /* Screen coords of mark as of last time display completed */
-    /* May be nil if mark does not exist or was not on screen */
+    /* 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;
     /* Number of characters in buffer past bottom of window,
@@ -134,8 +149,8 @@ struct window
     Lisp_Object window_end_pos;
     /* t if window_end_pos is truly valid.
        This is nil if nontrivial redisplay is preempted
-       since in that case the screen image that window_end_pos
-       did not get onto the screen.  */
+       since in that case the frame image that window_end_pos
+       did not get onto the frame.  */
     Lisp_Object window_end_valid;
     /* Vertical position (relative to window top) of that buffer position
        of the first of those characters */
@@ -150,32 +165,82 @@ 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
    the top level editing loop at the end of each command.
 
    This value is always the same as
-    SCREEN_SELECTED_WINDOW (selected_screen).  */
+    FRAME_SELECTED_WINDOW (selected_frame).  */
 
 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,
-   init_window_once, and make_screen.  */
+   init_window_once, and make_frame.  */
 
 extern int window_select_count;
 
-/* The minibuffer window of the selected screen.
+/* 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 +266,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 +282,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 +305,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 +314,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 +334,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 */ );