summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog14
-rw-r--r--src/frame.c4
-rw-r--r--src/frame.h34
-rw-r--r--src/nsterm.m26
-rw-r--r--src/w32term.c21
-rw-r--r--src/w32term.h2
-rw-r--r--src/xterm.c25
-rw-r--r--src/xterm.h2
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,5 +1,19 @@
2014-05-28 Dmitry Antipov <dmantipov@yandex.ru>
+ 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 <dmantipov@yandex.ru>
+
On X, always make pointer visible when deleting frame (Bug#17609).
* frame.c (frame_make_pointer_visible, frame_make_pointer_invisible):
Pass frame as arg.
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);