diff options
Diffstat (limited to 'src/window.c')
| -rw-r--r-- | src/window.c | 112 |
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 | ||
| 276 | static Lisp_Object | 276 | static Lisp_Object |
| 277 | quad (EMACS_INT x, EMACS_INT y, EMACS_INT w, EMACS_INT h) | 277 | list4i (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 | ||
| 620 | DEFUN ("set-window-combination-limit", Fset_window_combination_limit, Sset_window_combination_limit, 2, 2, 0, | 620 | DEFUN ("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. |
| 622 | WINDOW must be a valid window and defaults to the selected one. | ||
| 623 | If LIMIT is nil, child windows of WINDOW can be recombined with WINDOW's | 622 | If LIMIT is nil, child windows of WINDOW can be recombined with WINDOW's |
| 624 | siblings. LIMIT t means that child windows of WINDOW are never | 623 | siblings. 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 |
| 626 | future use. */) | 625 | future use. |
| 626 | |||
| 627 | WINDOW must be a valid window. Setting the combination limit is | ||
| 628 | meaningful 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 | ||
| 890 | DEFUN ("window-pixel-edges", Fwindow_pixel_edges, Swindow_pixel_edges, 0, 1, 0, | 892 | DEFUN ("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 | ||
| 910 | static void | 912 | static 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 | ||
| 958 | DEFUN ("window-inside-edges", Fwindow_inside_edges, Swindow_inside_edges, 0, 1, 0, | 960 | DEFUN ("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 | ||
| 986 | DEFUN ("window-inside-pixel-edges", Fwindow_inside_pixel_edges, Swindow_inside_pixel_edges, 0, 1, 0, | 988 | DEFUN ("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 | ||
| 1013 | DEFUN ("window-inside-absolute-pixel-edges", | 1015 | DEFUN ("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 | ||
| 1732 | DEFUN ("window-dedicated-p", Fwindow_dedicated_p, Swindow_dedicated_p, | 1735 | DEFUN ("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); |