set-mouse-position patch for Mac OS X
Steven Tamm <[email protected]> Fri, 19 Jul 2002 01:32:20 -0700
| Newsgroups | gmane.emacs.macintosh.devel |
|---|---|
| Message-ID | <[email protected]> |
After much digging I found a way to move the mouse cursor around
programmatically in Mac OS X, despite the documentation of
CursorDeviceMoveTo saying you could not. In Quartz 2D, they added the
ability to directly modify the screen, including setting the position of
the cursor. The documentation can be found in a technote here
http://developer.apple.com/technotes/tn/tn2007.html I'm running 10.1.5,
so that's all I can vouch for.
To try it out you can simple eval (set-mouse-position (selected-frame)
10 10) and it should jump the cursor 10 lines down and 10 characters
over. If you remove the call to ObscureCursor in XTread_socket it will
be more dramatic. mouse-avoidance-mode is even more clever.
Replace the implementation of x_set_mouse_pixel_position in macterm.c
(around line 9923 in my version) to be this...
void
x_set_mouse_pixel_position (f, pix_x, pix_y)
struct frame *f;
int pix_x, pix_y;
{
#if MAC_OSX
CGPoint point;
Point pt;
Rect r;
GrafPtr savePort;
BLOCK_INPUT;
GetPort(&savePort);
#if TARGET_API_MAC_CARBON
SetPort (GetWindowPort (FRAME_MAC_WINDOW (f)));
#else
SetPort (FRAME_MAC_WINDOW (f));
#endif
GetWindowPortBounds (FRAME_MAC_WINDOW (f), &r);
SetPt(&pt, r.left, r.top);
LocalToGlobal(&pt);
SetPort (savePort);
/* Use Quartz 2d Direct Display API to move cursor. Not sure if this
works on OS X 10.0 */
point = CGPointMake(pt.h+pix_x, pt.v+pix_y);
CGDisplayMoveCursorToPoint(kCGDirectMainDisplay, point);
UNBLOCK_INPUT;
#endif /* MAC_OSX */
}
Thanks for reading,
-Steven
-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf