all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Eli Zaretskii <eliz@gnu.org>
To: Lennart Borgman <lennart.borgman@gmail.com>
Cc: cyd@stupidchicken.com, monnier@iro.umontreal.ca, emacs-devel@gnu.org
Subject: Re: The unwarranted scrolling assumption
Date: Sun, 20 Jun 2010 18:24:18 +0300	[thread overview]
Message-ID: <83eig1g21p.fsf@gnu.org> (raw)
In-Reply-To: <AANLkTinJn2GKDwgnipKYZQlEFjIgDJZvwboVf9FeWKP9@mail.gmail.com>

> From: Lennart Borgman <lennart.borgman@gmail.com>
> Date: Sat, 19 Jun 2010 23:58:09 +0200
> Cc: cyd@stupidchicken.com, monnier@iro.umontreal.ca, emacs-devel@gnu.org
> 
> Anyway the easiest way now seems that I take this trouble. I tried to
> apply your patch as sent, but I could not get it to work. Maybe you
> can just send me that function so I can replace that?

It's a bit silly to do that, when we have a dVCS, but here you go
anyway:

------------------------------------------------------------------
static int
try_scrolling (window, just_this_one_p, scroll_conservatively,
	       scroll_step, temp_scroll_step, last_line_misfit)
     Lisp_Object window;
     int just_this_one_p;
     EMACS_INT scroll_conservatively, scroll_step;
     int temp_scroll_step;
     int last_line_misfit;
{
  struct window *w = XWINDOW (window);
  struct frame *f = XFRAME (w->frame);
  struct text_pos pos, startp;
  struct it it;
  int this_scroll_margin, scroll_max, rc, height;
  int dy = 0, amount_to_scroll = 0, scroll_down_p = 0;
  int extra_scroll_margin_lines = last_line_misfit ? 1 : 0;
  Lisp_Object aggressive;
  int scroll_limit = INT_MAX / FRAME_LINE_HEIGHT (f);

#if GLYPH_DEBUG
  debug_method_add (w, "try_scrolling");
#endif

  SET_TEXT_POS_FROM_MARKER (startp, w->start);

  /* Compute scroll margin height in pixels.  We scroll when point is
     within this distance from the top or bottom of the window.  */
  if (scroll_margin > 0)
    this_scroll_margin = min (scroll_margin, WINDOW_TOTAL_LINES (w) / 4)
      * FRAME_LINE_HEIGHT (f);
  else
    this_scroll_margin = 0;

  /* Force scroll_conservatively to have a reasonable value, to avoid
     overflow while computing how much to scroll.  Note that the user
     can supply scroll-conservatively equal to `most-positive-fixnum',
     which can be larger than INT_MAX.  */
  if (scroll_conservatively > scroll_limit)
    {
      scroll_conservatively = scroll_limit;
      scroll_max = INT_MAX;
    }
  else if (scroll_step || scroll_conservatively || temp_scroll_step)
    /* Compute how much we should try to scroll maximally to bring
       point into view.  */
    scroll_max = (max (scroll_step,
		       max (scroll_conservatively, temp_scroll_step))
		  * FRAME_LINE_HEIGHT (f));
  else if (NUMBERP (current_buffer->scroll_down_aggressively)
	   || NUMBERP (current_buffer->scroll_up_aggressively))
    /* We're trying to scroll because of aggressive scrolling but no
       scroll_step is set.  Choose an arbitrary one.  */
    scroll_max = 10 * FRAME_LINE_HEIGHT (f);
  else
    scroll_max = 0;

 too_near_end:

  /* Decide whether to scroll down.  */
  if (PT > CHARPOS (startp))
    {
      int scroll_margin_y;

      /* Compute the pixel ypos of the scroll margin, then move it to
	 either that ypos or PT, whichever comes first.  */
      start_display (&it, w, startp);
      scroll_margin_y = it.last_visible_y - this_scroll_margin
	- FRAME_LINE_HEIGHT (f) * extra_scroll_margin_lines;
      move_it_to (&it, PT, -1, scroll_margin_y - 1, -1,
		  (MOVE_TO_POS | MOVE_TO_Y));

      if (PT > CHARPOS (it.current.pos))
	{
	  int y0 = line_bottom_y (&it);
	  /* Compute how many pixels below window bottom to stop searching
	     for PT.  This avoids costly search for PT that is far away if
	     the user limited scrolling by a small number of lines, but
	     always finds PT if scroll_conservatively is set to a large
	     number, such as most-positive-fixnum.  */
	  int slack = max (scroll_max, 10 * FRAME_LINE_HEIGHT (f));
	  int y_to_move =
	    slack >= INT_MAX - it.last_visible_y
	    ? INT_MAX
	    : it.last_visible_y + slack;

	  /* Compute the distance from the scroll margin to PT or to
	     the scroll limit, whichever comes first.  This should
	     include the height of the cursor line, to make that line
	     fully visible.  */
	  move_it_to (&it, PT, -1, y_to_move,
	  	      -1, MOVE_TO_POS | MOVE_TO_Y);
	  dy = line_bottom_y (&it) - y0;

	  if (dy > scroll_max)
	    return SCROLLING_FAILED;

	  scroll_down_p = 1;
	}
    }

  if (scroll_down_p)
    {
      /* Point is in or below the bottom scroll margin, so move the
	 window start down.  If scrolling conservatively, move it just
	 enough down to make point visible.  If scroll_step is set,
	 move it down by scroll_step.  */
      if (scroll_conservatively)
	amount_to_scroll
	  = min (max (dy, FRAME_LINE_HEIGHT (f)),
		 FRAME_LINE_HEIGHT (f) * scroll_conservatively);
      else if (scroll_step || temp_scroll_step)
	amount_to_scroll = scroll_max;
      else
	{
	  aggressive = current_buffer->scroll_up_aggressively;
	  height = WINDOW_BOX_TEXT_HEIGHT (w);
	  if (NUMBERP (aggressive))
	    {
	      double float_amount = XFLOATINT (aggressive) * height;
	      amount_to_scroll = float_amount;
	      if (amount_to_scroll == 0 && float_amount > 0)
		amount_to_scroll = 1;
	    }
	}

      if (amount_to_scroll <= 0)
	return SCROLLING_FAILED;

      start_display (&it, w, startp);
      move_it_vertically (&it, amount_to_scroll);

      /* If STARTP is unchanged, move it down another screen line.  */
      if (CHARPOS (it.current.pos) == CHARPOS (startp))
	move_it_by_lines (&it, 1, 1);
      startp = it.current.pos;
    }
  else
    {
      struct text_pos scroll_margin_pos = startp;

      /* See if point is inside the scroll margin at the top of the
         window.  */
      if (this_scroll_margin)
	{
	  start_display (&it, w, startp);
	  move_it_vertically (&it, this_scroll_margin);
	  scroll_margin_pos = it.current.pos;
	}

      if (PT < CHARPOS (scroll_margin_pos))
	{
	  /* Point is in the scroll margin at the top of the window or
	     above what is displayed in the window.  */
	  int y0;

	  /* Compute the vertical distance from PT to the scroll
	     margin position.  Give up if distance is greater than
	     scroll_max.  */
	  SET_TEXT_POS (pos, PT, PT_BYTE);
	  start_display (&it, w, pos);
	  y0 = it.current_y;
	  move_it_to (&it, CHARPOS (scroll_margin_pos), 0,
		      it.last_visible_y, -1,
		      MOVE_TO_POS | MOVE_TO_X | MOVE_TO_Y);
	  dy = it.current_y - y0;
	  if (dy > scroll_max)
	    return SCROLLING_FAILED;

	  /* Compute new window start.  */
	  start_display (&it, w, startp);

	  if (scroll_conservatively)
	    amount_to_scroll
	      = max (dy, FRAME_LINE_HEIGHT (f) * max (scroll_step, temp_scroll_step));
	  else if (scroll_step || temp_scroll_step)
	    amount_to_scroll = scroll_max;
	  else
	    {
	      aggressive = current_buffer->scroll_down_aggressively;
	      height = WINDOW_BOX_TEXT_HEIGHT (w);
	      if (NUMBERP (aggressive))
		{
		  double float_amount = XFLOATINT (aggressive) * height;
		  amount_to_scroll = float_amount;
		  if (amount_to_scroll == 0 && float_amount > 0)
		    amount_to_scroll = 1;
		}
	    }

	  if (amount_to_scroll <= 0)
	    return SCROLLING_FAILED;

	  move_it_vertically_backward (&it, amount_to_scroll);
	  startp = it.current.pos;
	}
    }

  /* Run window scroll functions.  */
  startp = run_window_scroll_functions (window, startp);

  /* Display the window.  Give up if new fonts are loaded, or if point
     doesn't appear.  */
  if (!try_window (window, startp, 0))
    rc = SCROLLING_NEED_LARGER_MATRICES;
  else if (w->cursor.vpos < 0)
    {
      clear_glyph_matrix (w->desired_matrix);
      rc = SCROLLING_FAILED;
    }
  else
    {
      /* Maybe forget recorded base line for line number display.  */
      if (!just_this_one_p
	  || current_buffer->clip_changed
	  || BEG_UNCHANGED < CHARPOS (startp))
	w->base_line_number = Qnil;

      /* If cursor ends up on a partially visible line,
	 treat that as being off the bottom of the screen.  */
      if (! cursor_row_fully_visible_p (w, extra_scroll_margin_lines <= 1, 0))
	{
	  clear_glyph_matrix (w->desired_matrix);
	  ++extra_scroll_margin_lines;
	  goto too_near_end;
	}
      rc = SCROLLING_SUCCESS;
    }

  return rc;
}



  reply	other threads:[~2010-06-20 15:24 UTC|newest]

Thread overview: 196+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-06-15 20:37 The unwarranted scrolling assumption Lennart Borgman
2010-06-15 21:39 ` Juri Linkov
2010-06-15 22:41   ` Juanma Barranquero
2010-06-15 23:00     ` Lennart Borgman
2010-06-15 23:24       ` Sean Sieger
2010-06-15 23:46         ` Juanma Barranquero
2010-06-15 23:59           ` Lennart Borgman
2010-06-16  0:21             ` Juanma Barranquero
2010-06-16  0:29             ` Chad Brown
2010-06-16  0:39               ` Lennart Borgman
2010-06-16 13:45                 ` Stefan Monnier
2010-06-16  0:55             ` David De La Harpe Golden
2010-06-16  1:40               ` Lennart Borgman
2010-06-16  9:36                 ` Kim F. Storm
2010-06-16 17:35                   ` Lennart Borgman
2010-06-16 21:22                     ` Eli Zaretskii
2010-06-16 22:17                       ` Lennart Borgman
2010-06-17  3:04                         ` Eli Zaretskii
2010-06-17 18:44                         ` Lennart Borgman
2010-06-17 19:08                           ` Eli Zaretskii
2010-06-17 19:14                             ` Lennart Borgman
2010-06-17 19:26                               ` Eli Zaretskii
2010-06-17 19:35                                 ` Lennart Borgman
2010-06-18  7:39                                   ` Eli Zaretskii
2010-06-18 13:30                                     ` Lennart Borgman
2010-06-18 13:52                                       ` Eli Zaretskii
2010-06-18 14:07                                         ` Lennart Borgman
2010-06-18 14:29                                           ` Eli Zaretskii
2010-06-18 14:37                                             ` Lennart Borgman
2010-06-18 14:58                                               ` Eli Zaretskii
2010-06-18 15:08                                                 ` Lennart Borgman
2010-06-18 15:35                                                   ` Eli Zaretskii
2010-06-18 16:39                                                     ` Lennart Borgman
2010-06-18 17:31                                                       ` Lennart Borgman
2010-06-18 19:00                                                         ` Eli Zaretskii
2010-06-18 21:25                                                           ` Lennart Borgman
2010-06-19  0:18                                                             ` Lennart Borgman
2010-06-19  8:44                                                               ` Eli Zaretskii
2010-06-19 15:41                                                                 ` Lennart Borgman
2010-06-19  8:36                                                             ` Eli Zaretskii
2010-06-19 14:45                                                               ` Lennart Borgman
2010-06-18 15:22                                               ` Stefan Monnier
2010-06-18 15:29                                                 ` Lennart Borgman
2010-06-18 15:36                                                   ` Lennart Borgman
2010-06-17 22:16                                 ` Lennart Borgman
2010-06-17 22:50                                   ` Lennart Borgman
2010-06-17 23:49                                     ` Lennart Borgman
2010-06-17 23:59                                       ` Lennart Borgman
2010-06-18  0:12                                         ` Lennart Borgman
2010-06-18  7:58                                       ` Eli Zaretskii
2010-06-18 13:48                                         ` Lennart Borgman
2010-06-19 13:27                                       ` Eli Zaretskii
2010-06-19 13:36                                         ` Lennart Borgman
2010-06-19 14:10                                           ` Eli Zaretskii
2010-06-19 14:20                                             ` Lennart Borgman
2010-06-19 16:07                                               ` Eli Zaretskii
2010-06-19 17:21                                                 ` Lennart Borgman
2010-06-19 18:02                                                   ` Eli Zaretskii
2010-06-19 18:07                                                     ` Lennart Borgman
2010-06-19 18:31                                                       ` Eli Zaretskii
2010-06-19 19:11                                                         ` Lennart Borgman
2010-06-18  7:54                                   ` Eli Zaretskii
2010-06-18 13:30                                     ` Stefan Monnier
2010-06-18 14:09                                       ` Eli Zaretskii
2010-06-18 14:18                                         ` Lennart Borgman
2010-06-18 15:11                                         ` Stefan Monnier
2010-06-18 15:46                                           ` Eli Zaretskii
2010-06-18 18:30                                             ` Stefan Monnier
2010-06-19  9:51                                               ` Eli Zaretskii
2010-06-19 11:36                                                 ` Eli Zaretskii
2010-06-19 12:54                                                   ` Eli Zaretskii
2010-06-19 13:00                                                     ` Lennart Borgman
2010-06-19 14:03                                                       ` Eli Zaretskii
2010-06-19 14:11                                                         ` Lennart Borgman
2010-06-19 14:16                                                           ` Eli Zaretskii
2010-06-19 14:20                                                             ` Lennart Borgman
2010-06-19 16:05                                                               ` Eli Zaretskii
2010-06-19 17:22                                                                 ` Lennart Borgman
2010-06-19 17:54                                                                   ` Eli Zaretskii
2010-06-19 17:58                                                                     ` Lennart Borgman
2010-06-19 18:30                                                                       ` Eli Zaretskii
2010-06-19 19:10                                                                         ` Lennart Borgman
2010-06-19 21:18                                                                           ` Eli Zaretskii
2010-06-19 21:58                                                                             ` Lennart Borgman
2010-06-20 15:24                                                                               ` Eli Zaretskii [this message]
2010-06-20 18:17                                                                                 ` Eli Zaretskii
2010-06-21  1:13                                                                                   ` Lennart Borgman
2010-06-21  2:55                                                                                     ` Eli Zaretskii
2010-06-21  9:31                                                                                       ` Lennart Borgman
2010-06-21  9:59                                                                                         ` Juanma Barranquero
2010-06-21 10:35                                                                                           ` Lennart Borgman
2010-06-21 11:09                                                                                             ` Juanma Barranquero
2010-06-21 11:21                                                                                               ` Lennart Borgman
2010-06-21 11:29                                                                                                 ` Juanma Barranquero
2010-06-21 11:41                                                                                                   ` Lennart Borgman
2010-06-21 11:48                                                                                                     ` Juanma Barranquero
2010-06-21 17:01                                                                                         ` Eli Zaretskii
2010-06-21 17:36                                                                                           ` Lennart Borgman
2010-06-19 20:13                                                                     ` David De La Harpe Golden
2010-06-19 20:26                                                                       ` Lennart Borgman
2010-06-19 20:30                                                                         ` Juanma Barranquero
2010-06-19 20:38                                                                           ` Lennart Borgman
2010-06-19 20:52                                                                             ` Juanma Barranquero
2010-06-19 21:33                                                                             ` Eli Zaretskii
2010-06-19 23:34                                                                               ` Lennart Borgman
2010-06-20 16:54                                                                             ` Stephen J. Turnbull
2010-06-21  1:04                                                                               ` Lennart Borgman
2010-06-21 11:38                                                                                 ` Stephen J. Turnbull
2010-06-21 11:50                                                                                   ` Lennart Borgman
2010-06-21 12:11                                                                                   ` David Engster
2010-06-21 12:23                                                                                     ` Lennart Borgman
2010-06-21 12:45                                                                                       ` David Engster
2010-06-21 14:06                                                                                         ` Lennart Borgman
2010-06-21 16:48                                                                                         ` Eli Zaretskii
2010-06-22  7:48                                                                                           ` David Engster
2010-06-22 17:53                                                                                             ` Eli Zaretskii
2010-06-21 16:55                                                                                     ` Eli Zaretskii
2010-06-19 21:17                                                                       ` Eli Zaretskii
2010-06-19 21:38                                                                         ` Eli Zaretskii
2010-06-19 22:19                                                                           ` David De La Harpe Golden
2010-06-20 18:13                                                                             ` Eli Zaretskii
2010-06-20 21:40                                                                               ` David De La Harpe Golden
2010-06-21  2:59                                                                                 ` Eli Zaretskii
2010-06-21 22:06                                                                                   ` David De La Harpe Golden
2010-06-21 23:04                                                                                     ` Lennart Borgman
2010-06-21 23:50                                                                                       ` David De La Harpe Golden
2010-06-22 18:27                                                                                     ` Eli Zaretskii
2010-06-22 20:22                                                                                       ` David De La Harpe Golden
2010-06-23 19:11                                                                                     ` Eli Zaretskii
2010-06-23 21:11                                                                                       ` David De La Harpe Golden
2010-06-25 15:15                                                                                         ` Eli Zaretskii
2010-06-25 19:42                                                                                           ` David De La Harpe Golden
2010-06-25 21:07                                                                                             ` Eli Zaretskii
2010-06-25 22:28                                                                                               ` David De La Harpe Golden
2010-06-23 22:18                                                                                       ` Stefan Monnier
2010-06-25 10:35                                                                                         ` Eli Zaretskii
2010-06-19 22:16                                                                         ` David De La Harpe Golden
2010-06-19 22:58                                                                           ` bug#6471: Arabic display by emacs -Q on HELLO David De La Harpe Golden
2019-08-21 22:57                                                                             ` Lars Ingebrigtsen
2019-08-22 14:05                                                                               ` Eli Zaretskii
2019-08-23  0:13                                                                                 ` Lars Ingebrigtsen
2010-06-19 12:00                                                 ` The unwarranted scrolling assumption Eli Zaretskii
2010-06-19 19:13                                                 ` Juanma Barranquero
2010-06-19 21:20                                                   ` Eli Zaretskii
2010-06-19 22:16                                                     ` Juanma Barranquero
2010-06-18 13:45                                     ` Lennart Borgman
2010-06-16 21:23                     ` Eli Zaretskii
2010-06-16 21:31                       ` Lennart Borgman
2010-06-16 21:17                 ` Eli Zaretskii
2010-06-16 21:27                   ` Lennart Borgman
2010-06-17  2:57                     ` Eli Zaretskii
2010-06-17  0:54                   ` Stefan Monnier
2010-06-17  1:17                     ` Lennart Borgman
2010-06-17  3:05                     ` Eli Zaretskii
2010-06-17  3:10                       ` Lennart Borgman
2010-06-17  3:59                         ` Lennart Borgman
2010-06-17  4:55                           ` Lennart Borgman
2010-06-18 13:45                             ` Eli Zaretskii
2010-06-18 13:56                               ` Lennart Borgman
2010-06-18 14:20                                 ` Eli Zaretskii
2010-06-18 14:32                                   ` Lennart Borgman
2010-06-18 15:03                                     ` Eli Zaretskii
2010-06-17 18:25                           ` Eli Zaretskii
2010-06-17 18:32                             ` Lennart Borgman
2010-06-17 18:43                               ` Eli Zaretskii
2010-06-17 19:10                                 ` Lennart Borgman
2010-06-17 19:23                                   ` Eli Zaretskii
2010-06-17 19:31                                     ` Lennart Borgman
2010-06-18  7:36                                       ` Eli Zaretskii
2010-06-18 13:22                                         ` Lennart Borgman
2010-06-17 20:17                                     ` David Engster
2010-06-17 20:39                                       ` Chad Brown
2010-06-17 20:58                                         ` David Engster
2010-06-17 22:30                                       ` Juanma Barranquero
2010-06-17 22:27                                     ` Juanma Barranquero
2010-06-18  8:02                                       ` Eli Zaretskii
2010-06-18 10:15                                         ` Juanma Barranquero
2010-06-18 13:25                                           ` Lennart Borgman
2010-06-18 13:29                                           ` Stefan Monnier
2010-06-18 13:49                                             ` Eli Zaretskii
2010-06-18 15:05                                               ` Stefan Monnier
2010-06-18 15:32                                                 ` Eli Zaretskii
2010-06-18 15:15                                             ` Juanma Barranquero
2010-06-17 19:36                                 ` David Engster
2010-06-17 19:40                                   ` Lennart Borgman
2010-06-18  5:25                                   ` Stefan Monnier
2010-06-16  8:55               ` David Engster
2010-06-15 23:53         ` Lennart Borgman
2010-06-17 20:35         ` Juri Linkov
2010-06-17 22:33           ` Juanma Barranquero
2010-06-18  8:27             ` Juri Linkov
2010-06-18 10:09               ` Juanma Barranquero
  -- strict thread matches above, loose matches on Subject: below --
2010-06-18 19:02 grischka
2010-06-26  3:18 grischka
2010-06-26  5:10 ` David De La Harpe Golden
2010-06-26  8:49   ` Eli Zaretskii

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=83eig1g21p.fsf@gnu.org \
    --to=eliz@gnu.org \
    --cc=cyd@stupidchicken.com \
    --cc=emacs-devel@gnu.org \
    --cc=lennart.borgman@gmail.com \
    --cc=monnier@iro.umontreal.ca \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.