From 2b5113740643a2243e56d0878e179aef634adf38 Mon Sep 17 00:00:00 2001 From: Dmitry Antipov Date: Wed, 28 May 2014 17:53:22 +0400 Subject: [PATCH] Refactor mouse positioning stuff to avoid code duplication. * frame.h (frame_char_to_pixel_position): New function. (x_set_mouse_position): Rename to... (frame_set_mouse_position): ...new function. (frame_set_mouse_pixel_position): Add prototype. * nsterm.m, w32term.c, xterm.c (x_set_mouse_pixel_position): Rename to frame_set_mouse_pixel_position. * frame.c (Fset_mouse_pixel_position, Fset_mouse_position): Adjust users. * xterm.h, w32term.h ( x_set_mouse_position) (x_set_mouse_pixel_position): Remove prototypes. --- src/ChangeLog | 14 ++++++++++++++ src/frame.c | 4 ++-- src/frame.h | 34 ++++++++++++++++++++++++++++++++-- src/nsterm.m | 26 ++------------------------ src/w32term.c | 21 +-------------------- src/w32term.h | 2 -- src/xterm.c | 25 +------------------------ src/xterm.h | 2 -- 8 files changed, 52 insertions(+), 76 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 2c142c5edb7..1fe76c9c75f 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,17 @@ +2014-05-28 Dmitry Antipov + + Refactor mouse positioning stuff to avoid code duplication. + * frame.h (frame_char_to_pixel_position): New function. + (x_set_mouse_position): Rename to... + (frame_set_mouse_position): ...new function. + (frame_set_mouse_pixel_position): Add prototype. + * nsterm.m, w32term.c, xterm.c (x_set_mouse_pixel_position): + Rename to frame_set_mouse_pixel_position. + * frame.c (Fset_mouse_pixel_position, Fset_mouse_position): + Adjust users. + * xterm.h, w32term.h ( x_set_mouse_position) + (x_set_mouse_pixel_position): Remove prototypes. + 2014-05-28 Dmitry Antipov On X, always make pointer visible when deleting frame (Bug#17609). diff --git a/src/frame.c b/src/frame.c index ece0537a203..482e21bbfbc 100644 --- a/src/frame.c +++ b/src/frame.c @@ -1617,7 +1617,7 @@ before calling this function on it, like this. #ifdef HAVE_WINDOW_SYSTEM if (FRAME_WINDOW_P (XFRAME (frame))) /* Warping the mouse will cause enternotify and focus events. */ - x_set_mouse_position (XFRAME (frame), XINT (x), XINT (y)); + frame_set_mouse_position (XFRAME (frame), XINT (x), XINT (y)); #else #if defined (MSDOS) if (FRAME_MSDOS_P (XFRAME (frame))) @@ -1658,7 +1658,7 @@ before calling this function on it, like this. #ifdef HAVE_WINDOW_SYSTEM if (FRAME_WINDOW_P (XFRAME (frame))) /* Warping the mouse will cause enternotify and focus events. */ - x_set_mouse_pixel_position (XFRAME (frame), XINT (x), XINT (y)); + frame_set_mouse_pixel_position (XFRAME (frame), XINT (x), XINT (y)); #else #if defined (MSDOS) if (FRAME_MSDOS_P (XFRAME (frame))) diff --git a/src/frame.h b/src/frame.h index c0c206d7c6a..c22b9c2a823 100644 --- a/src/frame.h +++ b/src/frame.h @@ -1313,8 +1313,7 @@ extern void set_frame_menubar (struct frame *f, bool first_time, bool deep_p); extern void x_set_window_size (struct frame *f, int change_grav, int width, int height, bool pixelwise); extern Lisp_Object x_get_focus_frame (struct frame *); -extern void x_set_mouse_position (struct frame *f, int h, int v); -extern void x_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y); +extern void frame_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y); extern void x_make_frame_visible (struct frame *f); extern void x_make_frame_invisible (struct frame *f); extern void x_iconify_frame (struct frame *f); @@ -1366,6 +1365,37 @@ flush_frame (struct frame *f) rif->flush_display (f); } +/* Convert character coordinates X and Y to pixel + coordinates PIX_X and PIX_Y on frame F. */ + +INLINE void +frame_char_to_pixel_position (struct frame *f, int x, int y, int *pix_x, int *pix_y) +{ + *pix_x = FRAME_COL_TO_PIXEL_X (f, x) + FRAME_COLUMN_WIDTH (f) / 2; + *pix_y = FRAME_LINE_TO_PIXEL_Y (f, y) + FRAME_LINE_HEIGHT (f) / 2; + + if (*pix_x < 0) + *pix_x = 0; + if (*pix_x > FRAME_PIXEL_WIDTH (f)) + *pix_x = FRAME_PIXEL_WIDTH (f); + + if (*pix_y < 0) + *pix_y = 0; + if (*pix_y > FRAME_PIXEL_HEIGHT (f)) + *pix_y = FRAME_PIXEL_HEIGHT (f); +} + +/* Reposition mouse pointer to character coordinates X and Y on frame F. */ + +INLINE +void frame_set_mouse_position (struct frame *f, int x, int y) +{ + int pix_x, pix_y; + + frame_char_to_pixel_position (f, x, y, &pix_x, &pix_y); + frame_set_mouse_pixel_position (f, pix_x, pix_y); +} + /*********************************************************************** Multimonitor data ***********************************************************************/ diff --git a/src/nsterm.m b/src/nsterm.m index ba94d28b797..f91b86daea6 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -1812,12 +1812,12 @@ x_set_frame_alpha (struct frame *f) void -x_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y) +frame_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y) /* -------------------------------------------------------------------------- Programmatically reposition mouse pointer in pixel coordinates -------------------------------------------------------------------------- */ { - NSTRACE (x_set_mouse_pixel_position); + NSTRACE (frame_set_mouse_pixel_position); ns_raise_frame (f); #if 0 /* FIXME: this does not work, and what about GNUstep? */ @@ -1829,28 +1829,6 @@ x_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y) #endif } - -void -x_set_mouse_position (struct frame *f, int h, int v) -/* -------------------------------------------------------------------------- - Programmatically reposition mouse pointer in character coordinates - -------------------------------------------------------------------------- */ -{ - int pix_x, pix_y; - - pix_x = FRAME_COL_TO_PIXEL_X (f, h) + FRAME_COLUMN_WIDTH (f) / 2; - pix_y = FRAME_LINE_TO_PIXEL_Y (f, v) + FRAME_LINE_HEIGHT (f) / 2; - - if (pix_x < 0) pix_x = 0; - if (pix_x > FRAME_PIXEL_WIDTH (f)) pix_x = FRAME_PIXEL_WIDTH (f); - - if (pix_y < 0) pix_y = 0; - if (pix_y > FRAME_PIXEL_HEIGHT (f)) pix_y = FRAME_PIXEL_HEIGHT (f); - - x_set_mouse_pixel_position (f, pix_x, pix_y); -} - - static int note_mouse_movement (struct frame *frame, CGFloat x, CGFloat y) /* ------------------------------------------------------------------------ diff --git a/src/w32term.c b/src/w32term.c index 59e9b0ad8a1..5145c840c71 100644 --- a/src/w32term.c +++ b/src/w32term.c @@ -5767,27 +5767,8 @@ x_set_window_size (struct frame *f, int change_gravity, int width, int height, b /* Mouse warping. */ -void x_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y); - -void -x_set_mouse_position (struct frame *f, int x, int y) -{ - int pix_x, pix_y; - - pix_x = FRAME_COL_TO_PIXEL_X (f, x) + FRAME_COLUMN_WIDTH (f) / 2; - pix_y = FRAME_LINE_TO_PIXEL_Y (f, y) + FRAME_LINE_HEIGHT (f) / 2; - - if (pix_x < 0) pix_x = 0; - if (pix_x > FRAME_PIXEL_WIDTH (f)) pix_x = FRAME_PIXEL_WIDTH (f); - - if (pix_y < 0) pix_y = 0; - if (pix_y > FRAME_PIXEL_HEIGHT (f)) pix_y = FRAME_PIXEL_HEIGHT (f); - - x_set_mouse_pixel_position (f, pix_x, pix_y); -} - void -x_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y) +frame_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y) { RECT rect; POINT pt; diff --git a/src/w32term.h b/src/w32term.h index e3b65f0ffaf..561a280b65f 100644 --- a/src/w32term.h +++ b/src/w32term.h @@ -219,8 +219,6 @@ extern void x_set_window_size (struct frame *f, int change_grav, extern int x_display_pixel_height (struct w32_display_info *); extern int x_display_pixel_width (struct w32_display_info *); extern Lisp_Object x_get_focus_frame (struct frame *); -extern void x_set_mouse_position (struct frame *f, int h, int v); -extern void x_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y); extern void x_make_frame_visible (struct frame *f); extern void x_make_frame_invisible (struct frame *f); extern void x_iconify_frame (struct frame *f); diff --git a/src/xterm.c b/src/xterm.c index ed5d0382eae..83d3cb1ab73 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -8735,34 +8735,11 @@ x_set_window_size (struct frame *f, int change_gravity, int width, int height, b unblock_input (); } - -/* Mouse warping. */ - -void -x_set_mouse_position (struct frame *f, int x, int y) -{ - int pix_x, pix_y; - - pix_x = FRAME_COL_TO_PIXEL_X (f, x) + FRAME_COLUMN_WIDTH (f) / 2; - pix_y = FRAME_LINE_TO_PIXEL_Y (f, y) + FRAME_LINE_HEIGHT (f) / 2; - - if (pix_x < 0) pix_x = 0; - if (pix_x > FRAME_PIXEL_WIDTH (f)) pix_x = FRAME_PIXEL_WIDTH (f); - - if (pix_y < 0) pix_y = 0; - if (pix_y > FRAME_PIXEL_HEIGHT (f)) pix_y = FRAME_PIXEL_HEIGHT (f); - - block_input (); - - XWarpPointer (FRAME_X_DISPLAY (f), None, FRAME_X_WINDOW (f), - 0, 0, 0, 0, pix_x, pix_y); - unblock_input (); -} /* Move the mouse to position pixel PIX_X, PIX_Y relative to frame F. */ void -x_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y) +frame_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y) { block_input (); diff --git a/src/xterm.h b/src/xterm.h index 3e79de10976..8f71cefb02b 100644 --- a/src/xterm.h +++ b/src/xterm.h @@ -931,8 +931,6 @@ extern bool x_had_errors_p (Display *); extern void x_uncatch_errors (void); extern void x_clear_errors (Display *); extern void x_set_window_size (struct frame *, int, int, int, bool); -extern void x_set_mouse_position (struct frame *, int, int); -extern void x_set_mouse_pixel_position (struct frame *, int, int); extern void xembed_request_focus (struct frame *); extern void x_ewmh_activate_frame (struct frame *); extern void x_delete_terminal (struct terminal *terminal); -- 2.39.2