]> git.eshelyaron.com Git - emacs.git/commitdiff
* xfns.c (x_set_menu_bar_lines) [!USE_X_TOOLKIT && !USE_GTK]:
authorYAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
Mon, 11 Jan 2010 05:19:47 +0000 (14:19 +0900)
committerYAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
Mon, 11 Jan 2010 05:19:47 +0000 (14:19 +0900)
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.

src/ChangeLog
src/xfns.c

index 60ea0cf622cd250e107dbe6cd42cec94cc2773c4..cac262b3b2f2374b2c6d22a240ce4522f88ef0bf 100644 (file)
@@ -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
index db42e005d7511120abd62a4f2ca4dfaad79e0298..15ada091860018aff4ce1492cfdcdd09e68e241a 100644 (file)
@@ -1317,7 +1317,43 @@ x_set_menu_bar_lines (f, value, oldval)
 #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);
 }