(coordinates_in_window): Fix computation for

position on vertical line between mode lines.
This commit is contained in:
Gerd Moellmann 2000-12-17 15:11:56 +00:00
parent c844a81af8
commit b0228ace9e
2 changed files with 89 additions and 58 deletions

View file

@ -1,5 +1,8 @@
2000-12-17 Gerd Moellmann <gerd@gnu.org>
* window.c (coordinates_in_window): Fix computation for
position on vertical line between mode lines.
* xfns.c (unwind_create_frame): Return t if frame was deleted.
Don't alter tip_frame or tip_window.
(unwind_create_tip_frame): Set tip_frame to nil only if frame

View file

@ -497,21 +497,28 @@ coordinates_in_window (w, x, y)
register struct window *w;
register int *x, *y;
{
struct frame *f = XFRAME (WINDOW_FRAME (w));
int left_x, right_x, top_y, bottom_y;
int flags_area_width = FRAME_LEFT_FLAGS_AREA_WIDTH (f);
/* Let's make this a global enum later, instead of using numbers
everywhere. */
enum {ON_NOTHING, ON_TEXT, ON_MODE_LINE, ON_VERTICAL_BORDER,
ON_HEADER_LINE, ON_LEFT_FRINGE, ON_RIGHT_FRINGE};
struct frame *f = XFRAME (WINDOW_FRAME (w));
int left_x, right_x, top_y, bottom_y;
int flags_area_width = FRAME_LEFT_FLAGS_AREA_WIDTH (f);
int part;
int ux = CANON_X_UNIT (f), uy = CANON_Y_UNIT (f);
int x0 = XFASTINT (w->left) * ux;
int x1 = x0 + XFASTINT (w->width) * ux;
if (*x < x0 || *x >= x1)
return ON_NOTHING;
/* In what's below, we subtract 1 when computing right_x because we
want the rightmost pixel, which is given by left_pixel+width-1. */
if (w->pseudo_window_p)
{
left_x = 0;
right_x = XFASTINT (w->width) * CANON_Y_UNIT (f) - 1;
right_x = XFASTINT (w->width) * CANON_X_UNIT (f) - 1;
top_y = WINDOW_DISPLAY_TOP_EDGE_PIXEL_Y (w);
bottom_y = WINDOW_DISPLAY_BOTTOM_EDGE_PIXEL_Y (w);
}
@ -530,50 +537,59 @@ coordinates_in_window (w, x, y)
sibling, say it's on the vertical line. That's to be able
to resize windows horizontally in case we're using toolkit
scroll bars. */
if (WINDOW_WANTS_MODELINE_P (w)
&& *y < bottom_y
&& *y >= bottom_y - CURRENT_MODE_LINE_HEIGHT (w))
{
if (!WINDOW_RIGHTMOST_P (w)
&& (abs (*x - ((XFASTINT (w->left) + XFASTINT (w->width))
* CANON_X_UNIT (f)))
< CANON_X_UNIT (f) / 2))
return ON_VERTICAL_BORDER;
return ON_MODE_LINE;
}
if (WINDOW_WANTS_HEADER_LINE_P (w)
&& *y >= top_y
&& *y < top_y + CURRENT_HEADER_LINE_HEIGHT (w))
{
if (!WINDOW_RIGHTMOST_P (w)
&& (abs (*x - ((XFASTINT (w->left) + XFASTINT (w->width))
* CANON_X_UNIT (f)))
< CANON_X_UNIT (f) / 2))
return ON_VERTICAL_BORDER;
return ON_HEADER_LINE;
}
/* Completely outside anything interesting? */
if (*y < top_y
|| *y >= bottom_y
|| *x < (left_x
- flags_area_width
- (FRAME_LEFT_SCROLL_BAR_WIDTH (f)
* CANON_X_UNIT (f)))
|| *x > right_x + flags_area_width)
return ON_NOTHING;
if (FRAME_WINDOW_P (f))
if (WINDOW_WANTS_MODELINE_P (w)
&& *y >= bottom_y - CURRENT_MODE_LINE_HEIGHT (w)
&& *y < bottom_y)
{
/* We're somewhere on the mode line. We consider the place
between mode lines of horizontally adjacent mode lines
as the vertical border. If scroll bars on the left,
return the right window. */
part = ON_MODE_LINE;
if (FRAME_HAS_VERTICAL_SCROLL_BARS_ON_LEFT (f))
{
if (abs (*x - x0) < ux / 2)
part = ON_VERTICAL_BORDER;
}
else if (!WINDOW_RIGHTMOST_P (w) && abs (*x - x1) < ux / 2)
part = ON_VERTICAL_BORDER;
}
else if (WINDOW_WANTS_HEADER_LINE_P (w)
&& *y < top_y + CURRENT_HEADER_LINE_HEIGHT (w)
&& *y >= top_y)
{
part = ON_HEADER_LINE;
if (FRAME_HAS_VERTICAL_SCROLL_BARS_ON_LEFT (f))
{
if (abs (*x - x0) < ux / 2)
part = ON_VERTICAL_BORDER;
}
else if (!WINDOW_RIGHTMOST_P (w) && abs (*x - x1) < ux / 2)
part = ON_VERTICAL_BORDER;
}
/* Outside anything interesting? */
else if (*y < top_y
|| *y >= bottom_y
|| *x < (left_x
- flags_area_width
- FRAME_LEFT_SCROLL_BAR_WIDTH (f) * ux)
|| *x > right_x + flags_area_width)
{
part = ON_NOTHING;
}
else if (FRAME_WINDOW_P (f))
{
if (!w->pseudo_window_p
&& !FRAME_HAS_VERTICAL_SCROLL_BARS (f)
&& !WINDOW_RIGHTMOST_P (w)
&& (abs (*x - right_x - flags_area_width) < CANON_X_UNIT (f) / 2))
return ON_VERTICAL_BORDER;
if (*x < left_x || *x > right_x)
&& (abs (*x - right_x - flags_area_width) < ux / 2))
{
part = ON_VERTICAL_BORDER;
}
else if (*x < left_x || *x > right_x)
{
/* Other lines than the mode line don't include flags areas and
scroll bars on the left. */
@ -581,7 +597,13 @@ coordinates_in_window (w, x, y)
/* Convert X and Y to window-relative pixel coordinates. */
*x -= left_x;
*y -= top_y;
return *x < left_x ? ON_LEFT_FRINGE : ON_RIGHT_FRINGE;
part = *x < left_x ? ON_LEFT_FRINGE : ON_RIGHT_FRINGE;
}
else
{
*x -= left_x;
*y -= top_y;
part = ON_TEXT;
}
}
else
@ -596,24 +618,30 @@ coordinates_in_window (w, x, y)
/* Convert X and Y to window-relative pixel coordinates. */
*x -= left_x;
*y -= top_y;
return *x < left_x ? ON_LEFT_FRINGE : ON_RIGHT_FRINGE;
part = *x < left_x ? ON_LEFT_FRINGE : ON_RIGHT_FRINGE;
}
/* Here, too, "*x > right_x" is because of character terminals. */
if (!w->pseudo_window_p
&& !WINDOW_RIGHTMOST_P (w)
&& *x > right_x - CANON_X_UNIT (f))
/* On the border on the right side of the window? Assume that
this area begins at RIGHT_X minus a canonical char width. */
return ON_VERTICAL_BORDER;
else if (!w->pseudo_window_p
&& !WINDOW_RIGHTMOST_P (w)
&& *x > right_x - ux)
{
/* On the border on the right side of the window? Assume that
this area begins at RIGHT_X minus a canonical char width. */
part = ON_VERTICAL_BORDER;
}
else
{
/* Convert X and Y to window-relative pixel coordinates. */
*x -= left_x;
*y -= top_y;
part = ON_TEXT;
}
}
/* Convert X and Y to window-relative pixel coordinates. */
*x -= left_x;
*y -= top_y;
return ON_TEXT;
return part;
}
DEFUN ("coordinates-in-window-p", Fcoordinates_in_window_p,
Scoordinates_in_window_p, 2, 2, 0,
"Return non-nil if COORDINATES are in WINDOW.\n\