(specpdl_ptr): Declare volatile.
[bpt/emacs.git] / src / window.h
index bdc3080..50357d3 100644 (file)
@@ -1,5 +1,6 @@
 /* Window definitions for GNU Emacs.
-   Copyright (C) 1985, 1986, 1993, 1995 Free Software Foundation, Inc.
+   Copyright (C) 1985, 1986, 1993, 1995, 1997, 1998, 1999, 2000, 2001
+   Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -126,10 +127,15 @@ struct window
        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.  */
+       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 */
@@ -202,7 +208,11 @@ struct window
     Lisp_Object redisplay_end_trigger;
     /* Non-nil means don't delete this window for becoming "too small".  */
     Lisp_Object too_small_ok;
-    
+
+    /* Original window height and top before mini-window was
+       enlarged. */
+    Lisp_Object orig_height, orig_top;
+
     /* No Lisp data may follow below this point without changing
        mark_object in alloc.c.  The member current_matrix must be the
        first non-Lisp member.  */
@@ -218,17 +228,17 @@ struct window
     /* Intended cursor position.   This is a position within the
        glyph matrix.  */
     struct cursor_pos cursor;
-    
+
     /* Where the cursor actually is.  */
     struct cursor_pos phys_cursor;
-    
-    /* Cursor type last drawn on the window.  Used for X frames; -1
-       initially.  */
-    int phys_cursor_type;
+
+    /* Cursor type and width of last cursor drawn on the window.
+       Used for X and w32 frames; -1 initially.  */
+    int phys_cursor_type, phys_cursor_width;
 
     /* This is handy for undrawing the cursor.  */
     int phys_cursor_ascent, phys_cursor_height;
-    
+
     /* 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;
@@ -251,20 +261,30 @@ struct window
     /* 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;
+
+    /* 1 means the window start of this window is frozen and may not
+       be changed during redisplay.  If point is not in the window,
+       accept that.  */
+    unsigned frozen_window_start_p : 1;
+
+    /* 1 means that this window's height is temporarily fixed.  Used
+       in resize_mini_window to precent resizing selected_window, if
+       possible.  */
+    unsigned height_fixed_p : 1;
 };
 
 /* 1 if W is a minibuffer window.  */
 
-#define MINI_WINDOW_P(W)       (!EQ ((W)->mini_p, Qnil))
+#define MINI_WINDOW_P(W)       (!NILP ((W)->mini_p))
 
 /* Return the window 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))))
@@ -285,16 +305,16 @@ struct window
          ? FRAME_SCROLL_BAR_COLS (XFRAME (WINDOW_FRAME (W))) \
          : 0))
 
-/* 1 if window W takes up the full width of its frame.  */ 
+/* 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.  */ 
+/* 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
@@ -318,6 +338,11 @@ extern int window_select_count;
 
 extern Lisp_Object minibuf_window;
 
+/* Non-nil means it is the window whose mode line should be
+   shown as the selected window when the minibuffer is selected.  */
+
+extern Lisp_Object minibuf_selected_window;
+
 /* Non-nil => window to for C-M-v to scroll when the minibuffer is
    selected.  */
 
@@ -349,16 +374,26 @@ EXFUN (Fwindow_hscroll, 1);
 EXFUN (Fset_window_vscroll, 2);
 EXFUN (Fwindow_vscroll, 1);
 EXFUN (Fset_window_margins, 3);
+EXFUN (Fwindow_live_p, 1);
+EXFUN (Fset_window_point, 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 *, int));
+extern Lisp_Object window_from_coordinates P_ ((struct frame *, int, int,
+                                               enum window_part *, 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 change_window_heights P_ ((Lisp_Object, int));
 extern void delete_all_subwindows P_ ((struct window *));
+extern void freeze_window_starts P_ ((struct frame *, int));
+extern void foreach_window P_ ((struct frame *,
+                               int (* fn) (struct window *, void *),
+                               void *));
+extern void grow_mini_window P_ ((struct window *, int));
+extern void shrink_mini_window P_ ((struct window *));
+
 
 /* Make WINDOW display BUFFER as its contents.  RUN_HOOKS_P non-zero
    means it's allowed to run hooks.  See make_frame for a case where
@@ -375,30 +410,6 @@ extern Lisp_Object minibuf_prompt;
 
 extern int minibuf_prompt_width;
 
-/* Message to display instead of minibuffer contents.  This is what
-   the functions error and message make, and command echoing uses it
-   as well. It overrides the minibuf_prompt as well as the buffer.  */
-
-extern char *echo_area_glyphs;
-
-/* A Lisp string to display instead of mini-buffer contents, analogous
-   to echo_area_glyphs.  If this is a string, display that string.
-   Otherwise, if echo_area_glyphs is non-null, display that.  */
-
-extern Lisp_Object echo_area_message;
-
-/* 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;
-
-extern Lisp_Object previous_echo_area_message;
-
 /* 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.  */
@@ -417,25 +428,6 @@ extern int minibuf_level;
 
 extern int update_mode_lines;
 
-/* Minimum value of GPT - BEG since last redisplay that finished.  */
-
-extern int beg_unchanged;
-
-/* Minimum value of Z - GPT since last redisplay that finished.  */
-
-extern int end_unchanged;
-
-/* MODIFF as of last redisplay that finished; 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.  */
 
@@ -446,6 +438,10 @@ extern int clip_changed;
 
 extern int windows_or_buffers_changed;
 
+/* Nonzero means a frame's cursor type has been changed.  */
+
+extern int cursor_type_changed;
+
 /* Number of windows displaying the selected buffer.  Normally this is
    1, but it can be more.  */
 
@@ -462,4 +458,9 @@ extern void check_frame_size P_ ((struct frame *frame, int *rows, int *cols));
 
 struct glyph *get_phys_cursor_glyph P_ ((struct window *w));
 
+/* Value is non-zero if WINDOW is a live window.  */
+
+#define WINDOW_LIVE_P(WINDOW) \
+     (WINDOWP ((WINDOW)) && !NILP (XWINDOW ((WINDOW))->buffer))
+
 #endif /* not WINDOW_H_INCLUDED */