aboutsummaryrefslogtreecommitdiffstats
path: root/src/window.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/window.c')
-rw-r--r--src/window.c112
1 files changed, 58 insertions, 54 deletions
diff --git a/src/window.c b/src/window.c
index 514119abef5..4c798ad4570 100644
--- a/src/window.c
+++ b/src/window.c
@@ -274,7 +274,7 @@ decode_valid_window (register Lisp_Object window)
274/* Build a frequently used 4-integer (X Y W H) list. */ 274/* Build a frequently used 4-integer (X Y W H) list. */
275 275
276static Lisp_Object 276static Lisp_Object
277quad (EMACS_INT x, EMACS_INT y, EMACS_INT w, EMACS_INT h) 277list4i (EMACS_INT x, EMACS_INT y, EMACS_INT w, EMACS_INT h)
278{ 278{
279 return list4 (make_number (x), make_number (y), 279 return list4 (make_number (x), make_number (y),
280 make_number (w), make_number (h)); 280 make_number (w), make_number (h));
@@ -619,11 +619,13 @@ internal windows only. */)
619 619
620DEFUN ("set-window-combination-limit", Fset_window_combination_limit, Sset_window_combination_limit, 2, 2, 0, 620DEFUN ("set-window-combination-limit", Fset_window_combination_limit, Sset_window_combination_limit, 2, 2, 0,
621 doc: /* Set combination limit of window WINDOW to LIMIT; return LIMIT. 621 doc: /* Set combination limit of window WINDOW to LIMIT; return LIMIT.
622WINDOW must be a valid window and defaults to the selected one.
623If LIMIT is nil, child windows of WINDOW can be recombined with WINDOW's 622If LIMIT is nil, child windows of WINDOW can be recombined with WINDOW's
624siblings. LIMIT t means that child windows of WINDOW are never 623siblings. LIMIT t means that child windows of WINDOW are never
625\(re-)combined with WINDOW's siblings. Other values are reserved for 624\(re-)combined with WINDOW's siblings. Other values are reserved for
626future use. */) 625future use.
626
627WINDOW must be a valid window. Setting the combination limit is
628meaningful for internal windows only. */)
627 (Lisp_Object window, Lisp_Object limit) 629 (Lisp_Object window, Lisp_Object limit)
628{ 630{
629 wset_combination_limit (decode_valid_window (window), limit); 631 wset_combination_limit (decode_valid_window (window), limit);
@@ -883,8 +885,8 @@ header line, and/or mode line. For the edges of just the text area, use
883{ 885{
884 register struct window *w = decode_valid_window (window); 886 register struct window *w = decode_valid_window (window);
885 887
886 return quad (WINDOW_LEFT_EDGE_COL (w), WINDOW_TOP_EDGE_LINE (w), 888 return list4i (WINDOW_LEFT_EDGE_COL (w), WINDOW_TOP_EDGE_LINE (w),
887 WINDOW_RIGHT_EDGE_COL (w), WINDOW_BOTTOM_EDGE_LINE (w)); 889 WINDOW_RIGHT_EDGE_COL (w), WINDOW_BOTTOM_EDGE_LINE (w));
888} 890}
889 891
890DEFUN ("window-pixel-edges", Fwindow_pixel_edges, Swindow_pixel_edges, 0, 1, 0, 892DEFUN ("window-pixel-edges", Fwindow_pixel_edges, Swindow_pixel_edges, 0, 1, 0,
@@ -903,8 +905,8 @@ of just the text area, use `window-inside-pixel-edges'. */)
903{ 905{
904 register struct window *w = decode_valid_window (window); 906 register struct window *w = decode_valid_window (window);
905 907
906 return quad (WINDOW_LEFT_EDGE_X (w), WINDOW_TOP_EDGE_Y (w), 908 return list4i (WINDOW_LEFT_EDGE_X (w), WINDOW_TOP_EDGE_Y (w),
907 WINDOW_RIGHT_EDGE_X (w), WINDOW_BOTTOM_EDGE_Y (w)); 909 WINDOW_RIGHT_EDGE_X (w), WINDOW_BOTTOM_EDGE_Y (w));
908} 910}
909 911
910static void 912static void
@@ -949,10 +951,10 @@ of just the text area, use `window-inside-absolute-pixel-edges'. */)
949 951
950 calc_absolute_offset (w, &add_x, &add_y); 952 calc_absolute_offset (w, &add_x, &add_y);
951 953
952 return quad (WINDOW_LEFT_EDGE_X (w) + add_x, 954 return list4i (WINDOW_LEFT_EDGE_X (w) + add_x,
953 WINDOW_TOP_EDGE_Y (w) + add_y, 955 WINDOW_TOP_EDGE_Y (w) + add_y,
954 WINDOW_RIGHT_EDGE_X (w) + add_x, 956 WINDOW_RIGHT_EDGE_X (w) + add_x,
955 WINDOW_BOTTOM_EDGE_Y (w) + add_y); 957 WINDOW_BOTTOM_EDGE_Y (w) + add_y);
956} 958}
957 959
958DEFUN ("window-inside-edges", Fwindow_inside_edges, Swindow_inside_edges, 0, 1, 0, 960DEFUN ("window-inside-edges", Fwindow_inside_edges, Swindow_inside_edges, 0, 1, 0,
@@ -971,16 +973,16 @@ display margins, fringes, header line, and/or mode line. */)
971{ 973{
972 register struct window *w = decode_live_window (window); 974 register struct window *w = decode_live_window (window);
973 975
974 return quad (WINDOW_BOX_LEFT_EDGE_COL (w) 976 return list4i ((WINDOW_BOX_LEFT_EDGE_COL (w)
975 + WINDOW_LEFT_MARGIN_COLS (w) 977 + WINDOW_LEFT_MARGIN_COLS (w)
976 + WINDOW_LEFT_FRINGE_COLS (w), 978 + WINDOW_LEFT_FRINGE_COLS (w)),
977 WINDOW_TOP_EDGE_LINE (w) 979 (WINDOW_TOP_EDGE_LINE (w)
978 + WINDOW_HEADER_LINE_LINES (w), 980 + WINDOW_HEADER_LINE_LINES (w)),
979 WINDOW_BOX_RIGHT_EDGE_COL (w) 981 (WINDOW_BOX_RIGHT_EDGE_COL (w)
980 - WINDOW_RIGHT_MARGIN_COLS (w) 982 - WINDOW_RIGHT_MARGIN_COLS (w)
981 - WINDOW_RIGHT_FRINGE_COLS (w), 983 - WINDOW_RIGHT_FRINGE_COLS (w)),
982 WINDOW_BOTTOM_EDGE_LINE (w) 984 (WINDOW_BOTTOM_EDGE_LINE (w)
983 - WINDOW_MODE_LINE_LINES (w)); 985 - WINDOW_MODE_LINE_LINES (w)));
984} 986}
985 987
986DEFUN ("window-inside-pixel-edges", Fwindow_inside_pixel_edges, Swindow_inside_pixel_edges, 0, 1, 0, 988DEFUN ("window-inside-pixel-edges", Fwindow_inside_pixel_edges, Swindow_inside_pixel_edges, 0, 1, 0,
@@ -998,16 +1000,16 @@ display margins, fringes, header line, and/or mode line. */)
998{ 1000{
999 register struct window *w = decode_live_window (window); 1001 register struct window *w = decode_live_window (window);
1000 1002
1001 return quad (WINDOW_BOX_LEFT_EDGE_X (w) 1003 return list4i ((WINDOW_BOX_LEFT_EDGE_X (w)
1002 + WINDOW_LEFT_MARGIN_WIDTH (w) 1004 + WINDOW_LEFT_MARGIN_WIDTH (w)
1003 + WINDOW_LEFT_FRINGE_WIDTH (w), 1005 + WINDOW_LEFT_FRINGE_WIDTH (w)),
1004 WINDOW_TOP_EDGE_Y (w) 1006 (WINDOW_TOP_EDGE_Y (w)
1005 + WINDOW_HEADER_LINE_HEIGHT (w), 1007 + WINDOW_HEADER_LINE_HEIGHT (w)),
1006 WINDOW_BOX_RIGHT_EDGE_X (w) 1008 (WINDOW_BOX_RIGHT_EDGE_X (w)
1007 - WINDOW_RIGHT_MARGIN_WIDTH (w) 1009 - WINDOW_RIGHT_MARGIN_WIDTH (w)
1008 - WINDOW_RIGHT_FRINGE_WIDTH (w), 1010 - WINDOW_RIGHT_FRINGE_WIDTH (w)),
1009 WINDOW_BOTTOM_EDGE_Y (w) 1011 (WINDOW_BOTTOM_EDGE_Y (w)
1010 - WINDOW_MODE_LINE_HEIGHT (w)); 1012 - WINDOW_MODE_LINE_HEIGHT (w)));
1011} 1013}
1012 1014
1013DEFUN ("window-inside-absolute-pixel-edges", 1015DEFUN ("window-inside-absolute-pixel-edges",
@@ -1030,16 +1032,16 @@ display margins, fringes, header line, and/or mode line. */)
1030 1032
1031 calc_absolute_offset (w, &add_x, &add_y); 1033 calc_absolute_offset (w, &add_x, &add_y);
1032 1034
1033 return quad (WINDOW_BOX_LEFT_EDGE_X (w) 1035 return list4i ((WINDOW_BOX_LEFT_EDGE_X (w)
1034 + WINDOW_LEFT_MARGIN_WIDTH (w) 1036 + WINDOW_LEFT_MARGIN_WIDTH (w)
1035 + WINDOW_LEFT_FRINGE_WIDTH (w) + add_x, 1037 + WINDOW_LEFT_FRINGE_WIDTH (w) + add_x),
1036 WINDOW_TOP_EDGE_Y (w) 1038 (WINDOW_TOP_EDGE_Y (w)
1037 + WINDOW_HEADER_LINE_HEIGHT (w) + add_y, 1039 + WINDOW_HEADER_LINE_HEIGHT (w) + add_y),
1038 WINDOW_BOX_RIGHT_EDGE_X (w) 1040 (WINDOW_BOX_RIGHT_EDGE_X (w)
1039 - WINDOW_RIGHT_MARGIN_WIDTH (w) 1041 - WINDOW_RIGHT_MARGIN_WIDTH (w)
1040 - WINDOW_RIGHT_FRINGE_WIDTH (w) + add_x, 1042 - WINDOW_RIGHT_FRINGE_WIDTH (w) + add_x),
1041 WINDOW_BOTTOM_EDGE_Y (w) 1043 (WINDOW_BOTTOM_EDGE_Y (w)
1042 - WINDOW_MODE_LINE_HEIGHT (w) + add_y); 1044 - WINDOW_MODE_LINE_HEIGHT (w) + add_y));
1043} 1045}
1044 1046
1045/* Test if the character at column X, row Y is within window W. 1047/* Test if the character at column X, row Y is within window W.
@@ -1620,7 +1622,7 @@ display row, and VPOS is the row number (0-based) containing POS. */)
1620 { 1622 {
1621 Lisp_Object part = Qnil; 1623 Lisp_Object part = Qnil;
1622 if (!fully_p) 1624 if (!fully_p)
1623 part = quad (rtop, rbot, rowh, vpos); 1625 part = list4i (rtop, rbot, rowh, vpos);
1624 in_window = Fcons (make_number (x), 1626 in_window = Fcons (make_number (x),
1625 Fcons (make_number (y), part)); 1627 Fcons (make_number (y), part));
1626 } 1628 }
@@ -1686,17 +1688,18 @@ Return nil if window display is not up-to-date. In that case, use
1686 if (!WINDOW_WANTS_HEADER_LINE_P (w)) 1688 if (!WINDOW_WANTS_HEADER_LINE_P (w))
1687 return Qnil; 1689 return Qnil;
1688 row = MATRIX_HEADER_LINE_ROW (w->current_matrix); 1690 row = MATRIX_HEADER_LINE_ROW (w->current_matrix);
1689 return row->enabled_p ? quad (row->height, 0, 0, 0) : Qnil; 1691 return row->enabled_p ? list4i (row->height, 0, 0, 0) : Qnil;
1690 } 1692 }
1691 1693
1692 if (EQ (line, Qmode_line)) 1694 if (EQ (line, Qmode_line))
1693 { 1695 {
1694 row = MATRIX_MODE_LINE_ROW (w->current_matrix); 1696 row = MATRIX_MODE_LINE_ROW (w->current_matrix);
1695 return (row->enabled_p ? 1697 return (row->enabled_p ?
1696 quad (row->height, 1698 list4i (row->height,
1697 0, /* not accurate */ 1699 0, /* not accurate */
1698 WINDOW_HEADER_LINE_HEIGHT (w) 1700 (WINDOW_HEADER_LINE_HEIGHT (w)
1699 + window_text_bottom_y (w), 0) 1701 + window_text_bottom_y (w)),
1702 0)
1700 : Qnil); 1703 : Qnil);
1701 } 1704 }
1702 1705
@@ -1726,7 +1729,7 @@ Return nil if window display is not up-to-date. In that case, use
1726 1729
1727 found_row: 1730 found_row:
1728 crop = max (0, (row->y + row->height) - max_y); 1731 crop = max (0, (row->y + row->height) - max_y);
1729 return quad (row->height + min (0, row->y) - crop, i, row->y, crop); 1732 return list4i (row->height + min (0, row->y) - crop, i, row->y, crop);
1730} 1733}
1731 1734
1732DEFUN ("window-dedicated-p", Fwindow_dedicated_p, Swindow_dedicated_p, 1735DEFUN ("window-dedicated-p", Fwindow_dedicated_p, Swindow_dedicated_p,
@@ -2131,10 +2134,10 @@ window_list (void)
2131{ 2134{
2132 if (!CONSP (Vwindow_list)) 2135 if (!CONSP (Vwindow_list))
2133 { 2136 {
2134 Lisp_Object tail; 2137 Lisp_Object tail, frame;
2135 2138
2136 Vwindow_list = Qnil; 2139 Vwindow_list = Qnil;
2137 for (tail = Vframe_list; CONSP (tail); tail = XCDR (tail)) 2140 FOR_EACH_FRAME (tail, frame)
2138 { 2141 {
2139 Lisp_Object args[2]; 2142 Lisp_Object args[2];
2140 2143
@@ -2142,7 +2145,7 @@ window_list (void)
2142 new windows at the front of args[1], which means we 2145 new windows at the front of args[1], which means we
2143 have to reverse this list at the end. */ 2146 have to reverse this list at the end. */
2144 args[1] = Qnil; 2147 args[1] = Qnil;
2145 foreach_window (XFRAME (XCAR (tail)), add_window_to_list, &args[1]); 2148 foreach_window (XFRAME (frame), add_window_to_list, &args[1]);
2146 args[0] = Vwindow_list; 2149 args[0] = Vwindow_list;
2147 args[1] = Fnreverse (args[1]); 2150 args[1] = Fnreverse (args[1]);
2148 Vwindow_list = Fnconc (2, args); 2151 Vwindow_list = Fnconc (2, args);
@@ -3870,9 +3873,10 @@ set correctly. See the code of `split-window' for how this is done. */)
3870 3873
3871 make_parent_window (old, horflag); 3874 make_parent_window (old, horflag);
3872 p = XWINDOW (o->parent); 3875 p = XWINDOW (o->parent);
3873 /* Store t in the new parent's combination_limit slot to avoid 3876 if (EQ (Vwindow_combination_limit, Qt))
3874 that its children get merged into another window. */ 3877 /* Store t in the new parent's combination_limit slot to avoid
3875 wset_combination_limit (p, Qt); 3878 that its children get merged into another window. */
3879 wset_combination_limit (p, Qt);
3876 /* These get applied below. */ 3880 /* These get applied below. */
3877 wset_new_total (p, horflag ? o->total_cols : o->total_lines); 3881 wset_new_total (p, horflag ? o->total_cols : o->total_lines);
3878 wset_new_normal (p, new_normal); 3882 wset_new_normal (p, new_normal);