Mercurial > emacs
changeset 50247:f9447a2e045c
* xdisp.c (pixel_to_glyph_coords, glyph_to_pixel_coords):
Add generic versions here. Remove system specific versions
defined elsewhere.
author | Kim F. Storm <storm@cua.dk> |
---|---|
date | Fri, 21 Mar 2003 22:56:52 +0000 |
parents | 84e4dd9629ee |
children | 04d8f8a13cf8 |
files | src/macterm.c src/msdos.c src/msdos.h src/w32console.c src/w32term.c src/xdisp.c src/xterm.c |
diffstat | 7 files changed, 108 insertions(+), 344 deletions(-) [+] |
line wrap: on
line diff
--- a/src/macterm.c Fri Mar 21 22:55:56 2003 +0000 +++ b/src/macterm.c Fri Mar 21 22:56:52 2003 +0000 @@ -3464,107 +3464,6 @@ /* Mouse clicks and mouse movement. Rah. */ -/* Given a pixel position (PIX_X, PIX_Y) on frame F, return glyph - co-ordinates in (*X, *Y). Set *BOUNDS to the rectangle that the - glyph at X, Y occupies, if BOUNDS != 0. If NOCLIP is non-zero, do - not force the value into range. */ - -void -pixel_to_glyph_coords (f, pix_x, pix_y, x, y, bounds, noclip) - FRAME_PTR f; - register int pix_x, pix_y; - register int *x, *y; - Rect *bounds; - int noclip; -{ - /* Support tty mode: if Vwindow_system is nil, behave correctly. */ - if (NILP (Vwindow_system)) - { - *x = pix_x; - *y = pix_y; - return; - } - - /* Arrange for the division in PIXEL_TO_CHAR_COL etc. to round down - even for negative values. */ - if (pix_x < 0) - pix_x -= FONT_WIDTH (FRAME_FONT (f)) - 1; - if (pix_y < 0) - pix_y -= (f)->output_data.mac->line_height - 1; - - pix_x = PIXEL_TO_CHAR_COL (f, pix_x); - pix_y = PIXEL_TO_CHAR_ROW (f, pix_y); - - if (bounds) - { - bounds->left = CHAR_TO_PIXEL_COL (f, pix_x); - bounds->top = CHAR_TO_PIXEL_ROW (f, pix_y); - bounds->right = bounds->left + FONT_WIDTH (FRAME_FONT (f)) - 1; - bounds->bottom = bounds->top + f->output_data.mac->line_height - 1; - } - - if (!noclip) - { - if (pix_x < 0) - pix_x = 0; - else if (pix_x > FRAME_WINDOW_WIDTH (f)) - pix_x = FRAME_WINDOW_WIDTH (f); - - if (pix_y < 0) - pix_y = 0; - else if (pix_y > f->height) - pix_y = f->height; - } - - *x = pix_x; - *y = pix_y; -} - - -/* Given HPOS/VPOS in the current matrix of W, return corresponding - frame-relative pixel positions in *FRAME_X and *FRAME_Y. If we - can't tell the positions because W's display is not up to date, - return 0. */ - -int -glyph_to_pixel_coords (w, hpos, vpos, frame_x, frame_y) - struct window *w; - int hpos, vpos; - int *frame_x, *frame_y; -{ - int success_p; - - xassert (hpos >= 0 && hpos < w->current_matrix->matrix_w); - xassert (vpos >= 0 && vpos < w->current_matrix->matrix_h); - - if (display_completed) - { - struct glyph_row *row = MATRIX_ROW (w->current_matrix, vpos); - struct glyph *glyph = row->glyphs[TEXT_AREA]; - struct glyph *end = glyph + min (hpos, row->used[TEXT_AREA]); - - *frame_y = row->y; - *frame_x = row->x; - while (glyph < end) - { - *frame_x += glyph->pixel_width; - ++glyph; - } - - success_p = 1; - } - else - { - *frame_y = *frame_x = 0; - success_p = 0; - } - - *frame_y = WINDOW_TO_FRAME_PIXEL_Y (w, *frame_y); - *frame_x = WINDOW_TO_FRAME_PIXEL_X (w, *frame_x); - return success_p; -} - - /* Prepare a mouse-event in *RESULT for placement in the input queue. If the event is a button press, then note that we have grabbed
--- a/src/msdos.c Fri Mar 21 22:55:56 2003 +0000 +++ b/src/msdos.c Fri Mar 21 22:56:52 2003 +0000 @@ -3500,31 +3500,7 @@ } #ifndef HAVE_X_WINDOWS -/* See xterm.c for more info. */ -void -pixel_to_glyph_coords (f, pix_x, pix_y, x, y, bounds, noclip) - FRAME_PTR f; - register int pix_x, pix_y, *x, *y; - XRectangle *bounds; - int noclip; -{ - if (bounds) abort (); - - /* Ignore clipping. */ - - *x = pix_x; - *y = pix_y; -} - -void -glyph_to_pixel_coords (f, x, y, pix_x, pix_y) - FRAME_PTR f; - register int x, y, *pix_x, *pix_y; -{ - *pix_x = x; - *pix_y = y; -} - + /* Simulation of X's menus. Nothing too fancy here -- just make it work for now.
--- a/src/msdos.h Fri Mar 21 22:55:56 2003 +0000 +++ b/src/msdos.h Fri Mar 21 22:56:52 2003 +0000 @@ -118,14 +118,6 @@ struct frame; struct window; -/* From xterm.c; emulated on msdos.c */ - -extern void pixel_to_glyph_coords P_ ((struct frame *f, int pix_x, int pix_y, - int *x, int *y, XRectangle *bounds, - int noclip)); -extern void glyph_to_pixel_coords P_ ((struct frame *f, int x, int y, - int *pix_x, int *pix_y)); - /* Defined in xfns.c; emulated on msdos.c */ extern int have_menus_p P_ ((void));
--- a/src/w32console.c Fri Mar 21 22:55:56 2003 +0000 +++ b/src/w32console.c Fri Mar 21 22:56:52 2003 +0000 @@ -705,23 +705,6 @@ return Qt; } -#ifndef HAVE_NTGUI -void -pixel_to_glyph_coords (struct frame * f, int pix_x, int pix_y, int *x, int *y, - void *bounds, int noclip) -{ - *x = pix_x; - *y = pix_y; -} - -void -glyph_to_pixel_coords (struct window * f, int x, int y, int *pix_x, int *pix_y) -{ - *pix_x = x; - *pix_y = y; -} -#endif /* !HAVE_NTGUI */ - void syms_of_ntterm () {
--- a/src/w32term.c Fri Mar 21 22:55:56 2003 +0000 +++ b/src/w32term.c Fri Mar 21 22:56:52 2003 +0000 @@ -2800,106 +2800,6 @@ /* Mouse clicks and mouse movement. Rah. */ -/* Given a pixel position (PIX_X, PIX_Y) on frame F, return glyph - co-ordinates in (*X, *Y). Set *BOUNDS to the rectangle that the - glyph at X, Y occupies, if BOUNDS != 0. If NOCLIP is non-zero, do - not force the value into range. */ - -void -pixel_to_glyph_coords (f, pix_x, pix_y, x, y, bounds, noclip) - FRAME_PTR f; - register int pix_x, pix_y; - register int *x, *y; - RECT *bounds; - int noclip; -{ - /* Support tty mode: if Vwindow_system is nil, behave correctly. */ - if (NILP (Vwindow_system)) - { - *x = pix_x; - *y = pix_y; - return; - } - - /* Arrange for the division in PIXEL_TO_CHAR_COL etc. to round down - even for negative values. */ - if (pix_x < 0) - pix_x -= FONT_WIDTH (FRAME_FONT (f)) - 1; - if (pix_y < 0) - pix_y -= (f)->output_data.w32->line_height - 1; - - pix_x = PIXEL_TO_CHAR_COL (f, pix_x); - pix_y = PIXEL_TO_CHAR_ROW (f, pix_y); - - if (bounds) - { - bounds->left = CHAR_TO_PIXEL_COL (f, pix_x); - bounds->top = CHAR_TO_PIXEL_ROW (f, pix_y); - bounds->right = bounds->left + FONT_WIDTH (FRAME_FONT (f)) - 1; - bounds->bottom = bounds->top + f->output_data.w32->line_height - 1; - } - - if (!noclip) - { - if (pix_x < 0) - pix_x = 0; - else if (pix_x > FRAME_WINDOW_WIDTH (f)) - pix_x = FRAME_WINDOW_WIDTH (f); - - if (pix_y < 0) - pix_y = 0; - else if (pix_y > f->height) - pix_y = f->height; - } - - *x = pix_x; - *y = pix_y; -} - - -/* Given HPOS/VPOS in the current matrix of W, return corresponding - frame-relative pixel positions in *FRAME_X and *FRAME_Y. If we - can't tell the positions because W's display is not up to date, - return 0. */ - -int -glyph_to_pixel_coords (w, hpos, vpos, frame_x, frame_y) - struct window *w; - int hpos, vpos; - int *frame_x, *frame_y; -{ - int success_p; - - xassert (hpos >= 0 && hpos < w->current_matrix->matrix_w); - xassert (vpos >= 0 && vpos < w->current_matrix->matrix_h); - - if (display_completed) - { - struct glyph_row *row = MATRIX_ROW (w->current_matrix, vpos); - struct glyph *glyph = row->glyphs[TEXT_AREA]; - struct glyph *end = glyph + min (hpos, row->used[TEXT_AREA]); - - *frame_y = row->y; - *frame_x = row->x; - while (glyph < end) - { - *frame_x += glyph->pixel_width; - ++glyph; - } - - success_p = 1; - } - else - { - *frame_y = *frame_x = 0; - success_p = 0; - } - - *frame_y = WINDOW_TO_FRAME_PIXEL_Y (w, *frame_y); - *frame_x = WINDOW_TO_FRAME_PIXEL_X (w, *frame_x); - return success_p; -} - /* Parse a button MESSAGE. The button index is returned in PBUTTON, and the state in PUP. XBUTTON provides extra information for extended mouse button messages. Returns FALSE if unable to parse the message. */
--- a/src/xdisp.c Fri Mar 21 22:55:56 2003 +0000 +++ b/src/xdisp.c Fri Mar 21 22:56:52 2003 +0000 @@ -1402,6 +1402,113 @@ return 1; } +/* Given a pixel position (PIX_X, PIX_Y) on frame F, return glyph + co-ordinates in (*X, *Y). Set *BOUNDS to the rectangle that the + glyph at X, Y occupies, if BOUNDS != 0. If NOCLIP is non-zero, do + not force the value into range. */ + +void +pixel_to_glyph_coords (f, pix_x, pix_y, x, y, bounds, noclip) + FRAME_PTR f; + register int pix_x, pix_y; + int *x, *y; + NativeRectangle *bounds; + int noclip; +{ + +#ifdef HAVE_WINDOW_SYSTEM + if (FRAME_WINDOW_P (f)) + { + /* Arrange for the division in PIXEL_TO_CHAR_COL etc. to round down + even for negative values. */ + if (pix_x < 0) + pix_x -= FONT_WIDTH (FRAME_FONT (f)) - 1; + if (pix_y < 0) + pix_y -= FRAME_X_OUTPUT(f)->line_height - 1; + + pix_x = PIXEL_TO_CHAR_COL (f, pix_x); + pix_y = PIXEL_TO_CHAR_ROW (f, pix_y); + + if (bounds) + STORE_NATIVE_RECT (*bounds, + CHAR_TO_PIXEL_COL (f, pix_x), + CHAR_TO_PIXEL_ROW (f, pix_y), + FONT_WIDTH (FRAME_FONT (f)) - 1, + FRAME_X_OUTPUT (f)->line_height - 1); + + if (!noclip) + { + if (pix_x < 0) + pix_x = 0; + else if (pix_x > FRAME_WINDOW_WIDTH (f)) + pix_x = FRAME_WINDOW_WIDTH (f); + + if (pix_y < 0) + pix_y = 0; + else if (pix_y > f->height) + pix_y = f->height; + } + } +#endif + + *x = pix_x; + *y = pix_y; +} + + +/* Given HPOS/VPOS in the current matrix of W, return corresponding + frame-relative pixel positions in *FRAME_X and *FRAME_Y. If we + can't tell the positions because W's display is not up to date, + return 0. */ + +int +glyph_to_pixel_coords (w, hpos, vpos, frame_x, frame_y) + struct window *w; + int hpos, vpos; + int *frame_x, *frame_y; +{ +#ifdef HAVE_WINDOW_SYSTEM + if (FRAME_WINDOW_P (XFRAME (WINDOW_FRAME (w)))) + { + int success_p; + + xassert (hpos >= 0 && hpos < w->current_matrix->matrix_w); + xassert (vpos >= 0 && vpos < w->current_matrix->matrix_h); + + if (display_completed) + { + struct glyph_row *row = MATRIX_ROW (w->current_matrix, vpos); + struct glyph *glyph = row->glyphs[TEXT_AREA]; + struct glyph *end = glyph + min (hpos, row->used[TEXT_AREA]); + + hpos = row->x; + vpos = row->y; + while (glyph < end) + { + hpos += glyph->pixel_width; + ++glyph; + } + + success_p = 1; + } + else + { + hpos = vpos = 0; + success_p = 0; + } + + *frame_x = WINDOW_TO_FRAME_PIXEL_X (w, hpos); + *frame_y = WINDOW_TO_FRAME_PIXEL_Y (w, vpos); + return success_p; + } +#endif + + *frame_x = hpos; + *frame_y = vpos; + return 1; +} + + #ifdef HAVE_WINDOW_SYSTEM /* Find the glyph under window-relative coordinates X/Y in window W.
--- a/src/xterm.c Fri Mar 21 22:55:56 2003 +0000 +++ b/src/xterm.c Fri Mar 21 22:56:52 2003 +0000 @@ -3474,99 +3474,6 @@ /* Mouse clicks and mouse movement. Rah. */ -/* Given a pixel position (PIX_X, PIX_Y) on frame F, return glyph - co-ordinates in (*X, *Y). Set *BOUNDS to the rectangle that the - glyph at X, Y occupies, if BOUNDS != 0. If NOCLIP is non-zero, do - not force the value into range. */ - -void -pixel_to_glyph_coords (f, pix_x, pix_y, x, y, bounds, noclip) - FRAME_PTR f; - register int pix_x, pix_y; - register int *x, *y; - XRectangle *bounds; - int noclip; -{ - /* Arrange for the division in PIXEL_TO_CHAR_COL etc. to round down - even for negative values. */ - if (pix_x < 0) - pix_x -= FONT_WIDTH ((f)->output_data.x->font) - 1; - if (pix_y < 0) - pix_y -= (f)->output_data.x->line_height - 1; - - pix_x = PIXEL_TO_CHAR_COL (f, pix_x); - pix_y = PIXEL_TO_CHAR_ROW (f, pix_y); - - if (bounds) - { - bounds->width = FONT_WIDTH (f->output_data.x->font); - bounds->height = f->output_data.x->line_height; - bounds->x = CHAR_TO_PIXEL_COL (f, pix_x); - bounds->y = CHAR_TO_PIXEL_ROW (f, pix_y); - } - - if (!noclip) - { - if (pix_x < 0) - pix_x = 0; - else if (pix_x > FRAME_WINDOW_WIDTH (f)) - pix_x = FRAME_WINDOW_WIDTH (f); - - if (pix_y < 0) - pix_y = 0; - else if (pix_y > f->height) - pix_y = f->height; - } - - *x = pix_x; - *y = pix_y; -} - - -/* Given HPOS/VPOS in the current matrix of W, return corresponding - frame-relative pixel positions in *FRAME_X and *FRAME_Y. If we - can't tell the positions because W's display is not up to date, - return 0. */ - -int -glyph_to_pixel_coords (w, hpos, vpos, frame_x, frame_y) - struct window *w; - int hpos, vpos; - int *frame_x, *frame_y; -{ - int success_p; - - xassert (hpos >= 0 && hpos < w->current_matrix->matrix_w); - xassert (vpos >= 0 && vpos < w->current_matrix->matrix_h); - - if (display_completed) - { - struct glyph_row *row = MATRIX_ROW (w->current_matrix, vpos); - struct glyph *glyph = row->glyphs[TEXT_AREA]; - struct glyph *end = glyph + min (hpos, row->used[TEXT_AREA]); - - *frame_y = row->y; - *frame_x = row->x; - while (glyph < end) - { - *frame_x += glyph->pixel_width; - ++glyph; - } - - success_p = 1; - } - else - { - *frame_y = *frame_x = 0; - success_p = 0; - } - - *frame_y = WINDOW_TO_FRAME_PIXEL_Y (w, *frame_y); - *frame_x = WINDOW_TO_FRAME_PIXEL_X (w, *frame_x); - return success_p; -} - - /* Prepare a mouse-event in *RESULT for placement in the input queue. If the event is a button press, then note that we have grabbed