From f1de8c774164ebf596d101200e2e87222dbd8523 Mon Sep 17 00:00:00 2001 From: Martin Rudalics Date: Sun, 15 Jul 2007 08:23:02 +0000 Subject: [PATCH] (window_min_size_2): New function. (window_min_size_1, size_window, Fdisplay_buffer) (Fsplit_window, adjust_window_trailing_edge): Use it to avoid windows without mode- or header-lines when window-min-height is too small. (size_window): Reset nodelete_p after testing it, following an earlier note by Kim F. Storm. (display_buffer): Do not set split_height_threshold to twice the value of window_min_height to avoid changing the value of a customizable variable. Rather explicitly check whether the height of the window that shall be splitted is at least as large as split_height_threshold. --- src/ChangeLog | 15 +++++++++ src/window.c | 90 +++++++++++++++++++++++++++++---------------------- 2 files changed, 66 insertions(+), 39 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index a707d884454..ab4210134f0 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,18 @@ +2007-07-15 Martin Rudalics + + * window.c (window_min_size_2): New function. + (window_min_size_1, size_window, Fdisplay_buffer) + (Fsplit_window, adjust_window_trailing_edge): Use it to avoid + windows without mode- or header-lines when window-min-height is + too small. + (size_window): Reset nodelete_p after testing it, following an + earlier note by Kim F. Storm. + (display_buffer): Do not set split_height_threshold to twice the + value of window_min_height to avoid changing the value of a + customizable variable. Rather explicitly check whether the + height of the window that shall be splitted is at least as large + as split_height_threshold. + 2007-07-14 Jason Rumney * process.c [WINDOWSNT]: Don't undefine AF_INET6. diff --git a/src/window.c b/src/window.c index 3cb4292d346..90e2e09da51 100644 --- a/src/window.c +++ b/src/window.c @@ -62,6 +62,7 @@ static void window_scroll P_ ((Lisp_Object, int, int, int)); static void window_scroll_pixel_based P_ ((Lisp_Object, int, int, int)); static void window_scroll_line_based P_ ((Lisp_Object, int, int, int)); static int window_min_size_1 P_ ((struct window *, int)); +static int window_min_size_2 P_ ((struct window *, int)); static int window_min_size P_ ((struct window *, int, int, int *)); static void size_window P_ ((Lisp_Object, int, int, int, int, int)); static int freeze_window_start P_ ((struct window *, void *)); @@ -2553,7 +2554,6 @@ check_frame_size (frame, rows, cols) *cols = MIN_SAFE_WINDOW_WIDTH; } - /* Value is non-zero if window W is fixed-size. WIDTH_P non-zero means check if W's width can be changed, otherwise check W's height. CHECK_SIBLINGS_P non-zero means check resizablity of WINDOW's @@ -2655,6 +2655,33 @@ window_fixed_size_p (w, width_p, check_siblings_p) return fixed_p; } +/* Return the minimum size for leaf window W. WIDTH_P non-zero means + take into account fringes and the scrollbar of W. WIDTH_P zero + means take into account mode-line and header-line of W. Return 1 + for the minibuffer. */ + +static int +window_min_size_2 (w, width_p) + struct window *w; + int width_p; +{ + int size; + + if (width_p) + size = max (window_min_width, + (MIN_SAFE_WINDOW_WIDTH + + WINDOW_FRINGE_COLS (w) + + WINDOW_SCROLL_BAR_COLS (w))); + else if (MINI_WINDOW_P (w)) + size = 1; + else + size = max (window_min_height, + (MIN_SAFE_WINDOW_HEIGHT + + (WINDOW_WANTS_MODELINE_P (w) ? 1 : 0) + + (WINDOW_WANTS_HEADER_LINE_P (w) ? 1 : 0 ))); + + return size; +} /* Return the minimum size of window W, not taking fixed-width windows into account. WIDTH_P non-zero means return the minimum width, @@ -2724,22 +2751,7 @@ window_min_size_1 (w, width_p) } } else - { - if (width_p) - size = max (window_min_width, - (MIN_SAFE_WINDOW_WIDTH - + WINDOW_FRINGE_COLS (w) - + WINDOW_SCROLL_BAR_COLS (w))); - else - { - if (MINI_WINDOW_P (w) - || (!WINDOW_WANTS_MODELINE_P (w) - && !WINDOW_WANTS_HEADER_LINE_P (w))) - size = 1; - else - size = window_min_height; - } - } + size = window_min_size_2 (w, width_p); return size; } @@ -2981,11 +2993,6 @@ size_window (window, size, width_p, nodelete_p, first_only, last_only) Lisp_Object child, *forward, *sideward; int old_size, min_size, safe_min_size; - /* We test nodelete_p != 2 and nodelete_p != 1 below, so it - seems like it's too soon to do this here. ++KFS. */ - if (nodelete_p == 2) - nodelete_p = 0; - check_min_window_sizes (); size = max (0, size); @@ -2996,22 +3003,23 @@ size_window (window, size, width_p, nodelete_p, first_only, last_only) { old_size = WINDOW_TOTAL_COLS (w); min_size = window_min_width; - /* Ensure that there is room for the scroll bar and fringes! - We may reduce display margins though. */ - safe_min_size = (MIN_SAFE_WINDOW_WIDTH - + WINDOW_FRINGE_COLS (w) - + WINDOW_SCROLL_BAR_COLS (w)); + safe_min_size = window_min_size_2 (w, 1); } else { old_size = XINT (w->total_lines); min_size = window_min_height; - safe_min_size = MIN_SAFE_WINDOW_HEIGHT; + safe_min_size = window_min_size_2 (w, 0); } if (old_size < min_size && nodelete_p != 2) w->too_small_ok = Qt; + /* Move the following test here since otherwise the + preceding test doesn't make sense. martin. */ + if (nodelete_p == 2) + nodelete_p = 0; + /* Maybe delete WINDOW if it's too small. */ if (nodelete_p != 1 && !NILP (w->parent)) { @@ -3708,9 +3716,6 @@ displayed. */) frames = Qnil; if (FRAME_MINIBUF_ONLY_P (f)) XSETFRAME (frames, last_nonminibuf_frame); - /* Don't try to create a window if we would get an error. */ - if (split_height_threshold < window_min_height << 1) - split_height_threshold = window_min_height << 1; /* Note that both Fget_largest_window and Fget_lru_window ignore minibuffers and dedicated windows. @@ -3737,8 +3742,10 @@ displayed. */) split it. */ if (!NILP (window) && ! FRAME_NO_SPLIT_P (XFRAME (XWINDOW (window)->frame)) + && WINDOW_FULL_WIDTH_P (XWINDOW (window)) && window_height (window) >= split_height_threshold - && WINDOW_FULL_WIDTH_P (XWINDOW (window))) + && (window_height (window) + >= (2 * window_min_size_2 (XWINDOW (window), 0)))) window = Fsplit_window (window, Qnil, Qnil); else { @@ -3751,7 +3758,9 @@ displayed. */) && ! FRAME_NO_SPLIT_P (XFRAME (XWINDOW (window)->frame)) && (EQ (window, selected_window) || EQ (XWINDOW (window)->parent, Qnil)) - && window_height (window) >= window_min_height << 1) + && window_height (window) >= split_height_threshold + && (window_height (window) + >= (2 * window_min_size_2 (XWINDOW (window), 0)))) window = Fsplit_window (window, Qnil, Qnil); else window = Fget_lru_window (frames, Qnil); @@ -4000,9 +4009,11 @@ See Info node `(elisp)Splitting Windows' for more details and examples.*/) if (NILP (horflag)) { - if (size_int < window_min_height) + int window_safe_height = window_min_size_2 (o, 0); + + if (size_int < window_safe_height) error ("Window height %d too small (after splitting)", size_int); - if (size_int + window_min_height > XFASTINT (o->total_lines)) + if (size_int + window_safe_height > XFASTINT (o->total_lines)) error ("Window height %d too small (after splitting)", XFASTINT (o->total_lines) - size_int); if (NILP (o->parent) @@ -4015,10 +4026,11 @@ See Info node `(elisp)Splitting Windows' for more details and examples.*/) } else { - if (size_int < window_min_width) + int window_safe_width = window_min_size_2 (o, 1); + + if (size_int < window_safe_width) error ("Window width %d too small (after splitting)", size_int); - - if (size_int + window_min_width > XFASTINT (o->total_cols)) + if (size_int + window_safe_width > XFASTINT (o->total_cols)) error ("Window width %d too small (after splitting)", XFASTINT (o->total_cols) - size_int); if (NILP (o->parent) @@ -4499,7 +4511,7 @@ adjust_window_trailing_edge (window, delta, horiz_flag) /* Don't make this window too small. */ if (XINT (CURSIZE (window)) + delta - < (horiz_flag ? window_min_width : window_min_height)) + < window_min_size_2 (XWINDOW (window), horiz_flag)) { Fset_window_configuration (old_config); error ("Cannot adjust window size as specified"); -- 2.39.2