1: /* Window definitions for GNU Emacs.
   2:    Copyright (C) 1985 Richard M. Stallman.
   3: 
   4: This file is part of GNU Emacs.
   5: 
   6: GNU Emacs is distributed in the hope that it will be useful,
   7: but WITHOUT ANY WARRANTY.  No author or distributor
   8: accepts responsibility to anyone for the consequences of using it
   9: or for whether it serves any particular purpose or works at all,
  10: unless he says so in writing.  Refer to the GNU Emacs General Public
  11: License for full details.
  12: 
  13: Everyone is granted permission to copy, modify and redistribute
  14: GNU Emacs, but only under the conditions described in the
  15: GNU Emacs General Public License.   A copy of this license is
  16: supposed to have been given to you along with GNU Emacs so you
  17: can know your rights and responsibilities.  It should be in a
  18: file named COPYING.  Among other things, the copyright notice
  19: and this notice must be preserved on all copies.  */
  20: 
  21: 
  22: /* Windows are allocated as if they were vectors, but then the
  23: Lisp data type is changed to Lisp_Window.  They are garbage
  24: collected along with the vectors.
  25: 
  26: All windows in use are arranged into a tree, with pointers up and down.
  27: 
  28: Windows that are leaves of the tree are actually displayed
  29: and show the contents of buffers.  Windows that are not leaves
  30: are used for representing the way groups of leaf windows are
  31: arranged on the screen.  Leaf windows never become non-leaves.
  32: They are deleted only by calling delete-window on them (but
  33: this can be done implicitly).  Combination windows can be created
  34: and deleted at any time.
  35: 
  36: A leaf window has a non-nil buffer field, and also
  37:  has markers in its start and pointm fields.  Non-leaf windows
  38:  have nil in these fields.
  39: 
  40: Non-leaf windows are either vertical or horizontal combinations.
  41: 
  42: A vertical combination window has children that are arranged
  43: one above the next.  Its vchild field points to the uppermost child.
  44: The parent field of each of the children points to the vertical
  45: combination window.  The next field of each child points to the
  46: child below it, or is nil for the lowest child.  The prev field
  47: or each child points to the child above it, or is nil for the highest child.
  48: 
  49: A horizontal combination window has children that are side by side.
  50: Its hchild field points to the leftmost child.  In each child
  51: the next field points to the child to the right and the prev field
  52: points to the child to the left.
  53: 
  54: The children of a vertical combination window may be leaf windows
  55: or horizontal combination windows.  The children of a horizontal
  56: combination window may be leaf windows or vertical combination windows.
  57: 
  58: At the top of the tree are two windows which have nil as parent.
  59: The second of these is minibuf_window.  The first one manages all
  60: the screen area that is not minibuffer, and is called the root window.
  61: Different windows can be the root at different times;
  62: initially the root window is a leaf window, but if more windows
  63: are created then that leaf window ceases to be root and a newly
  64: made combination window becomes root instead.
  65: 
  66: In any case, prev of the minibuf window is the root window and
  67: next of the root window is the minibuf window.  To find the
  68: root window at any time, do XWINDOW (minibuf_window)->prev.
  69: 
  70: */
  71: 
  72: struct window
  73:   {
  74:     /* The first two fields are really the header of a vector */
  75:     /* The window code does not refer to them.  */
  76:     int size;
  77:     struct Lisp_Vector *vec_next;
  78:     /* Following child (to right or down) at same level of tree */
  79:     Lisp_Object next;
  80:     /* Preceding child (to left or up) at same level of tree */
  81:     Lisp_Object prev;
  82:     /* First child of this window. */
  83:     /* vchild is used if this is a vertical combination,
  84:        hchild if this is a horizontal combination. */
  85:     Lisp_Object hchild, vchild;
  86:     /* The window this one is a child of. */
  87:     Lisp_Object parent;
  88:     /* The upper left corner coordinates of this window,
  89:        as integers relative to upper left corner of screen = 0, 0 */
  90:     Lisp_Object left;
  91:     Lisp_Object top;
  92:     /* The size of the window */
  93:     Lisp_Object height;
  94:     Lisp_Object width;
  95:     /* The buffer displayed in this window */
  96:     /* Of the fields vchild, hchild and buffer, only one is non-nil.  */
  97:     Lisp_Object buffer;
  98:     /* A marker pointing to where in the text to start displaying */
  99:     Lisp_Object start;
 100:     /* A marker pointing to where in the text point is in this window,
 101:        used only when the window is not selected.
 102:        This exists so that when multiple windows show one buffer
 103:        each one can have its own value of point.  */
 104:     Lisp_Object pointm;
 105:     /* Non-nil means next redisplay must use the value of start
 106:        set up for it in advance.  Set by scrolling commands.  */
 107:     Lisp_Object force_start;
 108:     /* Number of columns display within the window is scrolled to the left.
 109:        Currently always zero since this is not implemented.  */
 110:     Lisp_Object hscroll;
 111:     /* Number saying how recently window was selected */
 112:     Lisp_Object use_time;
 113:     /* Unique number of window assigned when it was created */
 114:     Lisp_Object sequence_number;
 115:     /* No permanent meaning; used by save-window-excursion's bookkeeping */
 116:     Lisp_Object temslot;
 117:     /* text.modified of displayed buffer as of last time display completed */
 118:     Lisp_Object last_modified;
 119:     /* Value of point at that time */
 120:     Lisp_Object last_point;
 121: /* The rest are currently not used or only half used */
 122:     /* Screen coords of point at that time */
 123:     Lisp_Object last_point_x;
 124:     Lisp_Object last_point_y;
 125:     /* Screen coords of mark as of last time display completed */
 126:     /* May be nil if mark does not exist or was not on screen */
 127:     Lisp_Object last_mark_x;
 128:     Lisp_Object last_mark_y;
 129:     /* Number of characters in buffer past bottom of window,
 130:        as of last redisplay that finished. */
 131:     Lisp_Object window_end_pos;
 132:     /* Vertical position (relative to window top) of that buffer position
 133:        of the first of those characters */
 134:     Lisp_Object window_end_vpos;
 135:     /* Non-nil means must regenerate mode line of this window */
 136:     Lisp_Object redo_mode_line;
 137:   };
 138: 
 139: /* This is the window which displays the minibuffer.
 140: It is always the same window.  */
 141: 
 142: extern Lisp_Object minibuf_window;
 143: 
 144: /* This is the window in which the terminal's cursor should
 145:  be left when nothing is being done with it.  This must
 146:  always be a leaf window, and its buffer is selected by
 147:  the top level editing loop at the end of each command.  */
 148: 
 149: extern Lisp_Object selected_window;
 150: 
 151: #define new_windows 1
 152: 
 153: Lisp_Object Fnext_window ();
 154: Lisp_Object Fselect_window ();
 155: Lisp_Object Fdisplay_buffer ();
 156: Lisp_Object Fshow_buffer ();
 157: 
 158: extern char *minibuf_prompt;    /* Prompt to display in front of the minibuffer contents */
 159: 
 160: extern char *minibuf_message;   /* Message to display instead of minibuffer contents */
 161:                 /* This is what the functions error and message make, */
 162:                 /* and command echoing uses it as well. */
 163:                 /* It overrides the minibuf_prompt as well as the buffer */
 164: 
 165: extern int RecurseDepth;    /* Depth in recursive edits */
 166: 
 167: extern int MinibufDepth;    /* Depth in minibuffer invocations */
 168: 
 169: extern int RedoModes;       /* true iff we should redraw the mode lines
 170: 				   on the next redisplay */
 171: 
 172: /* Minimum value of bf_s1 since last redisplay that finished.
 173:  Valid for current buffer unless Cant1WinOpt is nonzero. */
 174: 
 175: extern int beg_unchanged;
 176: 
 177: /* Minimum value of bf_s2 since last redisplay that finished.
 178:  Valid for current buffer unless Cant1WinOpt is nonzero. */
 179: 
 180: extern int end_unchanged;
 181: 
 182: /* bf_modified as of last redisplay that finished;
 183:  if it matches bf_modified, beg_unchanged and end_unchanged
 184:  contain no useful information */
 185: extern int unchanged_modified;
 186: 
 187: /* Nonzero if head_clip or tail_clip of current buffer has changed
 188:  since last redisplay that finished */
 189: extern int clip_changed;
 190: 
 191: /* Nonzero if window sizes or contents have changed
 192:  since last redisplay that finished */
 193: extern int windows_or_buffers_changed;
Last modified: 1985-11-23
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 709
Valid CSS Valid XHTML 1.0 Strict