From eef185dfc82330198b77b46cf7e48f8142c55ea2 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Wed, 24 Feb 2021 17:43:08 +0200 Subject: [PATCH] Better support for 'truncate-line' non-nil in the mini-window * src/xdisp.c (resize_mini_window): Resize the mini-window when multi-line text is displayed under truncate-lines non-nil in the minibuffer. (Bug#46718) --- src/xdisp.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/xdisp.c b/src/xdisp.c index f86d3527b3d..cd3455aefcf 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -11857,18 +11857,27 @@ resize_mini_window (struct window *w, bool exact_p) max_height = clip_to_bounds (unit, max_height, windows_height); /* Find out the height of the text in the window. */ - if (it.line_wrap == TRUNCATE) - height = unit; - else - { - last_height = 0; - move_it_to (&it, ZV, -1, -1, -1, MOVE_TO_POS); - if (it.max_ascent == 0 && it.max_descent == 0) - height = it.current_y + last_height; - else - height = it.current_y + it.max_ascent + it.max_descent; - height -= min (it.extra_line_spacing, it.max_extra_line_spacing); + last_height = 0; + move_it_to (&it, ZV, -1, -1, -1, MOVE_TO_POS); + /* If move_it_to moved to the next visible line after EOB, + account for the height of the last full line. */ + if (it.max_ascent == 0 && it.max_descent == 0) + { + height = it.current_y; + /* Don't add the last line's height if lines are truncated + and the text doesn't end in a newline. + FIXME: if the text ends in a newline from a display + property or an overlay string, they lose: the mini-window + might not show the last empty line. */ + if (!(it.line_wrap == TRUNCATE + && it.current_x <= it.first_visible_x + && ZV_BYTE > 1 + && FETCH_BYTE (ZV_BYTE - 1) != '\n')) + height += last_height; } + else + height = it.current_y + it.max_ascent + it.max_descent; + height -= min (it.extra_line_spacing, it.max_extra_line_spacing); /* Compute a suitable window start. */ if (height > max_height) -- 2.39.2