GNU bug report logs - #6325
24.0.50; Fringe not correctly updated when using set-window-vscroll

Previous Next

Package: emacs;

Reported by: David Engster <deng <at> randomsample.de>

Date: Tue, 1 Jun 2010 13:33:02 UTC

Severity: normal

Found in version 24.0.50

Done: YAMAMOTO Mitsuharu <mituharu <at> math.s.chiba-u.ac.jp>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 6325 in the body.
You can then email your comments to 6325 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to owner <at> debbugs.gnu.org, bug-gnu-emacs <at> gnu.org:
bug#6325; Package emacs. (Tue, 01 Jun 2010 13:33:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to David Engster <deng <at> randomsample.de>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Tue, 01 Jun 2010 13:33:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: David Engster <deng <at> randomsample.de>
To: bug-gnu-emacs <at> gnu.org
Subject: 24.0.50; Fringe not correctly updated when using set-window-vscroll
Date: Tue, 01 Jun 2010 15:24:13 +0200
(Note: This bug is also visible on Emacs 23).

Recipe:

* emacs -Q

* In the scratch buffer evaluate

  (progn
    (setq indicate-buffer-boundaries 'left)
    (insert (make-string 100 10))
    (goto-char (point-min))
    (forward-line 5)
    (redisplay)
    (set-window-vscroll nil 1))

* There are now two arrows in the fringe on the lower left side, but it
  should only be one at the bottom.

* Adding more 'set-window-vscrolls' will add more arrows. For example,
  this will create four:

  (progn
    (setq indicate-buffer-boundaries 'left)
    (insert (make-string 100 10))
    (goto-char (point-min))
    (forward-line 5)
    (redisplay)
    (set-window-vscroll nil 1)
    (redisplay)
    (set-window-vscroll nil 2)
    (redisplay)
    (set-window-vscroll nil 3))

* The same happens with pixel (fractional) scrolling, it'll just makes
  the arrows overlap:

  (progn
    (setq indicate-buffer-boundaries 'left)
    (insert (make-string 100 10))
    (goto-char (point-min))
    (forward-line 5)
    (redisplay)
    (set-window-vscroll nil 3 t))

Regards,
David

In GNU Emacs 24.0.50.1 (i686-pc-linux-gnu, GTK+ Version 2.20.1)
Windowing system distributor `The X.Org Foundation', version 11.0.10706000
configured using `configure  '--prefix=/opt/emacs24''

Important settings:
  value of $LC_ALL: nil
  value of $LC_COLLATE: nil
  value of $LC_CTYPE: nil
  value of $LC_MESSAGES: nil
  value of $LC_MONETARY: nil
  value of $LC_NUMERIC: nil
  value of $LC_TIME: nil
  value of $LANG: en_US.UTF-8
  value of $XMODIFIERS: nil
  locale-coding-system: utf-8-unix
  default enable-multibyte-characters: t

Major mode: Lisp Interaction

Minor modes in effect:
  tooltip-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  line-number-mode: t
  transient-mark-mode: (only . t)

Recent input:
<down-mouse-2> <mouse-2> <left> <left> <left> SPC t 
<left> <left> 0 <backspace> <backspace> 3 C-e ) C-x 
C-e <down-mouse-1> <mouse-movement> <mouse-movement> 
<drag-mouse-1> M-x r e p o r t - e m <tab> <return
>

Recent messages:
For information about GNU Emacs and the GNU system, type C-h C-a.
Mark set
3

Load-path shadows:
None found.

Features:
(shadow sort gnus-util mail-extr message sendmail regexp-opt rfc822 mml
easymenu mml-sec mm-decode mm-bodies mm-encode mail-parse rfc2231
rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mailabbrev mail-utils
gmm-utils mailheader emacsbug tooltip ediff-hook vc-hooks
lisp-float-type mwheel x-win x-dnd tool-bar dnd fontset image fringe
lisp-mode register page menu-bar rfn-eshadow timer select scroll-bar
mldrag mouse jit-lock font-lock syntax facemenu font-core frame cham
georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao
korean japanese hebrew greek romanian slovak czech european ethiopic
indian cyrillic chinese case-table epa-hook jka-cmpr-hook help simple
abbrev loaddefs button minibuffer faces cus-face files text-properties
overlay md5 base64 format env code-pages mule custom widget
hashtable-print-readable backquote make-network-process dbusbind
dynamic-setting font-render-setting gtk x-toolkit x multi-tty emacs)




Information forwarded to owner <at> debbugs.gnu.org, bug-gnu-emacs <at> gnu.org:
bug#6325; Package emacs. (Wed, 30 Jun 2010 08:24:02 GMT) Full text and rfc822 format available.

Message #8 received at 6325 <at> debbugs.gnu.org (full text, mbox):

From: YAMAMOTO Mitsuharu <mituharu <at> math.s.chiba-u.ac.jp>
To: David Engster <deng <at> randomsample.de>
Cc: 6325 <at> debbugs.gnu.org
Subject: Re: bug#6325: 24.0.50;
	Fringe not correctly updated when using set-window-vscroll
Date: Wed, 30 Jun 2010 17:23:14 +0900
>>>>> On Tue, 01 Jun 2010 15:24:13 +0200, David Engster <deng <at> randomsample.de> said:

> (Note: This bug is also visible on Emacs 23).
> Recipe:

> * emacs -Q

> * In the scratch buffer evaluate

>   (progn
>     (setq indicate-buffer-boundaries 'left)
>     (insert (make-string 100 10))
>     (goto-char (point-min))
>     (forward-line 5)
>     (redisplay)
>     (set-window-vscroll nil 1))

> * There are now two arrows in the fringe on the lower left side, but it
>   should only be one at the bottom.

> * Adding more 'set-window-vscrolls' will add more arrows. For example,
>   this will create four:

>   (progn
>     (setq indicate-buffer-boundaries 'left)
>     (insert (make-string 100 10))
>     (goto-char (point-min))
>     (forward-line 5)
>     (redisplay)
>     (set-window-vscroll nil 1)
>     (redisplay)
>     (set-window-vscroll nil 2)
>     (redisplay)
>     (set-window-vscroll nil 3))

> * The same happens with pixel (fractional) scrolling, it'll just makes
>   the arrows overlap:

>   (progn
>     (setq indicate-buffer-boundaries 'left)
>     (insert (make-string 100 10))
>     (goto-char (point-min))
>     (forward-line 5)
>     (redisplay)
>     (set-window-vscroll nil 3 t))

Could you try the following patch?  It is for Emacs 23.2 or the
emacs-23 branch.

				     YAMAMOTO Mitsuharu
				mituharu <at> math.s.chiba-u.ac.jp

=== modified file 'src/dispextern.h'
*** src/dispextern.h	2010-03-22 07:26:56 +0000
--- src/dispextern.h	2010-06-30 08:10:51 +0000
***************
*** 105,110 ****
--- 105,112 ----
  /* Number of bits allocated to store fringe bitmap numbers.  */
  #define FRINGE_ID_BITS  16
  
+ /* Number of bits allocated to store fringe bitmap height.  */
+ #define FRINGE_HEIGHT_BITS 8
  
  
  /***********************************************************************
***************
*** 778,783 ****
--- 780,791 ----
    /* Face of the right fringe glyph.  */
    unsigned right_fringe_face_id : FACE_ID_BITS;
  
+   /* Vertical offset of the left fringe bitmap.  */
+   signed left_fringe_offset : FRINGE_HEIGHT_BITS;
+ 
+   /* Vertical offset of the right fringe bitmap.  */
+   signed right_fringe_offset : FRINGE_HEIGHT_BITS;
+ 
    /* 1 means that we must draw the bitmaps of this row.  */
    unsigned redraw_fringe_bitmaps_p : 1;
  

=== modified file 'src/fringe.c'
*** src/fringe.c	2010-06-03 15:34:35 +0000
--- src/fringe.c	2010-06-30 08:09:31 +0000
***************
*** 561,583 ****
    struct fringe_bitmap *fb;
    int period;
    int face_id = DEFAULT_FACE_ID;
  
-   p.cursor_p = 0;
    p.overlay_p = (overlay & 1) == 1;
    p.cursor_p = (overlay & 2) == 2;
  
    if (which != NO_FRINGE_BITMAP)
      {
      }
    else if (left_p)
      {
        which = row->left_fringe_bitmap;
        face_id = row->left_fringe_face_id;
      }
    else
      {
        which = row->right_fringe_bitmap;
        face_id = row->right_fringe_face_id;
      }
  
    if (face_id == DEFAULT_FACE_ID)
--- 561,586 ----
    struct fringe_bitmap *fb;
    int period;
    int face_id = DEFAULT_FACE_ID;
+   int offset, header_line_height;
  
    p.overlay_p = (overlay & 1) == 1;
    p.cursor_p = (overlay & 2) == 2;
  
    if (which != NO_FRINGE_BITMAP)
      {
+       offset = 0;
      }
    else if (left_p)
      {
        which = row->left_fringe_bitmap;
        face_id = row->left_fringe_face_id;
+       offset = row->left_fringe_offset;
      }
    else
      {
        which = row->right_fringe_bitmap;
        face_id = row->right_fringe_face_id;
+       offset = row->right_fringe_offset;
      }
  
    if (face_id == DEFAULT_FACE_ID)
***************
*** 598,604 ****
    period = fb->period;
  
    /* Convert row to frame coordinates.  */
!   p.y = WINDOW_TO_FRAME_PIXEL_Y (w, row->y);
  
    p.which = which;
    p.bits = fb->bits;
--- 601,607 ----
    period = fb->period;
  
    /* Convert row to frame coordinates.  */
!   p.y = WINDOW_TO_FRAME_PIXEL_Y (w, row->y) + offset;
  
    p.which = which;
    p.bits = fb->bits;
***************
*** 607,615 ****
    p.h = fb->height;
    p.dh = (period > 0 ? (p.y % period) : 0);
    p.h -= p.dh;
!   /* Clip bitmap if too high.  */
!   if (p.h > row->height)
!     p.h = row->height;
  
    p.face = FACE_FROM_ID (f, face_id);
  
--- 610,628 ----
    p.h = fb->height;
    p.dh = (period > 0 ? (p.y % period) : 0);
    p.h -= p.dh;
! 
!   /* Adjust y to the offset in the row to start drawing the bitmap.  */
!   switch (fb->align)
!     {
!     case ALIGN_BITMAP_CENTER:
!       p.y += (row->height - p.h) / 2;
!       break;
!     case ALIGN_BITMAP_BOTTOM:
!       p.y += (row->visible_height - p.h);
!       break;
!     case ALIGN_BITMAP_TOP:
!       break;
!     }
  
    p.face = FACE_FROM_ID (f, face_id);
  
***************
*** 625,630 ****
--- 638,646 ----
    /* Clear left fringe if no bitmap to draw or if bitmap doesn't fill
       the fringe.  */
    p.bx = -1;
+   header_line_height = WINDOW_HEADER_LINE_HEIGHT (w);
+   p.by = WINDOW_TO_FRAME_PIXEL_Y (w, max (header_line_height, row->y));
+   p.ny = row->visible_height;
    if (left_p)
      {
        int wd = WINDOW_LEFT_FRINGE_WIDTH (w);
***************
*** 635,641 ****
  	p.wd = wd;
        p.x = x - p.wd - (wd - p.wd) / 2;
  
!       if (p.wd < wd || row->height > p.h)
  	{
  	  /* If W has a vertical border to its left, don't draw over it.  */
  	  wd -= ((!WINDOW_LEFTMOST_P (w)
--- 651,657 ----
  	p.wd = wd;
        p.x = x - p.wd - (wd - p.wd) / 2;
  
!       if (p.wd < wd || p.y < p.by || p.y + p.h > p.by + p.ny)
  	{
  	  /* If W has a vertical border to its left, don't draw over it.  */
  	  wd -= ((!WINDOW_LEFTMOST_P (w)
***************
*** 657,691 ****
        p.x = x + (wd - p.wd) / 2;
        /* Clear right fringe if no bitmap to draw of if bitmap doesn't fill
  	 the fringe.  */
!       if (p.wd < wd || row->height > p.h)
  	{
  	  p.bx = x;
  	  p.nx = wd;
  	}
      }
  
-   if (p.bx >= 0)
-     {
-       int header_line_height = WINDOW_HEADER_LINE_HEIGHT (w);
- 
-       p.by = WINDOW_TO_FRAME_PIXEL_Y (w, max (header_line_height, row->y));
-       p.ny = row->visible_height;
-     }
- 
-   /* Adjust y to the offset in the row to start drawing the bitmap.  */
-   switch (fb->align)
-     {
-     case ALIGN_BITMAP_CENTER:
-       p.y += (row->height - p.h) / 2;
-       break;
-     case ALIGN_BITMAP_BOTTOM:
-       p.h = fb->height;
-       p.y += (row->visible_height - p.h);
-       break;
-     case ALIGN_BITMAP_TOP:
-       break;
-     }
- 
    FRAME_RIF (f)->draw_fringe_bitmap (w, row, &p);
  }
  
--- 673,685 ----
        p.x = x + (wd - p.wd) / 2;
        /* Clear right fringe if no bitmap to draw of if bitmap doesn't fill
  	 the fringe.  */
!       if (p.wd < wd || p.y < p.by || p.y + p.h > p.by + p.ny)
  	{
  	  p.bx = x;
  	  p.nx = wd;
  	}
      }
  
    FRAME_RIF (f)->draw_fringe_bitmap (w, row, &p);
  }
  
***************
*** 911,917 ****
    struct glyph_row *row;
    int yb = window_text_bottom_y (w);
    int nrows = w->current_matrix->nrows;
!   int y = 0, rn;
    int updated = 0;
  
    if (w->pseudo_window_p)
--- 905,911 ----
    struct glyph_row *row;
    int yb = window_text_bottom_y (w);
    int nrows = w->current_matrix->nrows;
!   int y, rn;
    int updated = 0;
  
    if (w->pseudo_window_p)
***************
*** 923,929 ****
  	  || WINDOW_RIGHT_FRINGE_WIDTH (w) == 0))
      updated++;
  
!   for (y = 0, rn = 0, row = w->current_matrix->rows;
         y < yb && rn < nrows;
         y += row->height, ++row, ++rn)
      {
--- 917,923 ----
  	  || WINDOW_RIGHT_FRINGE_WIDTH (w) == 0))
      updated++;
  
!   for (y = w->vscroll, rn = 0, row = w->current_matrix->rows;
         y < yb && rn < nrows;
         y += row->height, ++row, ++rn)
      {
***************
*** 959,964 ****
--- 953,961 ----
    Lisp_Object ind = Qnil;
  #define MAX_BITMAP_CACHE (8*4)
    int bitmap_cache[MAX_BITMAP_CACHE];
+   int top_ind_rn, bot_ind_rn;
+   int top_ind_min_y, bot_ind_max_y;
+   int top_row_ends_at_zv_p, bot_row_ends_at_zv_p;
  
    if (w->pseudo_window_p)
      return 0;
***************
*** 987,997 ****
  	boundary_top = boundary_bot = Qleft;
      }
  
    if (!NILP (ind))
      {
!       int done_top = 0, done_bot = 0;
! 
!       for (y = 0, rn = 0;
  	   y < yb && rn < nrows;
  	   y += row->height, ++rn)
  	{
--- 984,993 ----
  	boundary_top = boundary_bot = Qleft;
      }
  
+   top_ind_rn = bot_ind_rn = -1;
    if (!NILP (ind))
      {
!       for (y = w->vscroll, rn = 0;
  	   y < yb && rn < nrows;
  	   y += row->height, ++rn)
  	{
***************
*** 1012,1042 ****
  
  	  if (!row->mode_line_p)
  	    {
! 	      if (!done_top)
  		{
  		  if (MATRIX_ROW_START_CHARPOS (row) <= BUF_BEGV (XBUFFER (w->buffer))
  		      && !MATRIX_ROW_PARTIALLY_VISIBLE_AT_TOP_P (w, row))
  		    row->indicate_bob_p = !NILP (boundary_top);
  		  else
  		    row->indicate_top_line_p = !NILP (arrow_top);
! 		  done_top = 1;
  		}
  
! 	      if (!done_bot)
  		{
  		  if (MATRIX_ROW_END_CHARPOS (row) >= BUF_ZV (XBUFFER (w->buffer))
  		      && !MATRIX_ROW_PARTIALLY_VISIBLE_AT_BOTTOM_P (w, row))
! 		    row->indicate_eob_p = !NILP (boundary_bot), done_bot = 1;
  		  else if (y + row->height >= yb)
! 		    row->indicate_bottom_line_p = !NILP (arrow_bot), done_bot = 1;
  		}
  	    }
- 
- 	  if (indicate_bob_p != row->indicate_bob_p
- 	      || indicate_top_line_p != row->indicate_top_line_p
- 	      || indicate_eob_p != row->indicate_eob_p
- 	      || indicate_bottom_line_p != row->indicate_bottom_line_p)
- 	    row->redraw_fringe_bitmaps_p = 1;
  	}
      }
  
--- 1008,1032 ----
  
  	  if (!row->mode_line_p)
  	    {
! 	      if (top_ind_rn < 0 && row->visible_height > 0)
  		{
  		  if (MATRIX_ROW_START_CHARPOS (row) <= BUF_BEGV (XBUFFER (w->buffer))
  		      && !MATRIX_ROW_PARTIALLY_VISIBLE_AT_TOP_P (w, row))
  		    row->indicate_bob_p = !NILP (boundary_top);
  		  else
  		    row->indicate_top_line_p = !NILP (arrow_top);
! 		  top_ind_rn = rn;
  		}
  
! 	      if (bot_ind_rn < 0)
  		{
  		  if (MATRIX_ROW_END_CHARPOS (row) >= BUF_ZV (XBUFFER (w->buffer))
  		      && !MATRIX_ROW_PARTIALLY_VISIBLE_AT_BOTTOM_P (w, row))
! 		    row->indicate_eob_p = !NILP (boundary_bot), bot_ind_rn = rn;
  		  else if (y + row->height >= yb)
! 		    row->indicate_bottom_line_p = !NILP (arrow_bot), bot_ind_rn = rn;
  		}
  	    }
  	}
      }
  
***************
*** 1060,1071 ****
        get_logical_fringe_bitmap (w, which, 1, partial_p)))
  
  
!   for (y = 0, rn = 0;
         y < yb && rn < nrows;
         y += row->height, rn++)
      {
        int left, right;
        unsigned left_face_id, right_face_id;
  
        row = w->desired_matrix->rows + rn;
        cur = w->current_matrix->rows + rn;
--- 1050,1188 ----
        get_logical_fringe_bitmap (w, which, 1, partial_p)))
  
  
!   /* Extend top-aligned top indicator (or bottom-aligned bottom
!      indicator) to adjacent rows if it doesn't fit in one row.  */
!   top_ind_min_y = bot_ind_max_y = -1;
!   if (top_ind_rn >= 0)
!     {
!       int bn = NO_FRINGE_BITMAP;
! 
!       row = w->desired_matrix->rows + top_ind_rn;
!       if (!row->enabled_p)
! 	row = w->current_matrix->rows + top_ind_rn;
! 
!       top_row_ends_at_zv_p = row->ends_at_zv_p;
!       if (row->indicate_bob_p)
! 	{
! 	  if (EQ (boundary_top, Qleft))
! 	    bn = ((row->indicate_eob_p && EQ (boundary_bot, Qleft))
! 		  ? LEFT_FRINGE (1, Qtop_bottom, row->ends_at_zv_p)
! 		  : LEFT_FRINGE (2, Qtop, 0));
! 	  else
! 	    bn = ((row->indicate_eob_p && EQ (boundary_bot, Qright))
! 		  ? RIGHT_FRINGE (1, Qtop_bottom, row->ends_at_zv_p)
! 		  : RIGHT_FRINGE (2, Qtop, 0));
! 	}
!       else if (row->indicate_top_line_p)
! 	{
! 	  if (EQ (arrow_top, Qleft))
! 	    bn = LEFT_FRINGE (6, Qup, 0);
! 	  else
! 	    bn = RIGHT_FRINGE (6, Qup, 0);
! 	}
! 
!       if (bn != NO_FRINGE_BITMAP)
! 	{
! 	  struct fringe_bitmap *fb;
! 
! 	  fb = fringe_bitmaps[bn];
! 	  if (fb == NULL)
! 	    fb = &standard_bitmaps[bn < MAX_STANDARD_FRINGE_BITMAPS
! 				   ? bn : UNDEF_FRINGE_BITMAP];
! 	  if (fb->align == ALIGN_BITMAP_TOP && fb->period == 0)
! 	    {
! 	      struct glyph_row *row1;
! 	      int top_ind_max_y;
! 
! 	      top_ind_min_y = WINDOW_HEADER_LINE_HEIGHT (w);
! 	      top_ind_max_y = top_ind_min_y + fb->height;
! 	      if (top_ind_max_y > yb)
! 		top_ind_max_y = yb;
! 
! 	      for (y = row->y + row->height, rn = top_ind_rn + 1;
! 		   y < top_ind_max_y && rn < nrows;
! 		   y += row1->height, rn++)
! 		{
! 		  if (bot_ind_rn >= 0 && rn >= bot_ind_rn)
! 		    break;
! 
! 		  row1 = w->desired_matrix->rows + rn;
! 		  if (!row1->enabled_p)
! 		    row1 = w->current_matrix->rows + rn;
! 
! 		  row1->indicate_bob_p = row->indicate_bob_p;
! 		  row1->indicate_top_line_p = row->indicate_top_line_p;
! 		}
! 	    }
! 	}
!     }
!   if (bot_ind_rn >= 0)
!     {
!       int bn = NO_FRINGE_BITMAP;
! 
!       row = w->desired_matrix->rows + bot_ind_rn;
!       if (!row->enabled_p)
! 	row = w->current_matrix->rows + bot_ind_rn;
! 
!       bot_row_ends_at_zv_p = row->ends_at_zv_p;
!       if (row->indicate_eob_p)
! 	{
! 	  if (EQ (boundary_bot, Qleft))
! 	    bn = LEFT_FRINGE (3, Qbottom, row->ends_at_zv_p);
! 	  else
! 	    bn = RIGHT_FRINGE (3, Qbottom, row->ends_at_zv_p);
! 	}
!       else if (row->indicate_bottom_line_p)
! 	{
! 	  if (EQ (arrow_bot, Qleft))
! 	    bn = LEFT_FRINGE (7, Qdown, 0);
! 	  else
! 	    bn = RIGHT_FRINGE (7, Qdown, 0);
! 	}
! 
!       if (bn != NO_FRINGE_BITMAP)
! 	{
! 	  struct fringe_bitmap *fb;
! 
! 	  fb = fringe_bitmaps[bn];
! 	  if (fb == NULL)
! 	    fb = &standard_bitmaps[bn < MAX_STANDARD_FRINGE_BITMAPS
! 				   ? bn : UNDEF_FRINGE_BITMAP];
! 	  if (fb->align == ALIGN_BITMAP_BOTTOM && fb->period == 0)
! 	    {
! 	      struct glyph_row *row1;
! 	      int bot_ind_min_y;
! 
! 	      bot_ind_max_y = row->y + row->visible_height;
! 	      bot_ind_min_y = bot_ind_max_y - fb->height;
! 	      if (bot_ind_min_y < WINDOW_HEADER_LINE_HEIGHT (w))
! 		bot_ind_min_y = WINDOW_HEADER_LINE_HEIGHT (w);
! 
! 	      for (y = row->y, rn = bot_ind_rn - 1;
! 		   y >= bot_ind_min_y && rn >= 0;
! 		   y -= row1->height, rn--)
! 		{
! 		  if (top_ind_rn >= 0 && rn <= top_ind_rn)
! 		    break;
! 
! 		  row1 = w->desired_matrix->rows + rn;
! 		  if (!row1->enabled_p)
! 		    row1 = w->current_matrix->rows + rn;
! 
! 		  row1->indicate_eob_p = row->indicate_eob_p;
! 		  row1->indicate_bottom_line_p = row->indicate_bottom_line_p;
! 		}
! 	    }
! 	}
!     }
! 
!   for (y = w->vscroll, rn = 0;
         y < yb && rn < nrows;
         y += row->height, rn++)
      {
        int left, right;
        unsigned left_face_id, right_face_id;
+       int left_offset, right_offset;
  
        row = w->desired_matrix->rows + rn;
        cur = w->current_matrix->rows + rn;
***************
*** 1073,1078 ****
--- 1190,1196 ----
  	row = cur;
  
        left_face_id = right_face_id = DEFAULT_FACE_ID;
+       left_offset = right_offset = 0;
  
        /* Decide which bitmap to draw in the left fringe.  */
        if (WINDOW_LEFT_FRINGE_WIDTH (w) == 0)
***************
*** 1085,1103 ****
        else if (row->truncated_on_left_p)
  	left = LEFT_FRINGE(0, Qtruncation, 0);
        else if (row->indicate_bob_p && EQ (boundary_top, Qleft))
! 	left = ((row->indicate_eob_p && EQ (boundary_bot, Qleft))
! 		? LEFT_FRINGE (1, Qtop_bottom, row->ends_at_zv_p)
! 		: LEFT_FRINGE (2, Qtop, 0));
        else if (row->indicate_eob_p && EQ (boundary_bot, Qleft))
! 	left = LEFT_FRINGE (3, Qbottom, row->ends_at_zv_p);
        else if (MATRIX_ROW_CONTINUATION_LINE_P (row))
  	left = LEFT_FRINGE (4, Qcontinuation, 0);
        else if (row->indicate_empty_line_p && EQ (empty_pos, Qleft))
  	left = LEFT_FRINGE (5, Qempty_line, 0);
        else if (row->indicate_top_line_p && EQ (arrow_top, Qleft))
! 	left = LEFT_FRINGE (6, Qup, 0);
        else if (row->indicate_bottom_line_p && EQ (arrow_bot, Qleft))
! 	left = LEFT_FRINGE (7, Qdown, 0);
        else
  	left = NO_FRINGE_BITMAP;
  
--- 1203,1237 ----
        else if (row->truncated_on_left_p)
  	left = LEFT_FRINGE(0, Qtruncation, 0);
        else if (row->indicate_bob_p && EQ (boundary_top, Qleft))
! 	{
! 	  left = ((row->indicate_eob_p && EQ (boundary_bot, Qleft))
! 		  ? LEFT_FRINGE (1, Qtop_bottom, top_row_ends_at_zv_p)
! 		  : LEFT_FRINGE (2, Qtop, 0));
! 	  if (top_ind_min_y >= 0)
! 	    left_offset = top_ind_min_y - row->y;
! 	}
        else if (row->indicate_eob_p && EQ (boundary_bot, Qleft))
! 	{
! 	  left = LEFT_FRINGE (3, Qbottom, bot_row_ends_at_zv_p);
! 	  if (bot_ind_max_y >= 0)
! 	    left_offset = bot_ind_max_y - (row->y + row->visible_height);
! 	}
        else if (MATRIX_ROW_CONTINUATION_LINE_P (row))
  	left = LEFT_FRINGE (4, Qcontinuation, 0);
        else if (row->indicate_empty_line_p && EQ (empty_pos, Qleft))
  	left = LEFT_FRINGE (5, Qempty_line, 0);
        else if (row->indicate_top_line_p && EQ (arrow_top, Qleft))
! 	{
! 	  left = LEFT_FRINGE (6, Qup, 0);
! 	  if (top_ind_min_y >= 0)
! 	    left_offset = top_ind_min_y - row->y;
! 	}
        else if (row->indicate_bottom_line_p && EQ (arrow_bot, Qleft))
! 	{
! 	  left = LEFT_FRINGE (7, Qdown, 0);
! 	  if (bot_ind_max_y >= 0)
! 	    left_offset = bot_ind_max_y - (row->y + row->visible_height);
! 	}
        else
  	left = NO_FRINGE_BITMAP;
  
***************
*** 1112,1128 ****
        else if (row->truncated_on_right_p)
  	right = RIGHT_FRINGE (0, Qtruncation, 0);
        else if (row->indicate_bob_p && EQ (boundary_top, Qright))
! 	right = ((row->indicate_eob_p && EQ (boundary_bot, Qright))
! 		 ? RIGHT_FRINGE (1, Qtop_bottom, row->ends_at_zv_p)
! 		 : RIGHT_FRINGE (2, Qtop, 0));
        else if (row->indicate_eob_p && EQ (boundary_bot, Qright))
! 	right = RIGHT_FRINGE (3, Qbottom, row->ends_at_zv_p);
        else if (row->continued_p)
  	right = RIGHT_FRINGE (4, Qcontinuation, 0);
        else if (row->indicate_top_line_p && EQ (arrow_top, Qright))
! 	right = RIGHT_FRINGE (6, Qup, 0);
        else if (row->indicate_bottom_line_p && EQ (arrow_bot, Qright))
! 	right = RIGHT_FRINGE (7, Qdown, 0);
        else if (row->indicate_empty_line_p && EQ (empty_pos, Qright))
  	right = RIGHT_FRINGE (5, Qempty_line, 0);
        else
--- 1246,1278 ----
        else if (row->truncated_on_right_p)
  	right = RIGHT_FRINGE (0, Qtruncation, 0);
        else if (row->indicate_bob_p && EQ (boundary_top, Qright))
! 	{
! 	  right = ((row->indicate_eob_p && EQ (boundary_bot, Qright))
! 		   ? RIGHT_FRINGE (1, Qtop_bottom, top_row_ends_at_zv_p)
! 		   : RIGHT_FRINGE (2, Qtop, 0));
! 	  if (top_ind_min_y >= 0)
! 	    right_offset = top_ind_min_y - row->y;
! 	}
        else if (row->indicate_eob_p && EQ (boundary_bot, Qright))
! 	{
! 	  right = RIGHT_FRINGE (3, Qbottom, bot_row_ends_at_zv_p);
! 	  if (bot_ind_max_y >= 0)
! 	    right_offset = bot_ind_max_y - (row->y + row->visible_height);
! 	}
        else if (row->continued_p)
  	right = RIGHT_FRINGE (4, Qcontinuation, 0);
        else if (row->indicate_top_line_p && EQ (arrow_top, Qright))
! 	{
! 	  right = RIGHT_FRINGE (6, Qup, 0);
! 	  if (top_ind_min_y >= 0)
! 	    right_offset = top_ind_min_y - row->y;
! 	}
        else if (row->indicate_bottom_line_p && EQ (arrow_bot, Qright))
! 	{
! 	  right = RIGHT_FRINGE (7, Qdown, 0);
! 	  if (bot_ind_max_y >= 0)
! 	    right_offset = bot_ind_max_y - (row->y + row->visible_height);
! 	}
        else if (row->indicate_empty_line_p && EQ (empty_pos, Qright))
  	right = RIGHT_FRINGE (5, Qempty_line, 0);
        else
***************
*** 1135,1140 ****
--- 1285,1292 ----
  	  || right != cur->right_fringe_bitmap
  	  || left_face_id != cur->left_fringe_face_id
  	  || right_face_id != cur->right_fringe_face_id
+ 	  || left_offset != cur->left_fringe_offset
+ 	  || right_offset != cur->right_fringe_offset
  	  || cur->redraw_fringe_bitmaps_p)
  	{
  	  redraw_p = row->redraw_fringe_bitmaps_p = 1;
***************
*** 1145,1150 ****
--- 1297,1304 ----
  	      cur->right_fringe_bitmap = right;
  	      cur->left_fringe_face_id = left_face_id;
  	      cur->right_fringe_face_id = right_face_id;
+ 	      cur->left_fringe_offset = left_offset;
+ 	      cur->right_fringe_offset = right_offset;
  	    }
  	}
  
***************
*** 1161,1169 ****
        row->right_fringe_bitmap = right;
        row->left_fringe_face_id = left_face_id;
        row->right_fringe_face_id = right_face_id;
! 
!       if (rn > 0 && row->redraw_fringe_bitmaps_p)
! 	row[-1].redraw_fringe_bitmaps_p = cur[-1].redraw_fringe_bitmaps_p = 1;
      }
  
    return redraw_p && !keep_current_p;
--- 1315,1322 ----
        row->right_fringe_bitmap = right;
        row->left_fringe_face_id = left_face_id;
        row->right_fringe_face_id = right_face_id;
!       row->left_fringe_offset = left_offset;
!       row->right_fringe_offset = right_offset;
      }
  
    return redraw_p && !keep_current_p;

=== modified file 'src/xterm.c'
*** src/xterm.c	2010-04-07 16:34:31 +0000
--- src/xterm.c	2010-06-30 08:09:31 +0000
***************
*** 774,797 ****
    Window window = FRAME_X_WINDOW (f);
    GC gc = f->output_data.x->normal_gc;
    struct face *face = p->face;
-   int rowY;
  
    /* Must clip because of partially visible lines.  */
!   rowY = WINDOW_TO_FRAME_PIXEL_Y (w, row->y);
!   if (p->y < rowY)
!     {
!       /* Adjust position of "bottom aligned" bitmap on partially
! 	 visible last row.  */
!       int oldY = row->y;
!       int oldVH = row->visible_height;
!       row->visible_height = p->h;
!       row->y -= rowY - p->y;
!       x_clip_to_row (w, row, -1, gc);
!       row->y = oldY;
!       row->visible_height = oldVH;
!     }
!   else
!     x_clip_to_row (w, row, -1, gc);
  
    if (!p->overlay_p)
      {
--- 774,782 ----
    Window window = FRAME_X_WINDOW (f);
    GC gc = f->output_data.x->normal_gc;
    struct face *face = p->face;
  
    /* Must clip because of partially visible lines.  */
!   x_clip_to_row (w, row, -1, gc);
  
    if (!p->overlay_p)
      {





Information forwarded to owner <at> debbugs.gnu.org, bug-gnu-emacs <at> gnu.org:
bug#6325; Package emacs. (Wed, 30 Jun 2010 11:15:02 GMT) Full text and rfc822 format available.

Message #11 received at 6325 <at> debbugs.gnu.org (full text, mbox):

From: YAMAMOTO Mitsuharu <mituharu <at> math.s.chiba-u.ac.jp>
To: David Engster <deng <at> randomsample.de>
Cc: 6325 <at> debbugs.gnu.org
Subject: Re: bug#6325: 24.0.50;
	Fringe not correctly updated when using set-window-vscroll
Date: Wed, 30 Jun 2010 20:13:54 +0900
>>>>> On Wed, 30 Jun 2010 17:23:14 +0900, YAMAMOTO Mitsuharu <mituharu <at> math.s.chiba-u.ac.jp> said:

> Could you try the following patch?

Sorry, two occurrences of the following condition in the patch

> !       if (p.wd < wd || p.y < p.by || p.y + p.h > p.by + p.ny)

should be

          if (p.wd < wd || p.y > p.by || p.y + p.h < p.by + p.ny)

				     YAMAMOTO Mitsuharu
				mituharu <at> math.s.chiba-u.ac.jp




Information forwarded to owner <at> debbugs.gnu.org, bug-gnu-emacs <at> gnu.org:
bug#6325; Package emacs. (Wed, 30 Jun 2010 16:20:03 GMT) Full text and rfc822 format available.

Message #14 received at 6325 <at> debbugs.gnu.org (full text, mbox):

From: David Engster <deng <at> randomsample.de>
To: YAMAMOTO Mitsuharu <mituharu <at> math.s.chiba-u.ac.jp>
Cc: 6325 <at> debbugs.gnu.org
Subject: Re: bug#6325: 24.0.50;
	Fringe not correctly updated when using set-window-vscroll
Date: Wed, 30 Jun 2010 18:18:52 +0200
YAMAMOTO Mitsuharu writes:
> Could you try the following patch?  It is for Emacs 23.2 or the
> emacs-23 branch.

I applied it to Emacs 23.2 and the problem is gone for me.

Thank you! Looking at the patch, fixing this required quite some work.

Regards,
David




Reply sent to YAMAMOTO Mitsuharu <mituharu <at> math.s.chiba-u.ac.jp>:
You have taken responsibility. (Mon, 05 Jul 2010 10:11:02 GMT) Full text and rfc822 format available.

Notification sent to David Engster <deng <at> randomsample.de>:
bug acknowledged by developer. (Mon, 05 Jul 2010 10:11:02 GMT) Full text and rfc822 format available.

Message #19 received at 6325-done <at> debbugs.gnu.org (full text, mbox):

From: YAMAMOTO Mitsuharu <mituharu <at> math.s.chiba-u.ac.jp>
To: David Engster <deng <at> randomsample.de>
Cc: 6325-done <at> debbugs.gnu.org
Subject: Re: bug#6325: 24.0.50;
	Fringe not correctly updated when using set-window-vscroll
Date: Mon, 05 Jul 2010 19:10:38 +0900
>>>>> On Wed, 30 Jun 2010 18:18:52 +0200, David Engster <deng <at> randomsample.de> said:

> I applied it to Emacs 23.2 and the problem is gone for me.

> Thank you! Looking at the patch, fixing this required quite some
> work.

Actually, pixel-unit mouse wheel scrolling in the Mac port uses window
vscroll extensively, and this bug has been annoying also for me.

Thanks for testing.  I've installed it to the emacs-23 branch.

				     YAMAMOTO Mitsuharu
				mituharu <at> math.s.chiba-u.ac.jp




bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Mon, 02 Aug 2010 11:24:04 GMT) Full text and rfc822 format available.

This bug report was last modified 15 years and 18 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.