From 1df47e3844f79ba5f490096dd6206d50367363ba Mon Sep 17 00:00:00 2001 From: YAMAMOTO Mitsuharu Date: Mon, 11 Jan 2010 14:19:47 +0900 Subject: [PATCH] * 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. --- src/ChangeLog | 6 ++++++ src/xfns.c | 38 +++++++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/ChangeLog b/src/ChangeLog index 60ea0cf622c..cac262b3b2f 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2010-01-11 YAMAMOTO Mitsuharu + + * 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 * intervals.h, textprop.c (extend_property_ranges): Return value diff --git a/src/xfns.c b/src/xfns.c index db42e005d75..15ada091860 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -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); } -- 2.39.2