From d676bf246da0c15d46d685598191b1146b764460 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Tue, 20 Apr 2010 14:10:46 +0200 Subject: [PATCH] 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 fcdb278da67..60e59c15192 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 608c598b56b..ffbfbf82f48 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 eb6bdc9147d..953812bab98 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 211edfb8e2e..6b228771c00 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 edb9a33f5d9..4f3dfe66d89 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 a062e927a1b..12ec2868b0c 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 7b4fb58dd77..240e4d95876 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; } -- 2.11.4.GIT