mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-02-23 13:27:36 +00:00
(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.
This commit is contained in:
parent
6f8a87c027
commit
f1de8c7741
2 changed files with 66 additions and 39 deletions
|
|
@ -1,3 +1,18 @@
|
|||
2007-07-15 Martin Rudalics <rudalics@gmx.at>
|
||||
|
||||
* 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 <jasonr@gnu.org>
|
||||
|
||||
* process.c [WINDOWSNT]: Don't undefine AF_INET6.
|
||||
|
|
|
|||
90
src/window.c
90
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");
|
||||
|
|
|
|||
Loading…
Reference in a new issue