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