summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ChangeLog22
-rw-r--r--src/frame.h15
-rw-r--r--src/w32term.c5
-rw-r--r--src/window.h18
-rw-r--r--src/xdisp.c12
-rw-r--r--src/xfns.c2
-rw-r--r--src/xterm.c9
7 files changed, 54 insertions, 29 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 80da326c1a9..309c663d1ef 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,25 @@
+2010-01-09 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
+
+ * frame.h (FRAME_TOP_MARGIN_HEIGHT): New macro.
+ (FRAME_LINE_TO_PIXEL_Y, FRAME_PIXEL_Y_TO_LINE): Take account of pseudo
+ windows above internal border.
+
+ * window.h (WINDOW_MENU_BAR_P, WINDOW_TOOL_BAR_P): New macros.
+ (WINDOW_TOP_EDGE_Y, WINDOW_BOTTOM_EDGE_Y): Take account of pseudo
+ windows above internal border.
+
+ * xdisp.c (get_glyph_string_clip_rects, init_glyph_string): Don't treat
+ tool bar windows specially.
+
+ * xfns.c (x_set_tool_bar_lines): Take account of menu bar height.
+
+ * xterm.c (x_after_update_window_line): Don't treat tool bar windows
+ specially.
+ (XTflash): Take account of menu bar height.
+
+ * w32term.c (x_after_update_window_line): Don't treat tool bar windows
+ specially.
+
2010-01-08 Jan Djärv <jan.h.d@swipnet.se>
* dispnew.c (change_frame_size_1): newwidth == FRAME_COLS (f) must
diff --git a/src/frame.h b/src/frame.h
index 8ed73c6c7d6..0386d7b4c84 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -590,6 +590,11 @@ typedef struct frame *FRAME_PTR;
#define FRAME_TOP_MARGIN(F) \
(FRAME_MENU_BAR_LINES (F) + FRAME_TOOL_BAR_LINES (F))
+/* Pixel height of the top margin above. */
+
+#define FRAME_TOP_MARGIN_HEIGHT(f) \
+ (FRAME_TOP_MARGIN (f) * FRAME_LINE_HEIGHT (f))
+
/* Nonzero if this frame should display a menu bar
in a way that does not use any text lines. */
#if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI) \
@@ -975,7 +980,7 @@ extern Lisp_Object selected_frame;
at ROW/COL. */
#define FRAME_LINE_TO_PIXEL_Y(f, row) \
- (FRAME_INTERNAL_BORDER_WIDTH (f) \
+ ((row < FRAME_TOP_MARGIN (f) ? 0 : FRAME_INTERNAL_BORDER_WIDTH (f)) \
+ (row) * FRAME_LINE_HEIGHT (f))
#define FRAME_COL_TO_PIXEL_X(f, col) \
@@ -1000,7 +1005,13 @@ extern Lisp_Object selected_frame;
the pixel on FRAME at Y/X. */
#define FRAME_PIXEL_Y_TO_LINE(f, y) \
- (((y) - FRAME_INTERNAL_BORDER_WIDTH (f)) \
+ (((y) < FRAME_TOP_MARGIN_HEIGHT (f) \
+ ? (y) \
+ : ((y) < FRAME_TOP_MARGIN_HEIGHT (f) + FRAME_INTERNAL_BORDER_WIDTH (f) \
+ ? (y) - (FRAME_TOP_MARGIN_HEIGHT (f) + FRAME_INTERNAL_BORDER_WIDTH (f) \
+ /* Arrange for the division to round down. */ \
+ + FRAME_LINE_HEIGHT (f) - 1) \
+ : (y) - FRAME_INTERNAL_BORDER_WIDTH (f))) \
/ FRAME_LINE_HEIGHT (f))
#define FRAME_PIXEL_X_TO_COL(f, x) \
diff --git a/src/w32term.c b/src/w32term.c
index 008042c810a..029e41e4bd9 100644
--- a/src/w32term.c
+++ b/src/w32term.c
@@ -734,11 +734,6 @@ x_after_update_window_line (desired_row)
{
int y = WINDOW_TO_FRAME_PIXEL_Y (w, max (0, desired_row->y));
- /* Internal border is drawn below the tool bar. */
- if (WINDOWP (f->tool_bar_window)
- && w == XWINDOW (f->tool_bar_window))
- y -= width;
-
BLOCK_INPUT;
{
HDC hdc = get_frame_dc (f);
diff --git a/src/window.h b/src/window.h
index 8b7d945fd13..bb6a0ff9123 100644
--- a/src/window.h
+++ b/src/window.h
@@ -400,18 +400,32 @@ struct window
(FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W)) \
+ WINDOW_RIGHT_EDGE_COL (W) * WINDOW_FRAME_COLUMN_WIDTH (W))
+/* 1 if W is a menu bar window. */
+
+#define WINDOW_MENU_BAR_P(W) \
+ (WINDOWP (WINDOW_XFRAME (W)->menu_bar_window) \
+ && (W) == XWINDOW (WINDOW_XFRAME (W)->menu_bar_window))
+
+/* 1 if W is a tool bar window. */
+
+#define WINDOW_TOOL_BAR_P(W) \
+ (WINDOWP (WINDOW_XFRAME (W)->tool_bar_window) \
+ && (W) == XWINDOW (WINDOW_XFRAME (W)->tool_bar_window))
+
/* Return the frame y-position at which window W starts.
This includes a header line, if any. */
#define WINDOW_TOP_EDGE_Y(W) \
- (FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W)) \
+ (((WINDOW_MENU_BAR_P (W) || WINDOW_TOOL_BAR_P (W)) \
+ ? 0 : FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W))) \
+ WINDOW_TOP_EDGE_LINE (W) * WINDOW_FRAME_LINE_HEIGHT (W))
/* Return the frame y-position before which window W ends.
This includes a mode line, if any. */
#define WINDOW_BOTTOM_EDGE_Y(W) \
- (FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W)) \
+ (((WINDOW_MENU_BAR_P (W) || WINDOW_TOOL_BAR_P (W)) \
+ ? 0 : FRAME_INTERNAL_BORDER_WIDTH (WINDOW_XFRAME (W))) \
+ WINDOW_BOTTOM_EDGE_LINE (W) * WINDOW_FRAME_LINE_HEIGHT (W))
diff --git a/src/xdisp.c b/src/xdisp.c
index 435f5dc5334..8d023fc5ae3 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -1981,12 +1981,6 @@ get_glyph_string_clip_rects (s, rects, n)
r.y = WINDOW_HEADER_LINE_HEIGHT (s->w);
else
r.y = max (0, s->row->y);
-
- /* If drawing a tool-bar window, draw it over the internal border
- at the top of the window. */
- if (WINDOWP (s->f->tool_bar_window)
- && s->w == XWINDOW (s->f->tool_bar_window))
- r.y -= FRAME_INTERNAL_BORDER_WIDTH (s->f);
}
r.y = WINDOW_TO_FRAME_PIXEL_Y (s->w, r.y);
@@ -19424,12 +19418,6 @@ init_glyph_string (s, OPTIONAL_HDC (hdc) char2b, w, row, area, start, hl)
s->first_glyph = row->glyphs[area] + start;
s->height = row->height;
s->y = WINDOW_TO_FRAME_PIXEL_Y (w, row->y);
-
- /* Display the internal border below the tool-bar window. */
- if (WINDOWP (s->f->tool_bar_window)
- && s->w == XWINDOW (s->f->tool_bar_window))
- s->y -= FRAME_INTERNAL_BORDER_WIDTH (s->f);
-
s->ybase = s->y + row->ascent;
}
diff --git a/src/xfns.c b/src/xfns.c
index b886a3ff674..572cf38e0c7 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -1403,7 +1403,7 @@ x_set_tool_bar_lines (f, value, oldval)
{
int height = FRAME_INTERNAL_BORDER_WIDTH (f);
int width = FRAME_PIXEL_WIDTH (f);
- int y = nlines * FRAME_LINE_HEIGHT (f);
+ int y = (FRAME_MENU_BAR_LINES (f) + nlines) * FRAME_LINE_HEIGHT (f);
/* height can be zero here. */
if (height > 0 && width > 0)
diff --git a/src/xterm.c b/src/xterm.c
index efd30f4a601..2093b68c110 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -753,11 +753,6 @@ x_after_update_window_line (desired_row)
{
int y = WINDOW_TO_FRAME_PIXEL_Y (w, max (0, desired_row->y));
- /* Internal border is drawn below the tool bar. */
- if (WINDOWP (f->tool_bar_window)
- && w == XWINDOW (f->tool_bar_window))
- y -= width;
-
BLOCK_INPUT;
x_clear_area (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
0, y, width, height, False);
@@ -3062,7 +3057,7 @@ XTflash (f)
XFillRectangle (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), gc,
flash_left,
(FRAME_INTERNAL_BORDER_WIDTH (f)
- + FRAME_TOOL_BAR_LINES (f) * FRAME_LINE_HEIGHT (f)),
+ + FRAME_TOP_MARGIN_HEIGHT (f)),
width, flash_height);
XFillRectangle (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), gc,
flash_left,
@@ -3116,7 +3111,7 @@ XTflash (f)
XFillRectangle (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), gc,
flash_left,
(FRAME_INTERNAL_BORDER_WIDTH (f)
- + FRAME_TOOL_BAR_LINES (f) * FRAME_LINE_HEIGHT (f)),
+ + FRAME_TOP_MARGIN_HEIGHT (f)),
width, flash_height);
XFillRectangle (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), gc,
flash_left,