changeset 43408:5710b2d512a9

(glyph_rect): Determine the row and glyph more precisely.
author Jason Rumney <jasonr@gnu.org>
date Mon, 18 Feb 2002 23:31:06 +0000
parents e3889da94892
children ba5ec627d055
files src/w32term.c
diffstat 1 files changed, 28 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/src/w32term.c	Mon Feb 18 20:30:58 2002 +0000
+++ b/src/w32term.c	Mon Feb 18 23:31:06 2002 +0000
@@ -7609,7 +7609,7 @@
      RECT *rect;
 {
   Lisp_Object window;
-  int part, found = 0;
+  int part;
 
   window = window_from_coordinates (f, x, y, &part, 0);
   if (!NILP (window))
@@ -7619,27 +7619,44 @@
       struct glyph_row *end = r + w->current_matrix->nrows - 1;
 
       frame_to_window_pixel_xy (w, &x, &y);
-      
-      for (; !found && r < end && r->enabled_p; ++r)
-	if (r->y + r->height >= y)
+
+      for (; r < end && r->enabled_p; ++r)
+	if (r->y <= y && r->y + r->height > y)
 	  {
+	    /* Found the row at y.  */
 	    struct glyph *g = r->glyphs[TEXT_AREA];
 	    struct glyph *end = g + r->used[TEXT_AREA];
 	    int gx;
-	      
-	    for (gx = r->x; !found && g < end; gx += g->pixel_width, ++g)
-	      if (gx + g->pixel_width >= x)
+
+	    rect->top = WINDOW_TO_FRAME_PIXEL_Y (w, r->y);
+	    rect->bottom = rect->top + r->height;
+
+	    if (x < r->x)
+	      {
+		/* x is to the left of the first glyph in the row.  */
+		rect->left = XINT (w->left);
+		rect->right = WINDOW_TO_FRAME_PIXEL_X (w, r->x);
+		return 1;
+	      }
+
+	    for (gx = r->x; g < end; gx += g->pixel_width, ++g)
+	      if (gx <= x && gx + g->pixel_width > x)
 		{
+		  /* x is on a glyph.  */
 		  rect->left = WINDOW_TO_FRAME_PIXEL_X (w, gx);
-		  rect->top = WINDOW_TO_FRAME_PIXEL_Y (w, r->y);
 		  rect->right = rect->left + g->pixel_width;
-		  rect->bottom = rect->top + r->height;
-		  found = 1;
+		  return 1;
 		}
+
+	    /* x is to the right of the last glyph in the row.  */
+	    rect->left = WINDOW_TO_FRAME_PIXEL_X (w, gx);
+	    rect->right = XINT (w->left) + XINT (w->width);
+	    return 1;
 	  }
     }
 
-  return found;
+  /* The y is not on any row.  */
+  return 0;
 }
 
 /* Record the position of the mouse in last_mouse_glyph.  */