From: Eli Zaretskii Date: Mon, 3 Dec 2012 20:48:12 +0000 (+0200) Subject: Fix bug #13055 with cursor positioning inside scroll-margin. X-Git-Tag: emacs-24.3.90~173^2~9^2~82 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=3cf3c60796b2dbff6f7300d64210acd1029a17c4;p=emacs.git Fix bug #13055 with cursor positioning inside scroll-margin. src/xdisp.c (redisplay_window): If the cursor is visible, but inside the scroll margin, move point outside the margin. --- diff --git a/src/ChangeLog b/src/ChangeLog index f2b65db257d..20ed5a99a1a 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2012-12-03 Eli Zaretskii + + * xdisp.c (redisplay_window): If the cursor is visible, but inside + the scroll margin, move point outside the margin. (Bug#13055) + 2012-12-03 Jan Djärv * gtkutil.c (my_log_handler): New function. diff --git a/src/xdisp.c b/src/xdisp.c index 6199c2a436e..5f6d69dea3a 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -15717,6 +15717,35 @@ redisplay_window (Lisp_Object window, int just_this_one_p) Move it back to a fully-visible line. */ new_vpos = window_box_height (w); } + else if (w->cursor.vpos >=0) + { + /* Some people insist on not letting point enter the scroll + margin, even though this part handles windows that didn't + scroll at all. */ + struct frame *f = XFRAME (w->frame); + int margin = min (scroll_margin, WINDOW_TOTAL_LINES (w) / 4); + int pixel_margin = margin * FRAME_LINE_HEIGHT (f); + bool header_line = WINDOW_WANTS_HEADER_LINE_P (w); + + /* Note: We add an extra FRAME_LINE_HEIGHT, because the loop + below, which finds the row to move point to, advances by + the Y coordinate of the _next_ row, see the definition of + MATRIX_ROW_BOTTOM_Y. */ + if (w->cursor.vpos < margin + header_line) + new_vpos + = pixel_margin + (header_line + ? CURRENT_HEADER_LINE_HEIGHT (w) + : 0) + FRAME_LINE_HEIGHT (f); + else + { + int window_height = window_box_height (w); + + if (header_line) + window_height += CURRENT_HEADER_LINE_HEIGHT (w); + if (w->cursor.y >= window_height - pixel_margin) + new_vpos = window_height - pixel_margin; + } + } /* If we need to move point for either of the above reasons, now actually do it. */