From: Martin Rudalics Date: Tue, 21 Oct 2014 06:57:28 +0000 (+0200) Subject: Handle wrapped menu bar lines when resizing frames with Windows API. X-Git-Tag: emacs-25.0.90~2635^2~681 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=e5b3b7d3f387c992e6507bef3885056c5235e9ee;p=emacs.git Handle wrapped menu bar lines when resizing frames with Windows API. * w32fns.c (Fw32_frame_menu_bar_size): New function. * w32term.c (x_set_window_size): Account for wrapped menu bar lines when setting up frame height (Bug#15174 and Bug#18720). (w32_add_wrapped_menu_bar_lines): New variable. --- diff --git a/src/ChangeLog b/src/ChangeLog index 075e41f9bd1..c7070c8000b 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,10 @@ +2014-10-21 Martin Rudalics + + * w32fns.c (Fw32_frame_menu_bar_size): New function. + * w32term.c (x_set_window_size): Account for wrapped menu bar + lines when setting up frame height (Bug#15174 and Bug#18720). + (w32_add_wrapped_menu_bar_lines): New variable. + 2014-10-21 Stefan Monnier * xdisp.c (redisplay_window): Re-run pre-redisplay-function after we diff --git a/src/w32fns.c b/src/w32fns.c index 05da2a5c1d1..829347b2c6c 100644 --- a/src/w32fns.c +++ b/src/w32fns.c @@ -7366,6 +7366,34 @@ This is a direct interface to the Windows API FindWindow function. */) return Qt; } +DEFUN ("w32-frame-menu-bar-size", Fw32_frame_menu_bar_size, Sw32_frame_menu_bar_size, 0, 1, 0, + doc: /* Return sizes of menu bar on frame FRAME. +The return value is a list of three elements: The current width and +height of FRAME's menu bar in pixels and the default height of the menu +bar in pixels. If FRAME is omitted or nil, the selected frame is +used. */) + (Lisp_Object frame) +{ + struct frame *f = decode_any_frame (frame); + MENUBARINFO info; + int width, height, default_height; + + block_input (); + + default_height = GetSystemMetrics (SM_CYMENUSIZE); + info.cbSize = sizeof (info); + info.rcBar.right = info.rcBar.left = 0; + info.rcBar.top = info.rcBar.bottom = 0; + GetMenuBarInfo (FRAME_W32_WINDOW (f), 0xFFFFFFFD, 0, &info); + width = info.rcBar.right - info.rcBar.left; + height = info.rcBar.bottom - info.rcBar.top; + + unblock_input (); + + return list3 (make_number (width), make_number (height), + make_number (default_height)); +} + DEFUN ("w32-frame-rect", Fw32_frame_rect, Sw32_frame_rect, 0, 2, 0, doc: /* Return boundary rectangle of FRAME in screen coordinates. FRAME must be a live frame and defaults to the selected one. @@ -8399,6 +8427,7 @@ only be necessary if the default setting causes problems. */); defsubr (&Sw32_toggle_lock_key); defsubr (&Sw32_window_exists_p); defsubr (&Sw32_frame_rect); + defsubr (&Sw32_frame_menu_bar_size); defsubr (&Sw32_battery_status); #ifdef WINDOWSNT diff --git a/src/w32term.c b/src/w32term.c index e8bcf3ef639..4cffa3818ce 100644 --- a/src/w32term.c +++ b/src/w32term.c @@ -6119,6 +6119,30 @@ x_set_window_size (struct frame *f, int change_gravity, int width, int height, b pixelheight = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, height); } + if (w32_add_wrapped_menu_bar_lines) + { + /* When the menu bar wraps sending a SetWindowPos shrinks the + height of the frame when the wrapped menu bar lines are not + accounted for (Bug#15174 and Bug#18720). Here we add these + extra lines to the frame height. */ + MENUBARINFO info; + int default_menu_bar_height; + int menu_bar_height; + + /* Why is (apparently) SM_CYMENUSIZE needed here instead of + SM_CYMENU ?? */ + default_menu_bar_height = GetSystemMetrics (SM_CYMENUSIZE); + info.cbSize = sizeof (info); + info.rcBar.top = info.rcBar.bottom = 0; + GetMenuBarInfo (FRAME_W32_WINDOW (f), 0xFFFFFFFD, 0, &info); + menu_bar_height = info.rcBar.bottom - info.rcBar.top; + + if ((default_menu_bar_height > 0) + && (menu_bar_height > default_menu_bar_height) + && ((menu_bar_height % default_menu_bar_height) == 0)) + pixelheight = pixelheight + menu_bar_height - default_menu_bar_height; + } + f->win_gravity = NorthWestGravity; x_wm_set_size_hint (f, (long) 0, 0); @@ -7080,6 +7104,21 @@ systems of the NT family, including W2K, XP, Vista, Windows 7 and Windows 8. It is set to nil on Windows 9X. */); w32_unicode_filenames = 0; + + /* FIXME: The following two variables will be (hopefully) removed + before Emacs 25.1 gets released. */ + + DEFVAR_BOOL ("w32-add-wrapped-menu-bar-lines", + w32_add_wrapped_menu_bar_lines, + doc: /* Non-nil means frame resizing accounts for wrapped menu bar lines. +A value of nil means frame resizing does not add the height of wrapped +menu bar lines when sending a frame resize request to the Windows API. +This usually means that the resulting frame height is off by the number +of wrapped menu bar lines. If this is non-nil, Emacs adds the height of +wrapped menu bar lines when sending frame resize requests to the Windows +API. */); + w32_add_wrapped_menu_bar_lines = 1; + DEFVAR_BOOL ("w32-enable-frame-resize-hack", w32_enable_frame_resize_hack, doc: /* Non-nil means enable hack for frame resizing on Windows.