>From 0f3a50fa311e6ec1ccb1a0d03d521cc2ef9b309a Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sun, 28 Aug 2016 17:23:04 -0400 Subject: [PATCH v1 2/3] Don't count mode line for scroll-margin limit * src/window.c (window_scroll_margin): Subtract mode line height from upper limit applied to scroll margin (Bug #5718). * test/src/window-tests.el: New tests for scroll-margin behavior. --- src/window.c | 3 +- test/src/window-tests.el | 86 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 test/src/window-tests.el diff --git a/src/window.c b/src/window.c index 2046fe7..dbda435 100644 --- a/src/window.c +++ b/src/window.c @@ -4800,7 +4800,8 @@ window_scroll_margin (struct window *window, enum margin_unit unit) { int frame_line_height = default_line_pixel_height (window); int window_total_lines - = window->total_lines * WINDOW_FRAME_LINE_HEIGHT (window) + = (window->total_lines * WINDOW_FRAME_LINE_HEIGHT (window) + - WINDOW_MODE_LINE_HEIGHT (window)) / frame_line_height; int margin = min (scroll_margin, window_total_lines / 4); if (unit == MARGIN_IN_PIXELS) diff --git a/test/src/window-tests.el b/test/src/window-tests.el new file mode 100644 index 0000000..88ded18 --- /dev/null +++ b/test/src/window-tests.el @@ -0,0 +1,86 @@ +;;; window-tests.el -- tests for window.c -*- lexical-binding: t -*- + +;; Copyright (C) 2016 Free Software Foundation, Inc. + +;; This file is part of GNU Emacs. + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Code: + +(require 'ert) + +(defun window-test-scrolling (margin &optional effective-margin) + (unless effective-margin + (setq effective-margin margin)) + (erase-buffer) + (insert (mapconcat #'number-to-string + (number-sequence 1 200) "\n")) + (goto-char 1) + (sit-for 0) + (let ((scroll-margin margin) + (mode-lines (/ (window-mode-line-height) (line-pixel-height))) + (wstart (window-start))) + ;; Stopping before `scroll-margin' so we shouldn't have + ;; scrolled. + (let ((current-prefix-arg (- (window-height) + mode-lines (window-start) effective-margin))) + (call-interactively 'next-line)) + (sit-for 0) + (should (= wstart (window-start))) + ;; Passing `scroll-margin' should trigger scrolling. + (call-interactively 'next-line) + (sit-for 0) + (should (/= wstart (window-start))) + ;; Scroll back to top. + (let ((current-prefix-arg (window-start))) + (call-interactively 'scroll-down-command)) + (sit-for 0) + (should (= 1 (window-start))))) + +(defmacro window-with-test-buffer-window (&rest body) + (let ((bufvar (make-symbol "buf"))) + `(let ((,bufvar (get-buffer-create "*test*"))) + (with-selected-window (display-buffer ,bufvar) + (with-current-buffer ,bufvar + ,@body))))) + +(ert-deftest window-test-scroll-margin-0 () + (skip-unless (not noninteractive)) + (window-with-test-buffer-window + (window-test-scrolling 0))) + +(ert-deftest window-test-scroll-margin-negative () + "A negative `scroll-margin' should be the same as 0." + (skip-unless (not noninteractive)) + (window-with-test-buffer-window + (window-test-scrolling -10 0))) + +(ert-deftest window-test-scroll-margin-max () + (skip-unless (not noninteractive)) + (window-with-test-buffer-window + (let* ((mode-lines (/ (window-mode-line-height) (line-pixel-height))) + (max-margin (/ (- (window-height) mode-lines) 4))) + (window-test-scrolling max-margin)))) + +(ert-deftest window-test-scroll-margin-over-max () + "A `scroll-margin' more than max should be the same as max." + (skip-unless (not noninteractive)) + (window-with-test-buffer-window + ;; Check that mode line is not counted for determining max margin. + (set-window-text-height nil 7) + (let* ((mode-lines (/ (window-mode-line-height) (line-pixel-height))) + (max-margin (/ (- (window-height) mode-lines) 4))) + (window-test-scrolling (+ max-margin 1) max-margin) + (window-test-scrolling (+ max-margin 2) max-margin)))) -- 2.9.3