diff options
| author | Martin Rudalics | 2018-12-03 09:35:33 +0100 |
|---|---|---|
| committer | Martin Rudalics | 2018-12-03 09:35:33 +0100 |
| commit | c7897c27861fd8b2690f40e77402edced6aa0ceb (patch) | |
| tree | 49e61c59e3ed37f6735320aed08db5c5a7d21a1f /src/window.h | |
| parent | 745c9c02582443680167501b218cc59f1a2d3fb6 (diff) | |
| download | emacs-c7897c27861fd8b2690f40e77402edced6aa0ceb.tar.gz emacs-c7897c27861fd8b2690f40e77402edced6aa0ceb.zip | |
A few further fixes of window internals description
* doc/lispref/internals.texi (Window Internals): Add a few
more items and clarify description of some others.
Diffstat (limited to 'src/window.h')
| -rw-r--r-- | src/window.h | 142 |
1 files changed, 82 insertions, 60 deletions
diff --git a/src/window.h b/src/window.h index c7f525e2704..96e9a9f30ea 100644 --- a/src/window.h +++ b/src/window.h | |||
| @@ -24,57 +24,69 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ | |||
| 24 | 24 | ||
| 25 | INLINE_HEADER_BEGIN | 25 | INLINE_HEADER_BEGIN |
| 26 | 26 | ||
| 27 | /* Windows are allocated as if they were vectors, but then the | 27 | /* Windows are allocated as if they were vectors, but then the Lisp |
| 28 | Lisp data type is changed to Lisp_Window. They are garbage | 28 | data type is changed to Lisp_Window. They are garbage collected along |
| 29 | collected along with the vectors. | 29 | with the vectors. |
| 30 | 30 | ||
| 31 | All windows in use are arranged into a tree, with pointers up and down. | 31 | All windows in use are arranged into a tree, with pointers up and down. |
| 32 | 32 | ||
| 33 | Windows that are leaves of the tree are actually displayed | 33 | Windows that are leaves of the tree are actually displayed and show |
| 34 | and show the contents of buffers. Windows that are not leaves | 34 | the contents of buffers. Windows that are not leaves are used for |
| 35 | are used for representing the way groups of leaf windows are | 35 | representing the way groups of leaf windows are arranged on the frame. |
| 36 | arranged on the frame. Leaf windows never become non-leaves. | 36 | Leaf windows never become non-leaves. They are deleted only by |
| 37 | They are deleted only by calling delete-window on them (but | 37 | calling `delete-window' on them (but this can be done implicitly). |
| 38 | this can be done implicitly). Combination windows can be created | 38 | Non-leaf windows never become leaf windows and can be created and |
| 39 | and deleted at any time. | 39 | deleted at any time by the window management code. Non-leaf windows |
| 40 | 40 | can be seen but not directly manipulated by Lisp functions. | |
| 41 | A leaf window has a buffer stored in contents field and markers in its start | 41 | |
| 42 | and pointm fields. Non-leaf windows have nil in the latter two fields. | 42 | A leaf window has a buffer stored in its contents field and markers in |
| 43 | 43 | its 'start' and 'pointm' fields. Non-leaf windows have nil in the | |
| 44 | Non-leaf windows are either vertical or horizontal combinations. | 44 | latter two fields. Non-leaf windows are either vertical or horizontal |
| 45 | 45 | combinations. | |
| 46 | A vertical combination window has children that are arranged on the frame | 46 | |
| 47 | one above the next. Its contents field points to the uppermost child. | 47 | A vertical combination window has children that are arranged on the |
| 48 | The parent field of each of the children points to the vertical | 48 | frame one above the next. Its 'contents' field points to the |
| 49 | combination window. The next field of each child points to the | 49 | uppermost child. The 'parent' field of each of the children points to |
| 50 | child below it, or is nil for the lowest child. The prev field | 50 | the vertical combination window. The 'next' field of each child |
| 51 | of each child points to the child above it, or is nil for the | 51 | points to the child below it, or is nil for the lowest child. The |
| 52 | highest child. | 52 | 'prev' field of each child points to the child above it, or is nil for |
| 53 | 53 | the highest child. | |
| 54 | A horizontal combination window has children that are side by side. | 54 | |
| 55 | Its contents field points to the leftmost child. In each child | 55 | A horizontal combination window has children that are arranged side by |
| 56 | the next field points to the child to the right and the prev field | 56 | side. Its 'contents' field points to the leftmost child. In each |
| 57 | points to the child to the left. | 57 | child the 'next' field points to the child to the right and the 'prev' |
| 58 | 58 | field points to the child to the left. | |
| 59 | The children of a vertical combination window may be leaf windows | 59 | |
| 60 | or horizontal combination windows. The children of a horizontal | 60 | On each frame there are at least one and at most two windows which |
| 61 | combination window may be leaf windows or vertical combination windows. | 61 | have nil as parent. The second of these, if present, is the frame's |
| 62 | 62 | minibuffer window and shows the minibuffer or the echo area. The | |
| 63 | At the top of the tree are two windows which have nil as parent. | 63 | first one manages the remaining frame area and is called the frame's |
| 64 | The second of these is minibuf_window. The first one manages all | 64 | root window. Different windows can be the root at different times; |
| 65 | the frame area that is not minibuffer, and is called the root window. | 65 | initially the root window is a leaf window, but if more windows are |
| 66 | Different windows can be the root at different times; | 66 | created, then that leaf window ceases to be root and a newly made |
| 67 | initially the root window is a leaf window, but if more windows | 67 | combination window becomes the root instead. |
| 68 | are created then that leaf window ceases to be root and a newly | 68 | |
| 69 | made combination window becomes root instead. | 69 | On frames which have an ordinary window and a minibuffer window, |
| 70 | 70 | 'prev' of the minibuffer window is the root window and 'next' of the | |
| 71 | In any case, on screens which have an ordinary window and a | 71 | root window is the minibuffer window. On minibuffer-less frames there |
| 72 | minibuffer, prev of the minibuf window is the root window and next of | 72 | is only a root window and 'next' of the root window is nil. On |
| 73 | the root window is the minibuf window. On minibufferless screens or | 73 | minibuffer-only frames, the root window and the minibuffer window are |
| 74 | minibuffer-only screens, the root window and the minibuffer window are | 74 | one and the same, so its 'prev' and 'next' members are nil. In any |
| 75 | one and the same, so its prev and next members are nil. | 75 | case, 'prev' of a root window and 'next' of a minibuffer window are |
| 76 | 76 | always nil. | |
| 77 | A dead window has its contents field set to nil. */ | 77 | |
| 78 | In Lisp parlance, leaf windows are called "live windows" and non-leaf | ||
| 79 | windows are called "internal windows". Together, live and internal | ||
| 80 | windows form the set of "valid windows". A window that has been | ||
| 81 | deleted is considered "dead" regardless of whether it formerly was a | ||
| 82 | leaf or a non-leaf window. A dead window has its 'contents' field set | ||
| 83 | to nil. | ||
| 84 | |||
| 85 | Frames may also contain pseudo windows, windows that are not exposed | ||
| 86 | directly to Lisp code. Pseudo windows are currently either used to | ||
| 87 | display the menu bar or the tool bar (when Emacs uses toolkits that | ||
| 88 | don't display their own menu bar and tool bar) or a tooltip in a | ||
| 89 | tooltip frame (when tooltips are not display by the toolkit). */ | ||
| 78 | 90 | ||
| 79 | struct cursor_pos | 91 | struct cursor_pos |
| 80 | { | 92 | { |
| @@ -95,29 +107,39 @@ struct window | |||
| 95 | 107 | ||
| 96 | /* Following (to right or down) and preceding (to left or up) | 108 | /* Following (to right or down) and preceding (to left or up) |
| 97 | child at same level of tree. Whether this is left/right or | 109 | child at same level of tree. Whether this is left/right or |
| 98 | up/down is determined by the 'horizontal' flag, see below. | 110 | up/down is determined by the parent window's 'horizontal' flag, |
| 99 | A minibuffer window has the frame's root window pointed by 'prev'. */ | 111 | see below. On a frame that is neither a minibuffer-only nor a |
| 112 | minibuffer-less frame, 'next' of the root window points to the | ||
| 113 | frame's minibuffer window and 'prev' of the minibuffer window | ||
| 114 | points to the frame's root window. In all other cases, 'next' | ||
| 115 | of the root window and 'prev' of the minibuffer window, if | ||
| 116 | present, are nil. 'prev' of the root window and 'next' of the | ||
| 117 | minibuffer window are always nil. */ | ||
| 100 | Lisp_Object next; | 118 | Lisp_Object next; |
| 101 | Lisp_Object prev; | 119 | Lisp_Object prev; |
| 102 | 120 | ||
| 103 | /* The window this one is a child of. For a minibuffer window: nil. */ | 121 | /* The window this one is a child of. For the root and a |
| 122 | minibuffer window this is always nil. */ | ||
| 104 | Lisp_Object parent; | 123 | Lisp_Object parent; |
| 105 | 124 | ||
| 106 | /* The normal size of the window. These are fractions, but we do | 125 | /* The "normal" size of the window. These are fractions, but we |
| 107 | not use C doubles to avoid creating new Lisp_Float objects while | 126 | do not use C doubles to avoid creating new Lisp_Float objects |
| 108 | interfacing Lisp in Fwindow_normal_size. */ | 127 | while interfacing Lisp in Fwindow_normal_size. */ |
| 109 | Lisp_Object normal_lines; | 128 | Lisp_Object normal_lines; |
| 110 | Lisp_Object normal_cols; | 129 | Lisp_Object normal_cols; |
| 111 | 130 | ||
| 112 | /* New sizes of the window. Note that Lisp code may set new_normal | 131 | /* The new sizes of the window as proposed by the window resizing |
| 113 | to something beyond an integer, so C int can't be used here. */ | 132 | functions. Note that Lisp code may set new_normal to something |
| 133 | beyond an integer, so C int can't be used here. */ | ||
| 114 | Lisp_Object new_total; | 134 | Lisp_Object new_total; |
| 115 | Lisp_Object new_normal; | 135 | Lisp_Object new_normal; |
| 116 | Lisp_Object new_pixel; | 136 | Lisp_Object new_pixel; |
| 117 | 137 | ||
| 118 | /* For a leaf window: a buffer; for an internal window: a window; | 138 | /* For a leaf window or a tooltip window this is the buffer shown |
| 119 | for a pseudo-window (such as menu bar or tool bar): nil. It is | 139 | in the window; for a combination window this is the first of |
| 120 | a buffer for a minibuffer window as well. */ | 140 | its child windows; for a pseudo window showing the menu bar or |
| 141 | tool bar this is nil. It is a buffer for a minibuffer window | ||
| 142 | as well. */ | ||
| 121 | Lisp_Object contents; | 143 | Lisp_Object contents; |
| 122 | 144 | ||
| 123 | /* A marker pointing to where in the text to start displaying. | 145 | /* A marker pointing to where in the text to start displaying. |
| @@ -192,7 +214,7 @@ struct window | |||
| 192 | 214 | ||
| 193 | /* The two Lisp_Object fields below are marked in a special way, | 215 | /* The two Lisp_Object fields below are marked in a special way, |
| 194 | which is why they're placed after `current_matrix'. */ | 216 | which is why they're placed after `current_matrix'. */ |
| 195 | /* Alist of <buffer, window-start, window-point> triples listing | 217 | /* A list of <buffer, window-start, window-point> triples listing |
| 196 | buffers previously shown in this window. */ | 218 | buffers previously shown in this window. */ |
| 197 | Lisp_Object prev_buffers; | 219 | Lisp_Object prev_buffers; |
| 198 | /* List of buffers re-shown in this window. */ | 220 | /* List of buffers re-shown in this window. */ |