summaryrefslogtreecommitdiff
path: root/src/window.h
diff options
context:
space:
mode:
authorDmitry Antipov <dmantipov@yandex.ru>2013-03-28 18:04:49 +0400
committerDmitry Antipov <dmantipov@yandex.ru>2013-03-28 18:04:49 +0400
commite74aeda863cd6896e06e92586f87b45d63d67d15 (patch)
treeb6a57d0d39f085274c0953623f7d2924f4813db4 /src/window.h
parent9d42d31f24040706fe965e7c586b640471b12861 (diff)
downloademacs-e74aeda863cd6896e06e92586f87b45d63d67d15.tar.gz
* window.h (struct window): Replace hchild, vchild and buffer slots
with the only contents slot. This is possible because each valid window may have either the child window (in vertical or horizontal combination) or buffer to display (for the leaf window). Using that, a lof of operations to traverse and/or change window hierarchies may be simplified. New member horizontal is used to distinguish between horizontal and vertical combinations of internal windows. (WINDOW_LEAF_P, WINDOW_HORIZONTAL_COMBINATION_P) (WINDOW_VERTICAL_COMBINATION_P): New macros. (WINDOW_VALID_P, WINDOW_LIVE_P): Adjust to match struct window changes. * window.c (wset_hchild, wset_vchild): Remove. Adjust all users. Use contents slot, not buffer, where appropriate. (wset_combination): New function. (wset_buffer): Add eassert. (Fframe_first_window): Simplify the loop reaching first window. (Fwindow_buffer): Use WINDOW_LEAF_P. (Fwindow_top_child): Use WINDOW_VERTICAL_COMBINATION_P. (Fwindow_left_child): Use WINDOW_HORIZONTAL_COMBINATION_P. (unshow_buffer): Convert initial debugging check to eassert. (replace_window, recombine_windows, Fdelete_other_windows_internal) (make_parent_window, window_resize_check, window_resize_apply) (resize_frame_windows, Fsplit_window_internal, Fdelete_window_internal) (Fset_window_configuration, delete_all_child_windows, save_window_save): Adjust to match struct window changes. (window_loop): Check for broken markers in CHECK_ALL_WINDOWS. (mark_window_cursors_off, count_windows, get_leaf_windows) (foreach_window_1): Simplify the loop. * alloc.c (mark_object): Do not check for the leaf window because internal windows has no glyph matrices anyway. * dispnew.c (clear_window_matrices, showing_window_margins_p) (allocate_matrices_for_window_redisplay, fake_current_matrices) (allocate_matrices_for_frame_redisplay, free_window_matrices) (build_frame_matrix_from_window_tree, mirror_make_current) (frame_row_to_window, mirror_line_dance, check_window_matrix_pointers) (update_window_tree, set_window_update_flags): Simplify the loop. (sync_window_with_frame_matrix_rows): Enforce live window. Use contents slot, not buffer, where appropriate. * frame.c (set_menu_bar_lines_1): Use WINDOW_VERTICAL_COMBINATION_P and WINDOW_HORIZONTAL_COMBINATION_P. (make_frame_visible_1): Simplify the loop. Use contents slot, not buffer, where appropriate. * xdisp.c (hscroll_window_tree, mark_window_display_accurate) (redisplay_windows, redisplay_mode_lines, update_cursor_in_window_tree) (expose_window_tree): Likewise. Use contents slot, not buffer, where appropriate. * textprop.c (get_char_property_and_overlay): Add CHECK_LIVE_WINDOW to avoid deleted windows. Use contents slot instead of buffer. * buffer.c, dispextern.h, editfns.c, fileio.c, font.c, fringe.c: * indent.c, insdel.c, keyboard.c, keymap.c, minibuf.c, msdos.c: * nsfns.m, nsmenu.m, nsterm.m, print.c, w32fns.c, w32menu.c, xfaces.c: * xfns.c, xmenu.c: Use contents slot, not buffer, where appropriate.
Diffstat (limited to 'src/window.h')
-rw-r--r--src/window.h58
1 files changed, 32 insertions, 26 deletions
diff --git a/src/window.h b/src/window.h
index 71c438ff7f2..411756f045e 100644
--- a/src/window.h
+++ b/src/window.h
@@ -41,14 +41,13 @@ 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.
-A leaf window has a non-nil buffer field, and also
- has markers in its start and pointm fields. Non-leaf windows
- have nil in these fields.
+A leaf window has a buffer stored in contents field and markers in its start
+and pointm fields. Non-leaf windows have nil in the latter two fields.
Non-leaf windows are either vertical or horizontal combinations.
A vertical combination window has children that are arranged on the frame
-one above the next. Its vchild field points to the uppermost child.
+one above the next. Its contents 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
child below it, or is nil for the lowest child. The prev field
@@ -56,7 +55,7 @@ of each child points to the child above it, or is nil for the
highest child.
A horizontal combination window has children that are side by side.
-Its hchild field points to the leftmost child. In each child
+Its contents field points to the leftmost child. In each child
the next field points to the child to the right and the prev field
points to the child to the left.
@@ -78,7 +77,7 @@ 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. */
+A dead window has its contents field set to nil. */
struct cursor_pos
{
@@ -102,13 +101,6 @@ struct window
Lisp_Object next;
Lisp_Object prev;
- /* First child of this window: vchild is used if this is a vertical
- combination, hchild if this is a horizontal combination. Of the
- fields vchild, hchild and buffer, one and only one is non-nil
- unless the window is dead. */
- Lisp_Object hchild;
- Lisp_Object vchild;
-
/* The window this one is a child of. */
Lisp_Object parent;
@@ -123,10 +115,8 @@ struct window
Lisp_Object new_total;
Lisp_Object new_normal;
- /* The buffer displayed in this window. Of the fields vchild,
- hchild and buffer, one and only one is non-nil unless the window
- is dead. */
- Lisp_Object buffer;
+ /* May be buffer, window, or nil. */
+ Lisp_Object contents;
/* A marker pointing to where in the text to start displaying.
BIDI Note: This is the _logical-order_ start, i.e. the smallest
@@ -282,6 +272,10 @@ struct window
/* Non-zero if this window is a minibuffer window. */
unsigned mini : 1;
+ /* Meaningful only if contents is a window, non-zero if this
+ internal window is used in horizontal combination. */
+ unsigned horizontal : 1;
+
/* Non-zero means must regenerate mode line of this window. */
unsigned update_mode_line : 1;
@@ -428,6 +422,21 @@ wset_next_buffers (struct window *w, Lisp_Object val)
/* A handy macro. */
+/* Non-zero if W is leaf (carry the buffer). */
+
+#define WINDOW_LEAF_P(W) \
+ (BUFFERP ((W)->contents))
+
+/* Non-zero if W is a member of horizontal combination. */
+
+#define WINDOW_HORIZONTAL_COMBINATION_P(W) \
+ (WINDOWP ((W)->contents) && (W)->horizontal)
+
+/* Non-zero if W is a member of vertical combination. */
+
+#define WINDOW_VERTICAL_COMBINATION_P(W) \
+ (WINDOWP ((W)->contents) && !(W)->horizontal)
+
#define WINDOW_XFRAME(W) \
(XFRAME (WINDOW_FRAME ((W))))
@@ -931,20 +940,17 @@ extern void check_frame_size (struct frame *frame, int *rows, int *cols);
struct glyph *get_phys_cursor_glyph (struct window *w);
/* Value is non-zero if WINDOW is a valid window. */
-#define WINDOW_VALID_P(WINDOW) \
- (WINDOWP (WINDOW) \
- && (!NILP (XWINDOW (WINDOW)->buffer) \
- || !NILP (XWINDOW (WINDOW)->vchild) \
- || !NILP (XWINDOW (WINDOW)->hchild)))
-
-/* A window of any sort, leaf or interior, is "valid" if one
- of its buffer, vchild, or hchild members is non-nil. */
+#define WINDOW_VALID_P(WINDOW) \
+ (WINDOWP (WINDOW) && !NILP (XWINDOW (WINDOW)->contents)) \
+
+/* A window of any sort, leaf or interior, is "valid" if its
+ contents slot is non-nil. */
#define CHECK_VALID_WINDOW(WINDOW) \
CHECK_TYPE (WINDOW_VALID_P (WINDOW), Qwindow_valid_p, WINDOW)
/* Value is non-zero if WINDOW is a live window. */
#define WINDOW_LIVE_P(WINDOW) \
- (WINDOWP (WINDOW) && !NILP (XWINDOW (WINDOW)->buffer))
+ (WINDOWP (WINDOW) && BUFFERP (XWINDOW (WINDOW)->contents))
/* A window is "live" if and only if it shows a buffer. */
#define CHECK_LIVE_WINDOW(WINDOW) \