From f2999a33d0d67867997c66c777e0d6df1076e18d Mon Sep 17 00:00:00 2001 From: Martin Rudalics Date: Mon, 24 Mar 2014 09:50:17 +0100 Subject: [PATCH] Refine previous fix of x_set_window_size to handle Bug#17077. * w32term.c (x_set_window_size): Refine fix from 2014-03-14 (Bug#17077). --- src/ChangeLog | 5 +++++ src/w32term.c | 35 +++++++++++++++++++++++------------ 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 2069d00a240..da82eca9df2 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2014-03-24 Martin Rudalics + + * w32term.c (x_set_window_size): Refine fix from 2014-03-14 + (Bug#17077). + 2014-03-23 Glenn Morris * fileio.c (Ffile_symlink_p): Doc fix. (Bug#17073) diff --git a/src/w32term.c b/src/w32term.c index 15b502b7c1b..4c426aca921 100644 --- a/src/w32term.c +++ b/src/w32term.c @@ -5653,30 +5653,41 @@ x_set_window_size (struct frame *f, int change_gravity, int width, int height, b compute_fringe_widths (f, 0); - if (pixelwise) + if (frame_resize_pixelwise) { - pixelwidth = FRAME_TEXT_TO_PIXEL_WIDTH (f, width); - pixelheight = FRAME_TEXT_TO_PIXEL_HEIGHT (f, height); + if (pixelwise) + { + pixelwidth = FRAME_TEXT_TO_PIXEL_WIDTH (f, width); + pixelheight = FRAME_TEXT_TO_PIXEL_HEIGHT (f, height); + } + else + { + pixelwidth = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, width); + pixelheight = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, height); + } } else { - pixelwidth = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, width); - pixelheight = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, height); - } - - if (!frame_resize_pixelwise) - { /* If we don't resize frames pixelwise, round sizes to multiples of character sizes here. Otherwise, when enforcing size hints while processing WM_WINDOWPOSCHANGING in w32_wnd_proc, we might clip our frame rectangle to a multiple of the frame's character size and subsequently lose our mode line or scroll bar. - Bug#16923 could be one possible consequence of this. */ + Bug#16923 could be one possible consequence of this. Carefully + reverse-engineer what WM_WINDOWPOSCHANGING does here since + otherwise we might make our frame too small, see Bug#17077. */ int unit_width = FRAME_COLUMN_WIDTH (f); int unit_height = FRAME_LINE_HEIGHT (f); - pixelwidth = (pixelwidth / unit_width) * unit_width; - pixelheight = (pixelheight / unit_height) * unit_height; + pixelwidth = (((((pixelwise ? width : (width * FRAME_COLUMN_WIDTH (f))) + + FRAME_TOTAL_FRINGE_WIDTH (f)) + / unit_width) * unit_width) + + FRAME_SCROLL_BAR_AREA_WIDTH (f) + + 2 * FRAME_INTERNAL_BORDER_WIDTH (f)); + + pixelheight = ((((pixelwise ? height : (height * FRAME_LINE_HEIGHT (f))) + / unit_height) * unit_height) + + 2 * FRAME_INTERNAL_BORDER_WIDTH (f)); } f->win_gravity = NorthWestGravity; -- 2.11.4.GIT