|
|
1.1 ! root 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;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.