]> git.eshelyaron.com Git - emacs.git/commitdiff
Handle wrapped menu bar lines when resizing frames with Windows API.
authorMartin Rudalics <rudalics@gmx.at>
Tue, 21 Oct 2014 06:57:28 +0000 (08:57 +0200)
committerMartin Rudalics <rudalics@gmx.at>
Tue, 21 Oct 2014 06:57:28 +0000 (08:57 +0200)
* 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.

src/ChangeLog
src/w32fns.c
src/w32term.c

index 075e41f9bd1e3972405fd52e1216eb280d6a1094..c7070c8000ba0f701210d7a3554eb0e1901d77be 100644 (file)
@@ -1,3 +1,10 @@
+2014-10-21  Martin Rudalics  <rudalics@gmx.at>
+
+       * 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  <monnier@iro.umontreal.ca>
 
        * xdisp.c (redisplay_window): Re-run pre-redisplay-function after we
index 05da2a5c1d1d60c51229b78ab2202a10d13fca50..829347b2c6cc059e0dca03e1bc90770618d46cbf 100644 (file)
@@ -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
index e8bcf3ef6392080bfde947ad5ded9b265936c19b..4cffa3818cef27b67e0072a432e7e503b2a9c6b9 100644 (file)
@@ -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.