shell32: fix handle link overlay flags
Martin Fuchs
martin-fuchs at gmx.net
Sun Nov 20 04:27:18 CST 2005
Changelog:
- SHGetFileInfoW(): handle SHGFI_LINKOVERLAY and SHGFI_OVERLAYINDEX
- SHMapPIDLToSystemImageListIndex(): determine overlay flag for PidlToSicIndex() and return -1 in error cases
Index: iconcache.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/iconcache.c,v
retrieving revision 1.95
diff -u -p -d -r1.95 iconcache.c
--- iconcache.c 27 Oct 2005 12:08:44 -0000 1.95
+++ iconcache.c 20 Nov 2005 10:24:49 -0000
@@ -481,29 +481,15 @@ BOOL PidlToSicIndex (
{
IExtractIconW *ei;
WCHAR szIconFile[MAX_PATH]; /* file containing the icon */
- char szTemp[MAX_PATH];
INT iSourceIndex; /* index or resID(negated) in this file */
BOOL ret = FALSE;
UINT dwFlags = 0;
- HKEY keyCls;
int iShortcutDefaultIndex = INVALID_INDEX;
TRACE("sf=%p pidl=%p %s\n", sh, pidl, bBigIcon?"Big":"Small");
if (SUCCEEDED (IShellFolder_GetUIObjectOf(sh, 0, 1, &pidl, &IID_IExtractIconW, 0, (void **)&ei)))
{
- if (_ILGetExtension(pidl, szTemp, MAX_PATH) &&
- HCR_MapTypeToValueA(szTemp, szTemp, MAX_PATH, TRUE))
- {
- if (ERROR_SUCCESS == RegOpenKeyExA(HKEY_CLASSES_ROOT, szTemp, 0, KEY_QUERY_VALUE, &keyCls))
- {
- if (ERROR_SUCCESS == RegQueryValueExA(keyCls, "IsShortcut", NULL, NULL, NULL, NULL))
- {
- uFlags |= GIL_FORSHORTCUT;
- }
- RegCloseKey(keyCls);
- }
- }
if (SUCCEEDED(IExtractIconW_GetIconLocation(ei, uFlags, szIconFile, MAX_PATH, &iSourceIndex, &dwFlags)))
{
*pIndex = SIC_GetIconIndex(szIconFile, iSourceIndex, uFlags);
@@ -547,13 +533,32 @@ int WINAPI SHMapPIDLToSystemImageListInd
int *pIndex)
{
int Index;
+ char szTemp[MAX_PATH];
+ HKEY keyCls;
+ UINT uGilFlags = 0;
TRACE("(SF=%p,pidl=%p,%p)\n",sh,pidl,pIndex);
pdump(pidl);
+ if (_ILGetExtension(pidl, szTemp, MAX_PATH) &&
+ HCR_MapTypeToValueA(szTemp, szTemp, MAX_PATH, TRUE))
+ {
+ if (ERROR_SUCCESS == RegOpenKeyExA(HKEY_CLASSES_ROOT, szTemp, 0, KEY_QUERY_VALUE, &keyCls))
+ {
+ if (ERROR_SUCCESS == RegQueryValueExA(keyCls, "IsShortcut", NULL, NULL, NULL, NULL))
+ uGilFlags |= GIL_FORSHORTCUT;
+
+ RegCloseKey(keyCls);
+ }
+ }
+
if (pIndex)
- PidlToSicIndex ( sh, pidl, 1, 0, pIndex);
- PidlToSicIndex ( sh, pidl, 0, 0, &Index);
+ if (!PidlToSicIndex ( sh, pidl, 1, uGilFlags, pIndex))
+ *pIndex = -1;
+
+ if (!PidlToSicIndex ( sh, pidl, 0, uGilFlags, &Index))
+ return -1;
+
return Index;
}
Index: shell32_main.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shell32_main.c,v
retrieving revision 1.156
diff -u -p -d -r1.156 shell32_main.c
--- shell32_main.c 2 Sep 2005 11:32:18 -0000 1.156
+++ shell32_main.c 20 Nov 2005 10:24:50 -0000
@@ -320,6 +320,9 @@ DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR
LPITEMIDLIST pidlLast = NULL, pidl = NULL;
HRESULT hr = S_OK;
BOOL IconNotYetLoaded=TRUE;
+ UINT uGilFlags = 0;
+ char szTemp[MAX_PATH];
+ HKEY keyCls;
TRACE("%s fattr=0x%lx sfi=%p(attr=0x%08lx) size=0x%x flags=0x%x\n",
(flags & SHGFI_PIDL)? "pidl" : debugstr_w(path), dwFileAttributes,
@@ -458,15 +461,26 @@ DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR
}
/* ### icons ###*/
- if (flags & SHGFI_ADDOVERLAYS)
- FIXME("SHGFI_ADDOVERLAYS unhandled\n");
-
- if (flags & SHGFI_OVERLAYINDEX)
- FIXME("SHGFI_OVERLAYINDEX unhandled\n");
-
- if (flags & SHGFI_LINKOVERLAY)
- FIXME("set icon to link, stub\n");
+ if (flags & SHGFI_LINKOVERLAY)
+ uGilFlags |= GIL_FORSHORTCUT;
+ else if (flags & SHGFI_ADDOVERLAYS)
+ {
+ if (_ILGetExtension(pidlLast, szTemp, MAX_PATH) &&
+ HCR_MapTypeToValueA(szTemp, szTemp, MAX_PATH, TRUE))
+ {
+ if (ERROR_SUCCESS == RegOpenKeyExA(HKEY_CLASSES_ROOT, szTemp, 0, KEY_QUERY_VALUE, &keyCls))
+ {
+ if (ERROR_SUCCESS == RegQueryValueExA(keyCls, "IsShortcut", NULL, NULL, NULL, NULL))
+ uGilFlags |= GIL_FORSHORTCUT;
+
+ RegCloseKey(keyCls);
+ }
+ }
+ }
+ if (flags & SHGFI_OVERLAYINDEX)
+ FIXME("SHGFI_OVERLAYINDEX unhandled\n");
+
if (flags & SHGFI_SELECTED)
FIXME("set icon to selected, stub\n");
More information about the wine-patches
mailing list