Alexandre Julliard : user32: Add driver entry points for cursor creation and destruction, and pass the cursor handle to SetCursor.
Alexandre Julliard
julliard at winehq.org
Wed Apr 21 10:40:18 CDT 2010
Module: wine
Branch: master
Commit: d676bf246da0c15d46d685598191b1146b764460
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d676bf246da0c15d46d685598191b1146b764460
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Apr 20 14:10:46 2010 +0200
user32: Add driver entry points for cursor creation and destruction, and pass the cursor handle to SetCursor.
---
dlls/user32/cursoricon.c | 12 +++++++++---
dlls/user32/driver.c | 34 +++++++++++++++++++++++++++++-----
dlls/user32/user_private.h | 6 ++++--
dlls/winex11.drv/mouse.c | 2 +-
dlls/winex11.drv/winex11.drv.spec | 2 +-
dlls/winex11.drv/x11drv.h | 2 +-
dlls/winex11.drv/x11drv_main.c | 2 +-
7 files changed, 46 insertions(+), 14 deletions(-)
diff --git a/dlls/user32/cursoricon.c b/dlls/user32/cursoricon.c
index fcdb278..60e59c1 100644
--- a/dlls/user32/cursoricon.c
+++ b/dlls/user32/cursoricon.c
@@ -955,6 +955,7 @@ static HICON CURSORICON_CreateIconFromBMI( BITMAPINFO *bmi,
GetBitmapBits( hAndBits, sizeAnd, info + 1 );
GetBitmapBits( hXorBits, sizeXor, (char *)(info + 1) + sizeAnd );
release_icon_ptr( hObj, info );
+ USER_Driver->pCreateCursorIcon( hObj, info );
}
DeleteObject( hAndBits );
@@ -1566,6 +1567,7 @@ HICON WINAPI CopyIcon( HICON hIcon )
memcpy( ptrNew, ptrOld, size );
release_icon_ptr( hIcon, ptrOld );
release_icon_ptr( hNew, ptrNew );
+ USER_Driver->pCreateCursorIcon( hNew, ptrNew );
return hNew;
}
@@ -1578,7 +1580,10 @@ BOOL WINAPI DestroyIcon( HICON hIcon )
TRACE_(icon)("%p\n", hIcon );
if (CURSORICON_DelSharedIcon( hIcon ) == -1)
+ {
+ USER_Driver->pDestroyCursorIcon( hIcon );
free_icon_handle( hIcon );
+ }
return TRUE;
}
@@ -1789,7 +1794,7 @@ HCURSOR WINAPI DECLSPEC_HOTPATCH SetCursor( HCURSOR hCursor /* [in] Handle of cu
CURSORICONINFO *info = get_icon_ptr( hCursor );
/* release before calling driver (FIXME) */
if (info) release_icon_ptr( hCursor, info );
- USER_Driver->pSetCursor( info );
+ USER_Driver->pSetCursor( hCursor, info );
}
return hOldCursor;
}
@@ -1822,9 +1827,9 @@ INT WINAPI DECLSPEC_HOTPATCH ShowCursor( BOOL bShow )
CURSORICONINFO *info = get_icon_ptr( cursor );
/* release before calling driver (FIXME) */
if (info) release_icon_ptr( cursor, info );
- USER_Driver->pSetCursor( info );
+ USER_Driver->pSetCursor( cursor, info );
}
- else USER_Driver->pSetCursor( NULL );
+ else USER_Driver->pSetCursor( 0, NULL );
}
return prev_count + increment;
}
@@ -2195,6 +2200,7 @@ HICON WINAPI CreateIconIndirect(PICONINFO iconinfo)
}
}
release_icon_ptr( hObj, info );
+ USER_Driver->pCreateCursorIcon( hObj, info );
}
return hObj;
}
diff --git a/dlls/user32/driver.c b/dlls/user32/driver.c
index 608c598..ffbfbf8 100644
--- a/dlls/user32/driver.c
+++ b/dlls/user32/driver.c
@@ -84,6 +84,8 @@ static const USER_DRIVER *load_driver(void)
GET_USER_FUNC(ToUnicodeEx);
GET_USER_FUNC(UnloadKeyboardLayout);
GET_USER_FUNC(VkKeyScanEx);
+ GET_USER_FUNC(CreateCursorIcon);
+ GET_USER_FUNC(DestroyCursorIcon);
GET_USER_FUNC(SetCursor);
GET_USER_FUNC(GetCursorPos);
GET_USER_FUNC(SetCursorPos);
@@ -215,7 +217,15 @@ static SHORT CDECL nulldrv_VkKeyScanEx( WCHAR ch, HKL layout )
return -1;
}
-static void CDECL nulldrv_SetCursor( struct tagCURSORICONINFO *info )
+static void CDECL nulldrv_CreateCursorIcon( HCURSOR cursor, struct tagCURSORICONINFO *info )
+{
+}
+
+static void CDECL nulldrv_DestroyCursorIcon( HCURSOR cursor )
+{
+}
+
+static void CDECL nulldrv_SetCursor( HCURSOR cursor, struct tagCURSORICONINFO *info )
{
}
@@ -442,7 +452,9 @@ static USER_DRIVER null_driver =
nulldrv_ToUnicodeEx,
nulldrv_UnloadKeyboardLayout,
nulldrv_VkKeyScanEx,
- /* mouse functions */
+ /* cursor/icon functions */
+ nulldrv_CreateCursorIcon,
+ nulldrv_DestroyCursorIcon,
nulldrv_SetCursor,
nulldrv_GetCursorPos,
nulldrv_SetCursorPos,
@@ -558,9 +570,19 @@ static SHORT CDECL loaderdrv_VkKeyScanEx( WCHAR ch, HKL layout )
return load_driver()->pVkKeyScanEx( ch, layout );
}
-static void CDECL loaderdrv_SetCursor( struct tagCURSORICONINFO *info )
+static void CDECL loaderdrv_CreateCursorIcon( HCURSOR cursor, struct tagCURSORICONINFO *info )
+{
+ load_driver()->pCreateCursorIcon( cursor, info );
+}
+
+static void CDECL loaderdrv_DestroyCursorIcon( HCURSOR cursor )
+{
+ load_driver()->pDestroyCursorIcon( cursor );
+}
+
+static void CDECL loaderdrv_SetCursor( HCURSOR cursor, struct tagCURSORICONINFO *info )
{
- load_driver()->pSetCursor( info );
+ load_driver()->pSetCursor( cursor, info );
}
static BOOL CDECL loaderdrv_GetCursorPos( LPPOINT pt )
@@ -783,7 +805,9 @@ static USER_DRIVER lazy_load_driver =
loaderdrv_ToUnicodeEx,
loaderdrv_UnloadKeyboardLayout,
loaderdrv_VkKeyScanEx,
- /* mouse functions */
+ /* cursor/icon functions */
+ loaderdrv_CreateCursorIcon,
+ loaderdrv_DestroyCursorIcon,
loaderdrv_SetCursor,
loaderdrv_GetCursorPos,
loaderdrv_SetCursorPos,
diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h
index eb6bdc9..953812b 100644
--- a/dlls/user32/user_private.h
+++ b/dlls/user32/user_private.h
@@ -67,8 +67,10 @@ typedef struct tagUSER_DRIVER {
INT (CDECL *pToUnicodeEx)(UINT, UINT, const BYTE *, LPWSTR, int, UINT, HKL);
BOOL (CDECL *pUnloadKeyboardLayout)(HKL);
SHORT (CDECL *pVkKeyScanEx)(WCHAR, HKL);
- /* mouse functions */
- void (CDECL *pSetCursor)(struct tagCURSORICONINFO *);
+ /* cursor/icon functions */
+ void (CDECL *pCreateCursorIcon)(HCURSOR,struct tagCURSORICONINFO *);
+ void (CDECL *pDestroyCursorIcon)(HCURSOR);
+ void (CDECL *pSetCursor)(HCURSOR,struct tagCURSORICONINFO *);
BOOL (CDECL *pGetCursorPos)(LPPOINT);
BOOL (CDECL *pSetCursorPos)(INT,INT);
BOOL (CDECL *pClipCursor)(LPCRECT);
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
index 211edfb..6b22877 100644
--- a/dlls/winex11.drv/mouse.c
+++ b/dlls/winex11.drv/mouse.c
@@ -949,7 +949,7 @@ static Cursor create_cursor( Display *display, CURSORICONINFO *ptr )
/***********************************************************************
* SetCursor (X11DRV.@)
*/
-void CDECL X11DRV_SetCursor( CURSORICONINFO *lpCursor )
+void CDECL X11DRV_SetCursor( HCURSOR handle, CURSORICONINFO *lpCursor )
{
struct x11drv_thread_data *data = x11drv_init_thread_data();
Cursor cursor;
diff --git a/dlls/winex11.drv/winex11.drv.spec b/dlls/winex11.drv/winex11.drv.spec
index edb9a33..4f3dfe6 100644
--- a/dlls/winex11.drv/winex11.drv.spec
+++ b/dlls/winex11.drv/winex11.drv.spec
@@ -73,7 +73,7 @@
@ cdecl ToUnicodeEx(long long ptr ptr long long long) X11DRV_ToUnicodeEx
@ cdecl UnloadKeyboardLayout(long) X11DRV_UnloadKeyboardLayout
@ cdecl VkKeyScanEx(long long) X11DRV_VkKeyScanEx
-@ cdecl SetCursor(ptr) X11DRV_SetCursor
+@ cdecl SetCursor(long ptr) X11DRV_SetCursor
@ cdecl GetCursorPos(ptr) X11DRV_GetCursorPos
@ cdecl SetCursorPos(long long) X11DRV_SetCursorPos
@ cdecl ClipCursor(ptr) X11DRV_ClipCursor
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index a062e92..12ec286 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -784,7 +784,7 @@ extern void X11DRV_Clipboard_Cleanup(void);
extern void X11DRV_ResetSelectionOwner(void);
extern void CDECL X11DRV_SetFocus( HWND hwnd );
extern Cursor X11DRV_GetCursor( Display *display, struct tagCURSORICONINFO *ptr );
-extern void CDECL X11DRV_SetCursor( struct tagCURSORICONINFO *lpCursor );
+extern void CDECL X11DRV_SetCursor( HCURSOR cursor, struct tagCURSORICONINFO *lpCursor );
extern BOOL CDECL X11DRV_ClipCursor( LPCRECT clip );
extern void X11DRV_InitKeyboard( Display *display );
extern void X11DRV_send_keyboard_input( WORD wVk, WORD wScan, DWORD dwFlags, DWORD time,
diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c
index 7b4fb58..240e4d9 100644
--- a/dlls/winex11.drv/x11drv_main.c
+++ b/dlls/winex11.drv/x11drv_main.c
@@ -664,7 +664,7 @@ struct x11drv_thread_data *x11drv_init_thread_data(void)
TlsSetValue( thread_data_tls_index, data );
if (use_xim) X11DRV_SetupXIM();
- X11DRV_SetCursor( NULL );
+ X11DRV_SetCursor( 0, NULL );
return data;
}
More information about the wine-cvs
mailing list