diff -r ba9f075a347d src/window.c
--- a/src/window.c	Sun Aug 28 16:02:28 2011 +0200
+++ b/src/window.c	Sun Sep 18 14:12:16 2011 +0900
@@ -67,6 +67,11 @@
 static int check_snapshot_rec __ARGS((frame_T *sn, frame_T *fr));
 static win_T *restore_snapshot_rec __ARGS((frame_T *sn, frame_T *fr));
 
+static int frame_check_height __ARGS((frame_T *topfrp, int height));
+#ifdef FEAT_VERTSPLIT
+static int frame_check_width __ARGS((frame_T *topfrp, int width));
+#endif
+
 #endif /* FEAT_WINDOWS */
 
 static win_T *win_alloc __ARGS((win_T *after, int hidden));
@@ -4591,7 +4596,7 @@
     /* First try setting the heights of windows with 'winfixheight'.  If
      * that doesn't result in the right height, forget about that option. */
     frame_new_height(topframe, h, FALSE, TRUE);
-    if (topframe->fr_height != h)
+    if (!frame_check_height(topframe, h))
 	frame_new_height(topframe, h, FALSE, FALSE);
 
     (void)win_comp_pos();		/* recompute w_winrow and w_wincol */
@@ -4625,7 +4630,7 @@
     /* First try setting the widths of windows with 'winfixwidth'.  If that
      * doesn't result in the right width, forget about that option. */
     frame_new_width(topframe, (int)Columns, FALSE, TRUE);
-    if (topframe->fr_width != Columns)
+    if (!frame_check_width(topframe, Columns))
 	frame_new_width(topframe, (int)Columns, FALSE, FALSE);
 
     (void)win_comp_pos();		/* recompute w_winrow and w_wincol */
@@ -6604,3 +6609,52 @@
     return cur;
 }
 #endif
+
+/*
+ * Check if frame and its children are in the right height.
+ */
+    static int
+frame_check_height(frame_T *topfrp, int height)
+{
+    frame_T *frp;
+
+    if (topfrp->fr_height != height)
+	return FALSE;
+
+    if (topfrp->fr_layout == FR_ROW)
+    {
+	for (frp = topfrp->fr_child; frp != NULL; frp = frp->fr_next)
+	{
+	    if (frp->fr_height != height)
+		return FALSE;
+	}
+    }
+
+    return TRUE;
+}
+
+#ifdef FEAT_VERTSPLIT
+/*
+ * Check if frame and its children are in the right width.
+ */
+    static int
+frame_check_width(frame_T *topfrp, int width)
+{
+    frame_T *frp;
+
+    if (topfrp->fr_width != width)
+	return FALSE;
+
+    if (topfrp->fr_layout == FR_COL)
+    {
+	for (frp = topfrp->fr_child; frp != NULL; frp->fr_next)
+	{
+	    if (frp->fr_width != width)
+		return FALSE;
+	}
+    }
+
+    return TRUE;
+}
+#endif
+
