Make GetCursorPos call XQueryPointer.
diff --git a/dlls/ttydrv/ttydrv.spec b/dlls/ttydrv/ttydrv.spec index 00675d2..520c83a 100644 --- a/dlls/ttydrv/ttydrv.spec +++ b/dlls/ttydrv/ttydrv.spec
@@ -21,7 +21,6 @@ @ cdecl GetDIData(ptr long ptr ptr long) TTYDRV_GetDIData @ cdecl InitMouse(ptr) TTYDRV_InitMouse @ cdecl SetCursor(ptr) TTYDRV_SetCursor -@ cdecl MoveCursor(long long) TTYDRV_MoveCursor @ cdecl GetScreenSaveActive() TTYDRV_GetScreenSaveActive @ cdecl SetScreenSaveActive(long) TTYDRV_SetScreenSaveActive @ cdecl GetScreenSaveTimeout() TTYDRV_GetScreenSaveTimeout
diff --git a/dlls/ttydrv/user.c b/dlls/ttydrv/user.c index 806ef7a..95c41e1 100644 --- a/dlls/ttydrv/user.c +++ b/dlls/ttydrv/user.c
@@ -95,13 +95,6 @@ } /*********************************************************************** - * TTYDRV_MoveCursor (TTYDRV.@) - */ -void TTYDRV_MoveCursor(WORD wAbsX, WORD wAbsY) -{ -} - -/*********************************************************************** * TTYDRV_GetScreenSaveActive (TTYDRV.@) * * Returns the active status of the screen saver
diff --git a/dlls/user/display.c b/dlls/user/display.c index e132285..e5416b6 100644 --- a/dlls/user/display.c +++ b/dlls/user/display.c
@@ -44,7 +44,7 @@ */ VOID WINAPI DISPLAY_MoveCursor( WORD wAbsX, WORD wAbsY ) { - USER_Driver.pMoveCursor(wAbsX, wAbsY); + USER_Driver.pSetCursorPos(wAbsX, wAbsY); } /***********************************************************************
diff --git a/dlls/user/user_main.c b/dlls/user/user_main.c index b75e169..2bbef8a 100644 --- a/dlls/user/user_main.c +++ b/dlls/user/user_main.c
@@ -70,7 +70,8 @@ GET_USER_FUNC(GetDIData); GET_USER_FUNC(InitMouse); GET_USER_FUNC(SetCursor); - GET_USER_FUNC(MoveCursor); + GET_USER_FUNC(GetCursorPos); + GET_USER_FUNC(SetCursorPos); GET_USER_FUNC(GetScreenSaveActive); GET_USER_FUNC(SetScreenSaveActive); GET_USER_FUNC(GetScreenSaveTimeout);
diff --git a/dlls/x11drv/x11drv.spec b/dlls/x11drv/x11drv.spec index d850234..126cb51 100644 --- a/dlls/x11drv/x11drv.spec +++ b/dlls/x11drv/x11drv.spec
@@ -21,7 +21,8 @@ @ cdecl GetDIData(ptr long ptr ptr long) X11DRV_GetDIData @ cdecl InitMouse(ptr) X11DRV_InitMouse @ cdecl SetCursor(ptr) X11DRV_SetCursor -@ cdecl MoveCursor(long long) X11DRV_MoveCursor +@ cdecl GetCursorPos(ptr) X11DRV_GetCursorPos +@ cdecl SetCursorPos(long long) X11DRV_SetCursorPos @ cdecl GetScreenSaveActive() X11DRV_GetScreenSaveActive @ cdecl SetScreenSaveActive(long) X11DRV_SetScreenSaveActive @ cdecl GetScreenSaveTimeout() X11DRV_GetScreenSaveTimeout
diff --git a/include/user.h b/include/user.h index 8d0355d..c832bbb 100644 --- a/include/user.h +++ b/include/user.h
@@ -50,7 +50,8 @@ /* mouse functions */ void (*pInitMouse)(LPMOUSE_EVENT_PROC); void (*pSetCursor)(struct tagCURSORICONINFO *); - void (*pMoveCursor)(WORD, WORD); + void (*pGetCursorPos)(LPPOINT); + void (*pSetCursorPos)(INT,INT); /* screen saver functions */ BOOL (*pGetScreenSaveActive)(void); void (*pSetScreenSaveActive)(BOOL);
diff --git a/windows/cursoricon.c b/windows/cursoricon.c index 52b1b99..ced1990 100644 --- a/windows/cursoricon.c +++ b/windows/cursoricon.c
@@ -1468,25 +1468,6 @@ /*********************************************************************** - * SetCursorPos (USER.70) - */ -void WINAPI SetCursorPos16( INT16 x, INT16 y ) -{ - SetCursorPos( x, y ); -} - - -/*********************************************************************** - * SetCursorPos (USER32.@) - */ -BOOL WINAPI SetCursorPos( INT x, INT y ) -{ - USER_Driver.pMoveCursor( x, y ); - return TRUE; -} - - -/*********************************************************************** * ShowCursor (USER.71) */ INT16 WINAPI ShowCursor16( BOOL16 bShow )
diff --git a/windows/input.c b/windows/input.c index 2dc96c2..d16614d 100644 --- a/windows/input.c +++ b/windows/input.c
@@ -368,9 +368,11 @@ */ BOOL16 WINAPI GetCursorPos16( POINT16 *pt ) { + POINT pos; if (!pt) return 0; - pt->x = PosX; - pt->y = PosY; + GetCursorPos(&pos); + pt->x = pos.x; + pt->y = pos.y; return 1; } @@ -383,10 +385,32 @@ if (!pt) return 0; pt->x = PosX; pt->y = PosY; + if (USER_Driver.pGetCursorPos) USER_Driver.pGetCursorPos( pt ); return 1; } +/*********************************************************************** + * SetCursorPos (USER.70) + */ +void WINAPI SetCursorPos16( INT16 x, INT16 y ) +{ + SetCursorPos( x, y ); +} + + +/*********************************************************************** + * SetCursorPos (USER32.@) + */ +BOOL WINAPI SetCursorPos( INT x, INT y ) +{ + if (USER_Driver.pSetCursorPos) USER_Driver.pSetCursorPos( x, y ); + PosX = x; + PosY = y; + return TRUE; +} + + /********************************************************************** * EVENT_Capture *
diff --git a/windows/x11drv/mouse.c b/windows/x11drv/mouse.c index 03f68a1..211c0bb 100644 --- a/windows/x11drv/mouse.c +++ b/windows/x11drv/mouse.c
@@ -196,9 +196,9 @@ } /*********************************************************************** - * MoveCursor (X11DRV.@) + * SetCursorPos (X11DRV.@) */ -void X11DRV_MoveCursor(WORD wAbsX, WORD wAbsY) +void X11DRV_SetCursorPos(INT wAbsX, INT wAbsY) { /* * We do not want to create MotionNotify events here, @@ -218,7 +218,7 @@ * are supposed to move to; if so, we don't need to do anything. */ - Display *display = thread_display(); + Display *display = thread_display(); Window root, child; int rootX, rootY, winX, winY; unsigned int xstate; @@ -233,8 +233,30 @@ return; TRACE("(%d,%d): moving from (%d,%d)\n", wAbsX, wAbsY, winX, winY ); - - TSXWarpPointer( display, root_window, root_window, 0, 0, 0, 0, wAbsX, wAbsY ); + + wine_tsx11_lock(); + XWarpPointer( display, root_window, root_window, 0, 0, 0, 0, wAbsX, wAbsY ); + XFlush( display ); /* just in case */ + wine_tsx11_unlock(); +} + +/*********************************************************************** + * GetCursorPos (X11DRV.@) + */ +void X11DRV_GetCursorPos(LPPOINT pos) +{ + Display *display = thread_display(); + Window root, child; + int rootX, rootY, winX, winY; + unsigned int xstate; + + if (!TSXQueryPointer( display, root_window, &root, &child, + &rootX, &rootY, &winX, &winY, &xstate )) + return; + + TRACE("pointer at (%d,%d)\n", winX, winY ); + pos->x = winX; + pos->y = winY; } /***********************************************************************