From aea124c47dd16cde97fa467082b4be5f2c6d31f7 Mon Sep 17 00:00:00 2001 From: Martin Rudalics Date: Wed, 26 Feb 2014 09:07:34 +0100 Subject: [PATCH] Fixes around Bug#16647. * xdisp.c (remember_mouse_glyph): Handle ON_RIGHT_DIVIDER and ON_BOTTOM_DIVIDER cases. * window.c (coordinates_in_window): Return ON_VERTICAL_BORDER only if the window has no right divider. (Fcoordinates_in_window_p): Fix doc-string. --- src/ChangeLog | 9 +++++++++ src/window.c | 25 +++++++++++++++---------- src/xdisp.c | 10 ++++++++++ 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 6e697e4c944..0c0d5964742 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,12 @@ +2014-02-26 Martin Rudalics + + Fixes around Bug#16647. + * xdisp.c (remember_mouse_glyph): Handle ON_RIGHT_DIVIDER and + ON_BOTTOM_DIVIDER cases. + * window.c (coordinates_in_window): Return ON_VERTICAL_BORDER + only if the window has no right divider. + (Fcoordinates_in_window_p): Fix doc-string. + 2014-02-25 Juanma Barranquero * lread.c (Funintern): Fix doc to match advertised calling convention. diff --git a/src/window.c b/src/window.c index 0ec1aa96324..2fb0dcaadaa 100644 --- a/src/window.c +++ b/src/window.c @@ -1269,12 +1269,12 @@ coordinates_in_window (register struct window *w, int x, int y) /* On vertical window divider (which prevails horizontal dividers)? */ if (!WINDOW_RIGHTMOST_P (w) - && WINDOW_RIGHT_DIVIDER_WIDTH (w) + && WINDOW_RIGHT_DIVIDER_WIDTH (w) > 0 && x >= right_x - WINDOW_RIGHT_DIVIDER_WIDTH (w) && x <= right_x) return ON_RIGHT_DIVIDER; /* On the horizontal window divider? */ - else if (WINDOW_BOTTOM_DIVIDER_WIDTH (w) + else if (WINDOW_BOTTOM_DIVIDER_WIDTH (w) > 0 && y >= (bottom_y - WINDOW_BOTTOM_DIVIDER_WIDTH (w)) && y <= bottom_y) return ON_BOTTOM_DIVIDER; @@ -1294,9 +1294,10 @@ coordinates_in_window (register struct window *w, int x, int y) resize windows horizontally in case we're using toolkit scroll bars. Note: If scrollbars are on the left, the window that must be eventually resized is that on the left of WINDOW. */ - if ((WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (w) - && !WINDOW_LEFTMOST_P (w) - && eabs (x - left_x) < grabbable_width) + if ((WINDOW_RIGHT_DIVIDER_WIDTH (w) == 0) + && (WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (w) + && !WINDOW_LEFTMOST_P (w) + && eabs (x - left_x) < grabbable_width) || (!WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_LEFT (w) && !WINDOW_RIGHTMOST_P (w) && eabs (x - right_x) < grabbable_width)) @@ -1331,6 +1332,7 @@ coordinates_in_window (register struct window *w, int x, int y) if (FRAME_WINDOW_P (f)) { if (!w->pseudo_window_p + && WINDOW_RIGHT_DIVIDER_WIDTH (w) == 0 && !WINDOW_HAS_VERTICAL_SCROLL_BAR (w) && !WINDOW_RIGHTMOST_P (w) && (eabs (x - right_x) < grabbable_width)) @@ -1339,6 +1341,7 @@ coordinates_in_window (register struct window *w, int x, int y) /* Need to say "x > right_x" rather than >=, since on character terminals, the vertical line's x coordinate is right_x. */ else if (!w->pseudo_window_p + && WINDOW_RIGHT_DIVIDER_WIDTH (w) == 0 && !WINDOW_RIGHTMOST_P (w) /* Why check ux if we are not the rightmost window? Also shouldn't a pseudo window always be rightmost? */ @@ -1352,8 +1355,8 @@ coordinates_in_window (register struct window *w, int x, int y) ? (x >= left_x + WINDOW_LEFT_FRINGE_WIDTH (w)) : (x < left_x + lmargin_width))) return ON_LEFT_MARGIN; - - return ON_LEFT_FRINGE; + else + return ON_LEFT_FRINGE; } if (x >= text_right) @@ -1363,8 +1366,8 @@ coordinates_in_window (register struct window *w, int x, int y) ? (x < right_x - WINDOW_RIGHT_FRINGE_WIDTH (w)) : (x >= right_x - rmargin_width))) return ON_RIGHT_MARGIN; - - return ON_RIGHT_FRINGE; + else + return ON_RIGHT_FRINGE; } /* Everything special ruled out - must be on text area */ @@ -1419,8 +1422,10 @@ measured in characters from the upper-left corner of the frame. frame. If COORDINATES are in the text portion of WINDOW, the coordinates relative to the window are returned. +If they are in the bottom divider of WINDOW, `bottom-divider' is returned. +If they are in the right divider of WINDOW, `right-divider' is returned. If they are in the mode line of WINDOW, `mode-line' is returned. -If they are in the top mode line of WINDOW, `header-line' is returned. +If they are in the header line of WINDOW, `header-line' is returned. If they are in the left fringe of WINDOW, `left-fringe' is returned. If they are in the right fringe of WINDOW, `right-fringe' is returned. If they are on the border between WINDOW and its right sibling, diff --git a/src/xdisp.c b/src/xdisp.c index c35a64d0774..836b825aafa 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -2452,6 +2452,16 @@ remember_mouse_glyph (struct frame *f, int gx, int gy, NativeRectangle *rect) ? WINDOW_RIGHT_FRINGE_WIDTH (w) : 0))); width = WINDOW_SCROLL_BAR_AREA_WIDTH (w); + goto row_glyph; + + case ON_RIGHT_DIVIDER: + gx = WINDOW_RIGHT_PIXEL_EDGE (w) - WINDOW_RIGHT_DIVIDER_WIDTH (w); + width = WINDOW_RIGHT_DIVIDER_WIDTH (w); + goto row_glyph; + + case ON_BOTTOM_DIVIDER: + gx = 0; + width = WINDOW_RIGHT_PIXEL_EDGE (w) - WINDOW_RIGHT_DIVIDER_WIDTH (w); row_glyph: gr = 0, gy = 0; -- 2.39.2