Mercurial > emacs
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. */