From 69a485aba7cc03e9d093b8deb2a0b58f285c0bcd Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Tue, 18 Nov 2003 19:59:51 +0000 Subject: [PATCH] added LR_SHARED flag support for LoadIcon() and LoadCursor() svn path=/trunk/; revision=6689 --- reactos/lib/user32/windows/bitmap.c | 66 ++++++++++++++++------ reactos/lib/user32/windows/cursor.c | 6 +- reactos/lib/user32/windows/icon.c | 11 +++- reactos/subsys/win32k/objects/cursoricon.c | 56 ++++++++++++------ 4 files changed, 100 insertions(+), 39 deletions(-) diff --git a/reactos/lib/user32/windows/bitmap.c b/reactos/lib/user32/windows/bitmap.c index 73b1666c6f9..1c375bdb056 100644 --- a/reactos/lib/user32/windows/bitmap.c +++ b/reactos/lib/user32/windows/bitmap.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: bitmap.c,v 1.19 2003/11/10 17:44:49 weiden Exp $ +/* $Id: bitmap.c,v 1.20 2003/11/18 19:59:50 weiden Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/input.c @@ -80,6 +80,7 @@ LoadCursorImage(HINSTANCE hinst, LPCWSTR lpszName, UINT fuLoad) { HANDLE hResource; HANDLE h2Resource; + HANDLE hfRes; HANDLE hFile; HANDLE hSection; CURSORICONDIR* IconDIR; @@ -93,21 +94,25 @@ LoadCursorImage(HINSTANCE hinst, LPCWSTR lpszName, UINT fuLoad) GRPCURSORICONDIR* IconResDir; INT id; ICONIMAGE *ResIcon; - - if (fuLoad & LR_SHARED) - DbgPrint("FIXME: need LR_SHARED support Loading cursor images\n"); - + if (!(fuLoad & LR_LOADFROMFILE)) { if (hinst == NULL) { hinst = GetModuleHandleW(L"USER32"); } - hResource = FindResourceW(hinst, lpszName, RT_GROUP_CURSOR); + hResource = hfRes = FindResourceW(hinst, lpszName, RT_GROUP_CURSOR); if (hResource == NULL) { return(NULL); } + + if (fuLoad & LR_SHARED) + { + hIcon = (HANDLE)NtUserFindExistingCursorIcon(hinst, (HRSRC)hfRes); + if(hIcon) + return hIcon; + } hResource = LoadResource(hinst, hResource); if (hResource == NULL) @@ -139,12 +144,23 @@ LoadCursorImage(HINSTANCE hinst, LPCWSTR lpszName, UINT fuLoad) { return(NULL); } - return CreateIconFromResourceEx((PBYTE) ResIcon, - SizeofResource(hinst, h2Resource), FALSE, 0x00030000, - 32, 32, fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME)); + hIcon = (HANDLE)CreateIconFromResourceEx((PBYTE) ResIcon, + SizeofResource(hinst, h2Resource), FALSE, 0x00030000, + 32, 32, fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME)); + if(hIcon) + { + NtUserSetCursorIconData((HICON)hIcon, NULL, NULL, hinst, (HRSRC)hfRes, + (HRSRC)NULL); + } + return hIcon; } else { + if (fuLoad & LR_SHARED) + { + DbgPrint("FIXME: need LR_SHARED support loading cursor images from files\n"); + } + hFile = CreateFileW(lpszName, GENERIC_READ, FILE_SHARE_READ, @@ -246,6 +262,7 @@ LoadIconImage(HINSTANCE hinst, LPCWSTR lpszName, INT width, INT height, UINT fuL { HANDLE hResource; HANDLE h2Resource; + HANDLE hfRes; HANDLE hFile; HANDLE hSection; CURSORICONDIR* IconDIR; @@ -259,21 +276,25 @@ LoadIconImage(HINSTANCE hinst, LPCWSTR lpszName, INT width, INT height, UINT fuL GRPCURSORICONDIR* IconResDir; INT id; ICONIMAGE *ResIcon; - - if (fuLoad & LR_SHARED) - DbgPrint("FIXME: need LR_SHARED support Loading icon images\n"); - + if (!(fuLoad & LR_LOADFROMFILE)) { if (hinst == NULL) { hinst = GetModuleHandleW(L"USER32"); } - hResource = FindResourceW(hinst, lpszName, RT_GROUP_ICON); + hResource = hfRes = FindResourceW(hinst, lpszName, RT_GROUP_ICON); if (hResource == NULL) { return(NULL); } + + if (fuLoad & LR_SHARED) + { + hIcon = NtUserFindExistingCursorIcon(hinst, (HRSRC)hfRes); + if(hIcon) + return hIcon; + } hResource = LoadResource(hinst, hResource); if (hResource == NULL) @@ -305,12 +326,23 @@ LoadIconImage(HINSTANCE hinst, LPCWSTR lpszName, INT width, INT height, UINT fuL { return(NULL); } - return CreateIconFromResourceEx((PBYTE) ResIcon, - SizeofResource(hinst, h2Resource), TRUE, 0x00030000, - width, height, fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME)); + hIcon = (HANDLE)CreateIconFromResourceEx((PBYTE) ResIcon, + SizeofResource(hinst, h2Resource), TRUE, 0x00030000, + width, height, fuLoad & (LR_DEFAULTCOLOR | LR_MONOCHROME)); + if(hIcon) + { + NtUserSetCursorIconData((HICON)hIcon, NULL, NULL, hinst, (HRSRC)hfRes, + (HRSRC)NULL); + } + return hIcon; } else { + if (fuLoad & LR_SHARED) + { + DbgPrint("FIXME: need LR_SHARED support for loading icon images from files\n"); + } + hFile = CreateFileW(lpszName, GENERIC_READ, FILE_SHARE_READ, diff --git a/reactos/lib/user32/windows/cursor.c b/reactos/lib/user32/windows/cursor.c index 720d58f3db2..98902f75c63 100644 --- a/reactos/lib/user32/windows/cursor.c +++ b/reactos/lib/user32/windows/cursor.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: cursor.c,v 1.14 2003/11/10 17:44:49 weiden Exp $ +/* $Id: cursor.c,v 1.15 2003/11/18 19:59:51 weiden Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/cursor.c @@ -176,7 +176,7 @@ LoadCursorA(HINSTANCE hInstance, LPCSTR lpCursorName) { return(LoadImageA(hInstance, lpCursorName, IMAGE_CURSOR, 0, 0, - LR_DEFAULTSIZE)); + LR_SHARED | LR_DEFAULTSIZE)); } @@ -215,7 +215,7 @@ LoadCursorW(HINSTANCE hInstance, LPCWSTR lpCursorName) { return(LoadImageW(hInstance, lpCursorName, IMAGE_CURSOR, 0, 0, - LR_DEFAULTSIZE)); + LR_SHARED | LR_DEFAULTSIZE)); } diff --git a/reactos/lib/user32/windows/icon.c b/reactos/lib/user32/windows/icon.c index 207bb56ce5a..c0969457651 100644 --- a/reactos/lib/user32/windows/icon.c +++ b/reactos/lib/user32/windows/icon.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: icon.c,v 1.13 2003/11/10 17:44:49 weiden Exp $ +/* $Id: icon.c,v 1.14 2003/11/18 19:59:51 weiden Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/icon.c @@ -242,6 +242,15 @@ CreateIconFromResourceEx( HDC hScreenDc; WORD wXHotspot; WORD wYHotspot; + + /* + FIXME - does win support LR_SHARED? According to msdn it does but we don't + have useful information to identify the icon + if (uFlags & LR_SHARED) + { + DbgPrint("FIXME: need LR_SHARED support in CreateIconFromResourceEx()\n"); + } + */ DPRINT("dwVersion, cxDesired, cyDesired are all ignored in this implementation!\n"); diff --git a/reactos/subsys/win32k/objects/cursoricon.c b/reactos/subsys/win32k/objects/cursoricon.c index ead6241463c..a4f7b3c1e0e 100644 --- a/reactos/subsys/win32k/objects/cursoricon.c +++ b/reactos/subsys/win32k/objects/cursoricon.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: cursoricon.c,v 1.19 2003/11/15 12:43:25 weiden Exp $ */ +/* $Id: cursoricon.c,v 1.20 2003/11/18 19:59:51 weiden Exp $ */ #undef WIN32_LEAN_AND_MEAN @@ -469,8 +469,8 @@ NtUserCreateCursorIconHandle(PICONINFO IconInfo, BOOL Indirect) CurIconObject->IconInfo.hbmMask = IntCopyBitmap(CurIconObject->IconInfo.hbmMask); CurIconObject->IconInfo.hbmColor = IntCopyBitmap(CurIconObject->IconInfo.hbmColor); } - bmp = BITMAPOBJ_LockBitmap(CurIconObject->IconInfo.hbmColor); - if(bmp) + if(CurIconObject->IconInfo.hbmColor && + (bmp = BITMAPOBJ_LockBitmap(CurIconObject->IconInfo.hbmColor))) { CurIconObject->Size.cx = bmp->size.cx; CurIconObject->Size.cy = bmp->size.cy; @@ -478,8 +478,8 @@ NtUserCreateCursorIconHandle(PICONINFO IconInfo, BOOL Indirect) } else { - bmp = BITMAPOBJ_LockBitmap(CurIconObject->IconInfo.hbmMask); - if(bmp) + if(CurIconObject->IconInfo.hbmMask && + (bmp = BITMAPOBJ_LockBitmap(CurIconObject->IconInfo.hbmMask))) { CurIconObject->Size.cx = bmp->size.cx; CurIconObject->Size.cy = bmp->size.cy / 2; @@ -830,7 +830,7 @@ NtUserFindExistingCursorIcon( ObDereferenceObject(WinStaObject); return Ret; } - + SetLastWin32Error(ERROR_INVALID_CURSOR_HANDLE); ObDereferenceObject(WinStaObject); return (HICON)0; @@ -1036,26 +1036,46 @@ NtUserSetCursorIconData( if(CurIconObject) { /* Copy fields */ - Status = MmCopyFromCaller(&CurIconObject->IconInfo.fIcon, fIcon, sizeof(BOOL)); - if(!NT_SUCCESS(Status)) + if(fIcon) { - SetLastNtError(Status); - goto done; + Status = MmCopyFromCaller(&CurIconObject->IconInfo.fIcon, fIcon, sizeof(BOOL)); + if(!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + goto done; + } } - Status = MmCopyFromCaller(&SafeHotspot, Hotspot, sizeof(POINT)); - if(NT_SUCCESS(Status)) + else + { + if(!Hotspot) + Ret = TRUE; + } + + if(Hotspot) + { + Status = MmCopyFromCaller(&SafeHotspot, Hotspot, sizeof(POINT)); + if(NT_SUCCESS(Status)) + { + CurIconObject->IconInfo.xHotspot = SafeHotspot.x; + CurIconObject->IconInfo.yHotspot = SafeHotspot.y; + + CurIconObject->hModule = hModule; + CurIconObject->hRsrc = hRsrc; + CurIconObject->hGroupRsrc = hGroupRsrc; + + Ret = TRUE; + } + else + SetLastNtError(Status); + } + + if(!fIcon && !Hotspot) { - CurIconObject->IconInfo.xHotspot = SafeHotspot.x; - CurIconObject->IconInfo.yHotspot = SafeHotspot.y; - CurIconObject->hModule = hModule; CurIconObject->hRsrc = hRsrc; CurIconObject->hGroupRsrc = hGroupRsrc; - Ret = TRUE; } - else - SetLastNtError(Status); done: IntReleaseCurIconObject(WinStaObject);