Module: wine Branch: master Commit: 751a09e9839d7273895df24666a0bb2fb51a29c7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=751a09e9839d7273895df24666...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Oct 11 12:50:58 2010 +0200
user32: Store the module and resource name information for icons.
---
dlls/user32/cursoricon.c | 62 +++++++++++++++++++++++++++++---------------- 1 files changed, 40 insertions(+), 22 deletions(-)
diff --git a/dlls/user32/cursoricon.c b/dlls/user32/cursoricon.c index e27365c..c88bc53 100644 --- a/dlls/user32/cursoricon.c +++ b/dlls/user32/cursoricon.c @@ -39,6 +39,7 @@ #include "controls.h" #include "user_private.h" #include "wine/list.h" +#include "wine/unicode.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(cursor); @@ -114,6 +115,8 @@ struct cursoricon_object { struct user_object obj; /* object header */ ULONG_PTR param; /* opaque param used by 16-bit code */ + HMODULE module; /* module for icons loaded from resources */ + LPWSTR resname; /* resource name for icons loaded from resources */ BOOL is_icon; /* whether icon or cursor */ UINT width; UINT height; @@ -165,6 +168,7 @@ static BOOL free_icon_handle( HICON handle ) if (obj->frames[i].color) DeleteObject( obj->frames[i].color ); DeleteObject( obj->frames[i].mask ); } + if (!IS_INTRESOURCE( obj->resname )) HeapFree( GetProcessHeap(), 0, obj->resname ); HeapFree( GetProcessHeap(), 0, obj ); if (wow_handlers.free_icon_param && param) wow_handlers.free_icon_param( param ); USER_Driver->pDestroyCursorIcon( handle ); @@ -845,22 +849,13 @@ done: return ret; }
-static HICON CURSORICON_CreateIconFromBMI( BITMAPINFO *bmi, - POINT hotspot, BOOL bIcon, - DWORD dwVersion, - INT width, INT height, - UINT cFlag ) +static HICON CURSORICON_CreateIconFromBMI( BITMAPINFO *bmi, HMODULE module, LPCWSTR resname, + POINT hotspot, BOOL bIcon, INT width, INT height, UINT cFlag ) { HICON hObj; HBITMAP color = 0, mask = 0, alpha = 0; BOOL do_stretch;
- if (dwVersion == 0x00020000) - { - FIXME_(cursor)("\t2.xx resources are not supported\n"); - return 0; - } - /* Check bitmap header */
if ( (bmi->bmiHeader.biSize != sizeof(BITMAPCOREHEADER)) && @@ -899,13 +894,22 @@ static HICON CURSORICON_CreateIconFromBMI( BITMAPINFO *bmi, struct cursoricon_object *info = get_icon_ptr( hObj );
info->is_icon = bIcon; + info->module = module; info->hotspot = hotspot; info->width = width; info->height = height; info->frames[0].color = color; info->frames[0].mask = mask; info->frames[0].alpha = alpha; + if (!IS_INTRESOURCE(resname)) + { + info->resname = HeapAlloc( GetProcessHeap(), 0, (strlenW(resname) + 1) * sizeof(WCHAR) ); + if (info->resname) strcpyW( info->resname, resname ); + } + else info->resname = MAKEINTRESOURCEW( LOWORD(resname) ); + release_icon_ptr( hObj, info ); + USER_Driver->pCreateCursorIcon( hObj ); } else { @@ -1149,7 +1153,6 @@ HICON WINAPI CreateIconFromResourceEx( LPBYTE bits, UINT cbSize, { POINT hotspot; BITMAPINFO *bmi; - HICON icon;
TRACE_(cursor)("%p (%u bytes), ver %08x, %ix%i %s %s\n", bits, cbSize, dwVersion, width, height, @@ -1157,6 +1160,12 @@ HICON WINAPI CreateIconFromResourceEx( LPBYTE bits, UINT cbSize,
if (!bits) return 0;
+ if (dwVersion == 0x00020000) + { + FIXME_(cursor)("\t2.xx resources are not supported\n"); + return 0; + } + if (bIcon) { hotspot.x = width / 2; @@ -1171,10 +1180,7 @@ HICON WINAPI CreateIconFromResourceEx( LPBYTE bits, UINT cbSize, bmi = (BITMAPINFO *)(pt + 2); }
- icon = CURSORICON_CreateIconFromBMI( bmi, hotspot, bIcon, dwVersion, - width, height, cFlag ); - if (icon) USER_Driver->pCreateCursorIcon( icon ); - return icon; + return CURSORICON_CreateIconFromBMI( bmi, NULL, NULL, hotspot, bIcon, width, height, cFlag ); }
@@ -1236,13 +1242,11 @@ static HICON CURSORICON_LoadFromFile( LPCWSTR filename,
hotspot.x = entry->xHotspot; hotspot.y = entry->yHotspot; - hIcon = CURSORICON_CreateIconFromBMI( (BITMAPINFO *)&bits[entry->dwDIBOffset], - hotspot, !fCursor, 0x00030000, - width, height, loadflags ); + hIcon = CURSORICON_CreateIconFromBMI( (BITMAPINFO *)&bits[entry->dwDIBOffset], NULL, NULL, + hotspot, !fCursor, width, height, loadflags ); end: TRACE("loaded %s -> %p\n", debugstr_w( filename ), hIcon ); UnmapViewOfFile( bits ); - if (hIcon) USER_Driver->pCreateCursorIcon( hIcon ); return hIcon; }
@@ -1263,6 +1267,7 @@ static HICON CURSORICON_Load(HINSTANCE hInstance, LPCWSTR name, LPBYTE bits; WORD wResId; DWORD dwBytesInRes; + POINT hotspot;
TRACE("%p, %s, %dx%d, depth %d, fCursor %d, flags 0x%04x\n", hInstance, debugstr_w(name), width, height, depth, fCursor, loadflags); @@ -1307,8 +1312,21 @@ static HICON CURSORICON_Load(HINSTANCE hInstance, LPCWSTR name,
if (!(handle = LoadResource( hInstance, hRsrc ))) return 0; bits = LockResource( handle ); - hIcon = CreateIconFromResourceEx( bits, dwBytesInRes, - !fCursor, 0x00030000, width, height, loadflags); + + if (!fCursor) + { + hotspot.x = width / 2; + hotspot.y = height / 2; + } + else /* get the hotspot */ + { + SHORT *pt = (SHORT *)bits; + hotspot.x = pt[0]; + hotspot.y = pt[1]; + bits += 2 * sizeof(SHORT); + } + hIcon = CURSORICON_CreateIconFromBMI( (BITMAPINFO *)bits, hInstance, name, hotspot, + !fCursor, width, height, loadflags ); FreeResource( handle );
/* If shared icon, add to icon cache */