mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-01-07 12:20:39 -08:00
* xdisp.c (pixel_to_glyph_coords, glyph_to_pixel_coords):
Add generic versions here. Remove system specific versions defined elsewhere.
This commit is contained in:
parent
1853f74c1c
commit
e080d3ebbf
7 changed files with 107 additions and 343 deletions
101
src/macterm.c
101
src/macterm.c
|
|
@ -3464,107 +3464,6 @@ x_get_keysym_name (keysym)
|
|||
|
||||
/* 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
|
||||
|
|
|
|||
24
src/msdos.c
24
src/msdos.c
|
|
@ -3500,31 +3500,7 @@ dos_keyread ()
|
|||
}
|
||||
|
||||
#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.
|
||||
|
||||
|
|
|
|||
|
|
@ -118,14 +118,6 @@ extern struct x_output the_only_x_display;
|
|||
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));
|
||||
|
|
|
|||
|
|
@ -705,23 +705,6 @@ DEFUN ("set-cursor-size", Fset_cursor_size, Sset_cursor_size, 1, 1, 0,
|
|||
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 ()
|
||||
{
|
||||
|
|
|
|||
100
src/w32term.c
100
src/w32term.c
|
|
@ -2800,106 +2800,6 @@ x_get_keysym_name (keysym)
|
|||
|
||||
/* 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. */
|
||||
|
|
|
|||
107
src/xdisp.c
107
src/xdisp.c
|
|
@ -1402,6 +1402,113 @@ estimate_mode_line_height (f, face_id)
|
|||
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.
|
||||
|
|
|
|||
93
src/xterm.c
93
src/xterm.c
|
|
@ -3474,99 +3474,6 @@ x_get_keysym_name (keysym)
|
|||
|
||||
/* 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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue