Ken Thomases : winemac: Implement SetCursorPos().
Alexandre Julliard
julliard at winehq.org
Mon Feb 25 14:33:46 CST 2013
Module: wine
Branch: master
Commit: 5c933c89ad1bddf44768085c0d3b22a2a936db3a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5c933c89ad1bddf44768085c0d3b22a2a936db3a
Author: Ken Thomases <ken at codeweavers.com>
Date: Sun Feb 24 22:53:47 2013 -0600
winemac: Implement SetCursorPos().
---
dlls/winemac.drv/cocoa_app.h | 2 +
dlls/winemac.drv/cocoa_app.m | 53 +++++++++++++++++++++++++++++++++++++
dlls/winemac.drv/macdrv_cocoa.h | 1 +
dlls/winemac.drv/mouse.c | 14 ++++++++++
dlls/winemac.drv/winemac.drv.spec | 1 +
5 files changed, 71 insertions(+), 0 deletions(-)
diff --git a/dlls/winemac.drv/cocoa_app.h b/dlls/winemac.drv/cocoa_app.h
index 32e4180..3567595 100644
--- a/dlls/winemac.drv/cocoa_app.h
+++ b/dlls/winemac.drv/cocoa_app.h
@@ -58,6 +58,8 @@
int cursorFrame;
NSTimer* cursorTimer;
BOOL cursorHidden;
+
+ NSTimeInterval lastSetCursorPositionTime;
}
@property (nonatomic) CGEventSourceKeyboardType keyboardType;
diff --git a/dlls/winemac.drv/cocoa_app.m b/dlls/winemac.drv/cocoa_app.m
index 3744498..f1ad0bc 100644
--- a/dlls/winemac.drv/cocoa_app.m
+++ b/dlls/winemac.drv/cocoa_app.m
@@ -548,6 +548,31 @@ int macdrv_err_on;
}
}
+ - (BOOL) setCursorPosition:(CGPoint)pos
+ {
+ BOOL ret;
+
+ ret = (CGWarpMouseCursorPosition(pos) == kCGErrorSuccess);
+ if (ret)
+ {
+ WineEventQueue* queue;
+
+ lastSetCursorPositionTime = [[NSProcessInfo processInfo] systemUptime];
+
+ // Discard all pending mouse move events.
+ [eventQueuesLock lock];
+ for (queue in eventQueues)
+ {
+ [queue discardEventsMatchingMask:event_mask_for_type(MOUSE_MOVED) |
+ event_mask_for_type(MOUSE_MOVED_ABSOLUTE)
+ forWindow:nil];
+ }
+ [eventQueuesLock unlock];
+ }
+
+ return ret;
+ }
+
/*
* ---------- NSApplication method overrides ----------
@@ -587,6 +612,17 @@ int macdrv_err_on;
BOOL absolute = forceNextMouseMoveAbsolute || (targetWindow != lastTargetWindow);
forceNextMouseMoveAbsolute = FALSE;
+ // If we recently warped the cursor, discard mouse move events until
+ // we see an event which is later than that time.
+ if (lastSetCursorPositionTime)
+ {
+ if ([anEvent timestamp] <= lastSetCursorPositionTime)
+ return;
+
+ lastSetCursorPositionTime = 0;
+ absolute = TRUE;
+ }
+
[targetWindow postMouseMovedEvent:anEvent absolute:absolute];
lastTargetWindow = targetWindow;
}
@@ -893,3 +929,20 @@ int macdrv_get_cursor_position(CGPoint *pos)
return TRUE;
}
+
+/***********************************************************************
+ * macdrv_set_cursor_position
+ *
+ * Sets the cursor position without generating events. Returns zero on
+ * failure, non-zero on success.
+ */
+int macdrv_set_cursor_position(CGPoint pos)
+{
+ __block int ret;
+
+ OnMainThread(^{
+ ret = [NSApp setCursorPosition:pos];
+ });
+
+ return ret;
+}
diff --git a/dlls/winemac.drv/macdrv_cocoa.h b/dlls/winemac.drv/macdrv_cocoa.h
index c3ad6ba..16f5595 100644
--- a/dlls/winemac.drv/macdrv_cocoa.h
+++ b/dlls/winemac.drv/macdrv_cocoa.h
@@ -121,6 +121,7 @@ extern void macdrv_beep(void) DECLSPEC_HIDDEN;
/* cursor */
extern void macdrv_set_cursor(CFStringRef name, CFArrayRef frames) DECLSPEC_HIDDEN;
extern int macdrv_get_cursor_position(CGPoint *pos) DECLSPEC_HIDDEN;
+extern int macdrv_set_cursor_position(CGPoint pos) DECLSPEC_HIDDEN;
/* display */
diff --git a/dlls/winemac.drv/mouse.c b/dlls/winemac.drv/mouse.c
index b0288f6..d38a316 100644
--- a/dlls/winemac.drv/mouse.c
+++ b/dlls/winemac.drv/mouse.c
@@ -848,6 +848,20 @@ done:
/***********************************************************************
+ * SetCursorPos (MACDRV.@)
+ */
+BOOL CDECL macdrv_SetCursorPos(INT x, INT y)
+{
+ BOOL ret = macdrv_set_cursor_position(CGPointMake(x, y));
+ if (ret)
+ TRACE("warped to %d,%d\n", x, y);
+ else
+ ERR("failed to warp to %d,%d\n", x, y);
+ return ret;
+}
+
+
+/***********************************************************************
* macdrv_mouse_button
*
* Handler for MOUSE_BUTTON events.
diff --git a/dlls/winemac.drv/winemac.drv.spec b/dlls/winemac.drv/winemac.drv.spec
index 99746b4..87cd0ee 100644
--- a/dlls/winemac.drv/winemac.drv.spec
+++ b/dlls/winemac.drv/winemac.drv.spec
@@ -22,6 +22,7 @@
@ cdecl MsgWaitForMultipleObjectsEx(long ptr long long long) macdrv_MsgWaitForMultipleObjectsEx
@ cdecl ScrollDC(long long long ptr ptr long ptr) macdrv_ScrollDC
@ cdecl SetCursor(long) macdrv_SetCursor
+@ cdecl SetCursorPos(long long) macdrv_SetCursorPos
@ cdecl SetFocus(long) macdrv_SetFocus
@ cdecl SetLayeredWindowAttributes(long long long long) macdrv_SetLayeredWindowAttributes
@ cdecl SetParent(long long long) macdrv_SetParent
More information about the wine-cvs
mailing list