changeset 106788:cf03cdb87fff

* xfns.c (x_set_menu_bar_lines) [!USE_X_TOOLKIT && !USE_GTK]: Clear areas that will not be updated after change of menu bar lines. Clear the menu bar window's current matrix when the window gets empty.
author YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
date Mon, 11 Jan 2010 14:19:47 +0900
parents 7038dde9ccd7
children 05ac7369b8c2 f039ef236594
files src/ChangeLog src/xfns.c
diffstat 2 files changed, 43 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Sun Jan 10 19:03:38 2010 -0800
+++ b/src/ChangeLog	Mon Jan 11 14:19:47 2010 +0900
@@ -1,3 +1,9 @@
+2010-01-11  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
+
+	* xfns.c (x_set_menu_bar_lines) [!USE_X_TOOLKIT && !USE_GTK]:
+	Clear areas that will not be updated after change of menu bar lines.
+	Clear the menu bar window's current matrix when the window gets empty.
+
 2010-01-09  Chong Yidong  <cyd@stupidchicken.com>
 
 	* intervals.h, textprop.c (extend_property_ranges): Return value
--- a/src/xfns.c	Sun Jan 10 19:03:38 2010 -0800
+++ b/src/xfns.c	Mon Jan 11 14:19:47 2010 +0900
@@ -1317,7 +1317,43 @@
 #else /* not USE_X_TOOLKIT && not USE_GTK */
   FRAME_MENU_BAR_LINES (f) = nlines;
   change_window_heights (f->root_window, nlines - olines);
-#endif /* not USE_X_TOOLKIT */
+
+  /* If the menu bar height gets changed, the internal border below
+     the top margin has to be cleared.  Also, if the menu bar gets
+     larger, the area for the added lines has to be cleared except for
+     the first menu bar line that is to be drawn later.  */
+  if (nlines != olines)
+    {
+      int height = FRAME_INTERNAL_BORDER_WIDTH (f);
+      int width = FRAME_PIXEL_WIDTH (f);
+      int y;
+
+      /* height can be zero here. */
+      if (height > 0 && width > 0)
+	{
+	  y = FRAME_TOP_MARGIN_HEIGHT (f);
+
+	  BLOCK_INPUT;
+	  x_clear_area (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
+			0, y, width, height, False);
+	  UNBLOCK_INPUT;
+	}
+
+      if (nlines > 1 && nlines > olines)
+	{
+	  y = (olines == 0 ? 1 : olines) * FRAME_LINE_HEIGHT (f);
+	  height = nlines * FRAME_LINE_HEIGHT (f) - y;
+
+	  BLOCK_INPUT;
+	  x_clear_area (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
+			0, y, width, height, False);
+	  UNBLOCK_INPUT;
+	}
+
+      if (nlines == 0 && WINDOWP (f->menu_bar_window))
+	clear_glyph_matrix (XWINDOW (f->menu_bar_window)->current_matrix);
+    }
+#endif /* not USE_X_TOOLKIT && not USE_GTK */
   adjust_glyphs (f);
 }