changeset 106987:7362dc093e43

* xfns.c (Fx_create_frame): If frame height is too big, try sizes 24 and 10. Bug #3643.
author Jan D. <jan.h.d@swipnet.se>
date Mon, 25 Jan 2010 08:46:15 +0100
parents e9c454218ac8 (current diff) 6612625cb8e9 (diff)
children 05efa1881381 de2044ac357c
files
diffstat 2 files changed, 22 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Sun Jan 24 22:03:23 2010 -0800
+++ b/src/ChangeLog	Mon Jan 25 08:46:15 2010 +0100
@@ -1,3 +1,8 @@
+2010-01-25  Jan Djärv  <jan.h.d@swipnet.se>
+
+	* xfns.c (Fx_create_frame): If frame height is too big, try
+	sizes 24 and 10. Bug #3643.
+
 2010-01-24  Stefan Monnier  <monnier@iro.umontreal.ca>
 
 	Try and fix bug#788, hopefully for real this time.
--- a/src/xfns.c	Sun Jan 24 22:03:23 2010 -0800
+++ b/src/xfns.c	Mon Jan 25 08:46:15 2010 +0100
@@ -3518,27 +3518,35 @@
   window_prompting = x_figure_window_size (f, parms, 1);
 
   /* Don't make height higher than display height unless the user asked
-     for it.  */
+     for it.  Try sizes 24 and 10 if current is too large.  */
   height = FRAME_LINES (f);
   tem = x_get_arg (dpyinfo, parms, Qheight, 0, 0, RES_TYPE_NUMBER);
   if (EQ (tem, Qunbound))
     {
-      int ph = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, FRAME_LINES (f));
+      int h = FRAME_LINES (f) + FRAME_TOOL_BAR_LINES (f)
+        + FRAME_MENU_BAR_LINES (f) + 2;
+      int ph = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, h);
       int dph = DisplayHeight (FRAME_X_DISPLAY (f), FRAME_X_SCREEN_NUMBER (f));
+      static int tryheight[] = { 24, 10, 0 } ;
+      int i;
+
+      ph += (FRAME_EXTERNAL_TOOL_BAR (f) ? 32 : 0) /* Gtk toolbar size */
+        + (FRAME_EXTERNAL_MENU_BAR (f) ? 24 : 0); /* Arbitrary */
+
       /* Some desktops have fixed menus above and/or panels below.  Try to
          figure out the usable size we have for emacs.  */
       current_desktop = x_get_current_desktop (f);
       x_get_desktop_workarea (f, current_desktop, &deskw, &deskh);
       if (deskh > 0 && deskh < dph) dph = deskh;
       
-      if (ph > dph)
+      /* Allow 40 pixels for manager decorations.  */
+      for (i = 0; ph+40 > dph && tryheight[i] != 0; ++i)
         {
-          height = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, dph) -
-            FRAME_TOOL_BAR_LINES (f) - FRAME_MENU_BAR_LINES (f);
-          if (FRAME_EXTERNAL_TOOL_BAR (f))
-            height -= 2; /* We can't know how big it will be.  */
-          if (FRAME_EXTERNAL_MENU_BAR (f))
-            height -= 2; /* We can't know how big it will be.  */
+          height = tryheight[i];
+          h = height + FRAME_TOOL_BAR_LINES (f) + FRAME_MENU_BAR_LINES (f) + 2;
+          ph = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, h)
+            + (FRAME_EXTERNAL_TOOL_BAR (f) ? 32 : 0)
+            + (FRAME_EXTERNAL_MENU_BAR (f) ? 24 : 0);
         }
     }