Subject: bug#4426: [PATCH] posn-at-point returns an incorrect value

From: IRIE Shinsuke <[email-masked]>
Date: Wed, 17 Mar 2010 13:01:59 +0900

6 months ago I reported bug #4426, that is, `posn-at-point' returns
incorrect value when header line is displayed. I've investigated this
bug and found the solution.

I describe again this bug:

   If header line is displayed, `posn-object-width-height' incorrectly
   returns the size of object in position different from specified one.

   For example, an expression

     (posn-object-width-height (posn-at-point (window-start)))

   must return the width and height of character on the top left corner
   of text area, but actually returns the ones on the beginning of
   header line.

It turned out that this problem occurs as a result of confusion between
it.vpos and MATRIX_ROW_VPOS in a function buffer_posn_from_coords
(included in dispnew.c).

So I wrote the small patch to fix this bug. Please check it.

IRIE Shinsuke
=== modified file 'src/dispnew.c'
*** old/src/dispnew.c	2010-03-16 14:48:29 +0000
--- new/src/dispnew.c	2010-03-16 16:06:28 +0000
***************
*** 5937,5942 ****
--- 5937,5943 ----
    Lisp_Object old_current_buffer = Fcurrent_buffer ();
    struct text_pos startp;
    Lisp_Object string;
+   int matrix_vpos;
    struct glyph_row *row;
  #ifdef HAVE_WINDOW_SYSTEM
    struct image *img = 0;
***************
*** 5974,5981 ****
      }
  #endif
  
!   if (it.vpos < w->current_matrix->nrows
!       && (row = MATRIX_ROW (w->current_matrix, it.vpos),
  	  row->enabled_p))
      {
        if (it.hpos < row->used[TEXT_AREA])
--- 5975,5984 ----
      }
  #endif
  
!   /* it.vpos isn't the same as MATRIX_ROW_VPOS if header line is displayed */
!   matrix_vpos = (w->current_matrix->rows->mode_line_p ? 1 : 0) + it.vpos;
!   if (matrix_vpos < w->current_matrix->nrows
!       && (row = MATRIX_ROW (w->current_matrix, matrix_vpos),
  	  row->enabled_p))
      {
        if (it.hpos < row->used[TEXT_AREA])