causes the receiving process to terminate with a core dump if no
debugger has been attached to it.
+** `set-mouse-position' and `set-mouse-absolute-pixel-position' work
+on macOS.
+
\f
----------------------------------------------------------------------
This file is part of GNU Emacs.
(t
(cons 0 0)))))
+(declare-function ns-set-mouse-absolute-pixel-position "nsfns.m" (x y))
(declare-function w32-set-mouse-absolute-pixel-position "w32fns.c" (x y))
(declare-function x-set-mouse-absolute-pixel-position "xfns.c" (x y))
position (0, 0) of the selected frame's terminal."
(let ((frame-type (framep-on-display)))
(cond
+ ((eq frame-type 'ns)
+ (ns-set-mouse-absolute-pixel-position x y))
((eq frame-type 'x)
(x-set-mouse-absolute-pixel-position x y))
((eq frame-type 'w32)
: Qnative_edges));
}
+DEFUN ("ns-set-mouse-absolute-pixel-position",
+ Fns_set_mouse_absolute_pixel_position,
+ Sns_set_mouse_absolute_pixel_position, 2, 2, 0,
+ doc: /* Move mouse pointer to absolute pixel position (X, Y).
+The coordinates X and Y are interpreted in pixels relative to a position
+\(0, 0) of the selected frame's display. */)
+ (Lisp_Object x, Lisp_Object y)
+{
+ struct frame *f = SELECTED_FRAME ();
+ EmacsView *view = FRAME_NS_VIEW (f);
+ NSScreen *screen = [[view window] screen];
+ NSRect screen_frame = [screen frame];
+ int mouse_x, mouse_y;
+
+ NSScreen *primary_screen = [[NSScreen screens] objectAtIndex:0];
+ NSRect primary_screen_frame = [primary_screen frame];
+ CGFloat primary_screen_height = primary_screen_frame.size.height;
+
+ if (FRAME_INITIAL_P (f) || !FRAME_NS_P (f))
+ return Qnil;
+
+ CHECK_TYPE_RANGED_INTEGER (int, x);
+ CHECK_TYPE_RANGED_INTEGER (int, y);
+
+ mouse_x = screen_frame.origin.x + XINT (x);
+
+ if (screen == primary_screen)
+ mouse_y = screen_frame.origin.y + XINT (y);
+ else
+ mouse_y = (primary_screen_height - screen_frame.size.height
+ - screen_frame.origin.y) + XINT (y);
+
+ CGPoint mouse_pos = CGPointMake(mouse_x, mouse_y);
+ CGWarpMouseCursorPosition (mouse_pos);
+
+ return Qnil;
+}
+
/* ==========================================================================
Class implementations
defsubr (&Sns_frame_edges);
defsubr (&Sns_frame_list_z_order);
defsubr (&Sns_frame_restack);
+ defsubr (&Sns_set_mouse_absolute_pixel_position);
defsubr (&Sx_display_mm_width);
defsubr (&Sx_display_mm_height);
defsubr (&Sx_display_screens);
? ([[FRAME_NS_VIEW (f) window] parentWindow].frame.origin.y \
+ [[FRAME_NS_VIEW (f) window] parentWindow].frame.size.height \
- FRAME_NS_TITLEBAR_HEIGHT (FRAME_PARENT_FRAME (f))) \
- : [[[FRAME_NS_VIEW (f) window] screen] frame].size.height)
+ : [[[NSScreen screens] objectAtIndex: 0] frame].size.height)
#define FRAME_NS_FONT_TABLE(f) (FRAME_DISPLAY_INFO (f)->font_table)
-------------------------------------------------------------------------- */
{
NSTRACE ("frame_set_mouse_pixel_position");
- ns_raise_frame (f);
-#if 0
- /* FIXME: this does not work, and what about GNUstep? */
+
+ /* FIXME: what about GNUstep? */
#ifdef NS_IMPL_COCOA
- [FRAME_NS_VIEW (f) lockFocus];
- PSsetmouse ((float)pix_x, (float)pix_y);
- [FRAME_NS_VIEW (f) unlockFocus];
-#endif
+ CGPoint mouse_pos =
+ CGPointMake(f->left_pos + pix_x,
+ f->top_pos + pix_y +
+ FRAME_NS_TITLEBAR_HEIGHT(f) + FRAME_TOOLBAR_HEIGHT(f));
+ CGWarpMouseCursorPosition (mouse_pos);
#endif
}
(should-not (mouse--down-1-maybe-follows-link))
(should (equal unread-command-events '((mouse-2 nil 1))))))
+(ert-deftest bug26816-mouse-frame-movement ()
+ "Mouse moves relative to frame."
+ (skip-unless (display-graphic-p))
+ (let ((frame (selected-frame)))
+ (set-mouse-position frame 0 0)
+ (should (equal (mouse-position)
+ (cons frame (cons 0 0))))))
+
+
;;; mouse-tests.el ends here