shell32 shortcut drawing

Ge van Geldorp gvg at reactos.com
Fri May 13 02:11:11 CDT 2005


Changelog:
  Ge van Geldorp <gvg at reactos.com>
  Overlay icons for .lnk files with a small arrow in the lower left corner

Index: tools/wine.inf
===================================================================
RCS file: /home/wine/wine/tools/wine.inf,v
retrieving revision 1.32
diff -u -r1.32 wine.inf
--- tools/wine.inf	18 Apr 2005 16:54:44 -0000	1.32
+++ tools/wine.inf	13 May 2005 07:05:42 -0000
@@ -69,6 +69,7 @@
 HKCR,.jpe,"Content Type",,"image/jpeg"
 HKCR,.jpeg,"Content Type",,"image/jpeg"
 HKCR,.jpg,"Content Type",,"image/jpeg"
+HKCR,.lnk,,,"lnkfile"
 HKCR,.msi,,,"Msi.Package" 
 HKCR,.png,"Content Type",,"image/png"
 HKCR,.tif,"Content Type",,"image/tiff"
@@ -84,6 +85,10 @@
 HKCR,folder\shell\open\ddeexec,"NoActivateHandler",,""
 HKCR,folder\shell\open\ddeexec\application,,,"Folders"
 HKCR,htmlfile\shell\open\command,,,"winebrowser %1"
+HKCR,lnkfile,"NeverShowExt",,""
+HKCR,lnkfile,"IsShortcut",,"yes"
+HKCR,lnkfile\CLSID,,,"{00021401-0000-0000-C000-000000000046}"
+HKCR,lnkfile\shellex\IconHandler,,,"{00021401-0000-0000-C000-000000000046}"
 HKCR,Msi.Package\DefaultIcon,,,"msiexec.exe"
 HKCR,Msi.Package\shell\Open\command,,,"msiexec /i %1"
 HKCR,Msi.Package\shell\Repair\command,,,"msiexec /f %1"
Index: dlls/shell32/.cvsignore
===================================================================
RCS file: /home/wine/wine/dlls/shell32/.cvsignore,v
retrieving revision 1.22
diff -u -r1.22 .cvsignore
--- dlls/shell32/.cvsignore	7 May 2005 12:39:53 -0000	1.22
+++ dlls/shell32/.cvsignore	13 May 2005 07:05:42 -0000
@@ -13,6 +13,7 @@
 netdrive2.ico
 printer.ico
 ramdisk.ico
+shortcut.ico
 shell.spec.c
 shell32.dll.dbg.c
 shres.res
Index: dlls/shell32/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/shell32/Makefile.in,v
retrieving revision 1.90
diff -u -r1.90 Makefile.in
--- dlls/shell32/Makefile.in	9 May 2005 14:42:31 -0000	1.90
+++ dlls/shell32/Makefile.in	13 May 2005 07:05:42 -0000
@@ -64,7 +64,8 @@
 	netdrive.ico \
 	netdrive2.ico \
 	printer.ico \
-	ramdisk.ico
+	ramdisk.ico \
+	shortcut.ico
 
 C_SRCS16  = shell.c
 RC_SRCS16 = version16.rc
Index: dlls/shell32/folders.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/folders.c,v
retrieving revision 1.60
diff -u -r1.60 folders.c
--- dlls/shell32/folders.c	6 May 2005 19:32:54 -0000	1.60
+++ dlls/shell32/folders.c	13 May 2005 07:05:42 -0000
@@ -385,7 +385,7 @@
 	FIXME("(%p) (file=%p index=%d %p %p size=%08x) semi-stub\n", This, debugstr_w(pszFile), (signed)nIconIndex,
               phiconLarge, phiconSmall, nIconSize);
 
-        index = SIC_GetIconIndex(pszFile, nIconIndex);
+        index = SIC_GetIconIndex(pszFile, nIconIndex, 0);
 
 	if (phiconLarge)
 	  *phiconLarge = ImageList_GetIcon(ShellBigIconList, index, ILD_TRANSPARENT);
Index: dlls/shell32/iconcache.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/iconcache.c,v
retrieving revision 1.87
diff -u -r1.87 iconcache.c
--- dlls/shell32/iconcache.c	11 Apr 2005 13:04:41 -0000	1.87
+++ dlls/shell32/iconcache.c	13 May 2005 07:05:42 -0000
@@ -43,6 +43,7 @@
 #include "pidl.h"
 #include "shell32_main.h"
 #include "undocshell.h"
+#include "shresdef.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(shell);
 
@@ -79,7 +80,8 @@
 static INT CALLBACK SIC_CompareEntries( LPVOID p1, LPVOID p2, LPARAM lparam)
 {	TRACE("%p %p %8lx\n", p1, p2, lparam);
 
-	if (((LPSIC_ENTRY)p1)->dwSourceIndex != ((LPSIC_ENTRY)p2)->dwSourceIndex) /* first the faster one*/
+	if (((LPSIC_ENTRY)p1)->dwSourceIndex != ((LPSIC_ENTRY)p2)->dwSourceIndex ||
+	    ((LPSIC_ENTRY)p1)->dwFlags != ((LPSIC_ENTRY)p2)->dwFlags) /* first the faster one*/
 	  return 1;
 
 	if (strcmpiW(((LPSIC_ENTRY)p1)->sSourceFile,((LPSIC_ENTRY)p2)->sSourceFile))
@@ -87,13 +89,148 @@
 
 	return 0;
 }
+
+/*****************************************************************************
+ * SIC_OverlayShortcutImage			[internal]
+ *
+ * NOTES
+ *  Creates a new icon as a copy of the passed-in icon, overlayed with a
+ *  shortcut image. 
+ */
+static HICON SIC_OverlayShortcutImage(HICON SourceIcon)
+{	ICONINFO SourceIconInfo, ShortcutIconInfo, TargetIconInfo;
+	HICON ShortcutIcon, TargetIcon;
+	BITMAP SourceBitmapInfo, ShortcutBitmapInfo;
+	HDC SourceDC = NULL,
+	  ShortcutDC = NULL,
+	  TargetDC = NULL,
+	  ScreenDC = NULL;
+	HBITMAP OldSourceBitmap = NULL,
+	  OldShortcutBitmap = NULL,
+	  OldTargetBitmap = NULL;
+
+	/* Get information about the source icon and shortcut overlay */
+	if (! GetIconInfo(SourceIcon, &SourceIconInfo)
+	    || 0 == GetObjectW(SourceIconInfo.hbmColor, sizeof(BITMAP), &SourceBitmapInfo))
+	{
+	  return NULL;
+	}
+	ShortcutIcon = LoadImageW(shell32_hInstance, MAKEINTRESOURCEW(IDI_SHELL_SHORTCUT),
+	                          IMAGE_ICON, SourceBitmapInfo.bmWidth, SourceBitmapInfo.bmWidth,
+	                          LR_SHARED);
+	if (NULL == ShortcutIcon
+	    || ! GetIconInfo(ShortcutIcon, &ShortcutIconInfo)
+	    || 0 == GetObjectW(ShortcutIconInfo.hbmColor, sizeof(BITMAP), &ShortcutBitmapInfo))
+	{
+	  return NULL;
+	}
+
+	TargetIconInfo = SourceIconInfo;
+	TargetIconInfo.hbmMask = NULL;
+	TargetIconInfo.hbmColor = NULL;
+
+	/* Setup the source, shortcut and target masks */
+	SourceDC = CreateCompatibleDC(NULL);
+	if (NULL == SourceDC) goto fail;
+	OldSourceBitmap = SelectObject(SourceDC, SourceIconInfo.hbmMask);
+	if (NULL == OldSourceBitmap) goto fail;
+
+	ShortcutDC = CreateCompatibleDC(NULL);
+	if (NULL == ShortcutDC) goto fail;
+	OldShortcutBitmap = SelectObject(ShortcutDC, ShortcutIconInfo.hbmMask);
+	if (NULL == OldShortcutBitmap) goto fail;
+
+	TargetDC = CreateCompatibleDC(NULL);
+	if (NULL == TargetDC) goto fail;
+	TargetIconInfo.hbmMask = CreateCompatibleBitmap(TargetDC, SourceBitmapInfo.bmWidth,
+	                                                SourceBitmapInfo.bmHeight);
+	if (NULL == TargetIconInfo.hbmMask) goto fail;
+	ScreenDC = GetDC(NULL);
+	if (NULL == ScreenDC) goto fail;
+	TargetIconInfo.hbmColor = CreateCompatibleBitmap(ScreenDC, SourceBitmapInfo.bmWidth,
+	                                                 SourceBitmapInfo.bmHeight);
+	ReleaseDC(NULL, ScreenDC);
+	if (NULL == TargetIconInfo.hbmColor) goto fail;
+	OldTargetBitmap = SelectObject(TargetDC, TargetIconInfo.hbmMask);
+	if (NULL == OldTargetBitmap) goto fail;
+
+	/* Create the target mask by ANDing the source and shortcut masks */
+	if (! BitBlt(TargetDC, 0, 0, SourceBitmapInfo.bmWidth, SourceBitmapInfo.bmHeight,
+	             SourceDC, 0, 0, SRCCOPY) ||
+	    ! BitBlt(TargetDC, 0, SourceBitmapInfo.bmHeight - ShortcutBitmapInfo.bmHeight,
+	             ShortcutBitmapInfo.bmWidth, ShortcutBitmapInfo.bmHeight,
+	             ShortcutDC, 0, 0, SRCAND))
+	{
+	  goto fail;
+	}
+
+	/* Setup the source and target xor bitmap */
+	if (NULL == SelectObject(SourceDC, SourceIconInfo.hbmColor) ||
+	    NULL == SelectObject(TargetDC, TargetIconInfo.hbmColor))
+	{
+	  goto fail;
+	}
+
+	/* Copy the source xor bitmap to the target and clear out part of it by using
+	   the shortcut mask */
+	if (! BitBlt(TargetDC, 0, 0, SourceBitmapInfo.bmWidth, SourceBitmapInfo.bmHeight,
+	             SourceDC, 0, 0, SRCCOPY) ||
+	    ! BitBlt(TargetDC, 0, SourceBitmapInfo.bmHeight - ShortcutBitmapInfo.bmHeight,
+	             ShortcutBitmapInfo.bmWidth, ShortcutBitmapInfo.bmHeight,
+	             ShortcutDC, 0, 0, SRCAND))
+	{
+	  goto fail;
+	}
+
+	if (NULL == SelectObject(ShortcutDC, ShortcutIconInfo.hbmColor)) goto fail;
+
+	/* Now put in the shortcut xor mask */
+	if (! BitBlt(TargetDC, 0, SourceBitmapInfo.bmHeight - ShortcutBitmapInfo.bmHeight,
+	             ShortcutBitmapInfo.bmWidth, ShortcutBitmapInfo.bmHeight,
+	             ShortcutDC, 0, 0, SRCINVERT))
+	{
+	  goto fail;
+	}
+
+	/* Clean up, we're not goto'ing to 'fail' after this so we can be lazy and not set
+	   handles to NULL */
+	SelectObject(TargetDC, OldTargetBitmap);
+	DeleteObject(TargetDC);
+	SelectObject(ShortcutDC, OldShortcutBitmap);
+	DeleteObject(ShortcutDC);
+	SelectObject(SourceDC, OldSourceBitmap);
+	DeleteObject(SourceDC);
+
+	/* Create the icon using the bitmaps prepared earlier */
+	TargetIcon = CreateIconIndirect(&TargetIconInfo);
+
+	/* CreateIconIndirect copies the bitmaps, so we can release our bitmaps now */
+	DeleteObject(TargetIconInfo.hbmColor);
+	DeleteObject(TargetIconInfo.hbmMask);
+
+	return TargetIcon;
+
+fail:
+	/* Clean up scratch resources we created */
+	if (NULL != OldTargetBitmap) SelectObject(TargetDC, OldTargetBitmap);
+	if (NULL != TargetIconInfo.hbmColor) DeleteObject(TargetIconInfo.hbmColor);
+	if (NULL != TargetIconInfo.hbmMask) DeleteObject(TargetIconInfo.hbmMask);
+	if (NULL != TargetDC) DeleteObject(TargetDC);
+	if (NULL != OldShortcutBitmap) SelectObject(ShortcutDC, OldShortcutBitmap);
+	if (NULL != ShortcutDC) DeleteObject(ShortcutDC);
+	if (NULL != OldSourceBitmap) SelectObject(SourceDC, OldSourceBitmap);
+	if (NULL != SourceDC) DeleteObject(SourceDC);
+
+	return NULL;
+}
+
 /*****************************************************************************
  * SIC_IconAppend			[internal]
  *
  * NOTES
  *  appends an icon pair to the end of the cache
  */
-static INT SIC_IconAppend (LPCWSTR sSourceFile, INT dwSourceIndex, HICON hSmallIcon, HICON hBigIcon)
+static INT SIC_IconAppend (LPCWSTR sSourceFile, INT dwSourceIndex, HICON hSmallIcon, HICON hBigIcon, DWORD dwFlags)
 {	LPSIC_ENTRY lpsice;
 	INT ret, index, index1;
 	WCHAR path[MAX_PATH];
@@ -101,11 +238,12 @@
 
 	lpsice = (LPSIC_ENTRY) SHAlloc (sizeof (SIC_ENTRY));
 
-       GetFullPathNameW(sSourceFile, MAX_PATH, path, NULL);
+	GetFullPathNameW(sSourceFile, MAX_PATH, path, NULL);
 	lpsice->sSourceFile = HeapAlloc( GetProcessHeap(), 0, (strlenW(path)+1)*sizeof(WCHAR) );
 	strcpyW( lpsice->sSourceFile, path );
 
 	lpsice->dwSourceIndex = dwSourceIndex;
+	lpsice->dwFlags = dwFlags;
 
 	EnterCriticalSection(&SHELL32_SicCS);
 
@@ -138,9 +276,11 @@
  * NOTES
  *  gets small/big icon by number from a file
  */
-static INT SIC_LoadIcon (LPCWSTR sSourceFile, INT dwSourceIndex)
+static INT SIC_LoadIcon (LPCWSTR sSourceFile, INT dwSourceIndex, DWORD dwFlags)
 {	HICON	hiconLarge=0;
 	HICON	hiconSmall=0;
+	HICON 	hiconLargeShortcut;
+	HICON	hiconSmallShortcut;
 
         PrivateExtractIconsW( sSourceFile, dwSourceIndex, 32, 32, &hiconLarge, 0, 1, 0 );
         PrivateExtractIconsW( sSourceFile, dwSourceIndex, 16, 16, &hiconSmall, 0, 1, 0 );
@@ -150,7 +290,26 @@
 	  WARN("failure loading icon %i from %s (%p %p)\n", dwSourceIndex, debugstr_w(sSourceFile), hiconLarge, hiconSmall);
 	  return -1;
 	}
-	return SIC_IconAppend (sSourceFile, dwSourceIndex, hiconSmall, hiconLarge);
+
+	if (0 != (dwFlags & GIL_FORSHORTCUT))
+	{
+	  hiconLargeShortcut = SIC_OverlayShortcutImage(hiconLarge);
+	  hiconSmallShortcut = SIC_OverlayShortcutImage(hiconSmall);
+	  if (NULL != hiconLargeShortcut && NULL != hiconSmallShortcut)
+	  {
+	    hiconLarge = hiconLargeShortcut;
+	    hiconSmall = hiconSmallShortcut;
+	  }
+	  else
+	  {
+	    WARN("Failed to create shortcut overlayed icons\n");
+	    if (NULL != hiconLargeShortcut) DestroyIcon(hiconLargeShortcut);
+	    if (NULL != hiconSmallShortcut) DestroyIcon(hiconSmallShortcut);
+	    dwFlags &= ~ GIL_FORSHORTCUT;
+	  }
+	}
+
+	return SIC_IconAppend (sSourceFile, dwSourceIndex, hiconSmall, hiconLarge, dwFlags);
 }
 /*****************************************************************************
  * SIC_GetIconIndex			[internal]
@@ -163,7 +322,7 @@
  *  look in the cache for a proper icon. if not available the icon is taken
  *  from the file and cached
  */
-INT SIC_GetIconIndex (LPCWSTR sSourceFile, INT dwSourceIndex )
+INT SIC_GetIconIndex (LPCWSTR sSourceFile, INT dwSourceIndex, DWORD dwFlags )
 {
 	SIC_ENTRY sice;
 	INT ret, index = INVALID_INDEX;
@@ -174,6 +333,7 @@
 	GetFullPathNameW(sSourceFile, MAX_PATH, path, NULL);
 	sice.sSourceFile = path;
 	sice.dwSourceIndex = dwSourceIndex;
+	sice.dwFlags = dwFlags;
 
 	EnterCriticalSection(&SHELL32_SicCS);
 
@@ -185,7 +345,7 @@
 
 	if ( INVALID_INDEX == index )
 	{
-	  ret = SIC_LoadIcon (sSourceFile, dwSourceIndex);
+	  ret = SIC_LoadIcon (sSourceFile, dwSourceIndex, dwFlags);
 	}
 	else
 	{
@@ -243,8 +403,8 @@
 	    hSm = LoadImageA(shell32_hInstance, MAKEINTRESOURCEA(1), IMAGE_ICON, cx_small, cy_small, LR_SHARED);
 	    hLg = LoadImageA(shell32_hInstance, MAKEINTRESOURCEA(1), IMAGE_ICON, cx_large, cy_large, LR_SHARED);
 	  }
-         SIC_IconAppend (swShell32Name, index - 1, hSm, hLg);
-         SIC_IconAppend (swShell32Name, -index, hSm, hLg);
+         SIC_IconAppend (swShell32Name, index - 1, hSm, hLg, 0);
+         SIC_IconAppend (swShell32Name, -index, hSm, hLg, 0);
 	}
 
 	TRACE("hIconSmall=%p hIconBig=%p\n",ShellSmallIconList, ShellBigIconList);
@@ -319,24 +479,52 @@
 {
 	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);
+	    *pIndex = SIC_GetIconIndex(szIconFile, iSourceIndex, uFlags);
 	    ret = TRUE;
 	  }
 	  IExtractIconW_Release(ei);
 	}
 
 	if (INVALID_INDEX == *pIndex)	/* default icon when failed */
-	  *pIndex = 0;
+	{
+	  if (0 == (uFlags & GIL_FORSHORTCUT))
+	  {
+	    *pIndex = 0;
+	  }
+	  else
+	  {
+	    if (INVALID_INDEX == iShortcutDefaultIndex)
+	    {
+	      iShortcutDefaultIndex = SIC_LoadIcon(swShell32Name, 0, GIL_FORSHORTCUT);
+	    }
+	    *pIndex = (INVALID_INDEX != iShortcutDefaultIndex ? iShortcutDefaultIndex : 0);
+	  }
+	}
 
 	return ret;
 
@@ -382,7 +570,7 @@
 	szTemp = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
 	MultiByteToWideChar( CP_ACP, 0, szPath, -1, szTemp, len );
 
-	ret = SIC_GetIconIndex( szTemp, nIndex );
+	ret = SIC_GetIconIndex( szTemp, nIndex, 0 );
 
 	HeapFree( GetProcessHeap(), 0, szTemp );
 
@@ -393,7 +581,7 @@
 {
 	WARN("(%s,%08x,%08x) semi-stub.\n",debugstr_w(szPath), nIndex, bSimulateDoc);
 
-	return SIC_GetIconIndex(szPath, nIndex);
+	return SIC_GetIconIndex(szPath, nIndex, 0);
 }
 
 INT WINAPI Shell_GetCachedImageIndexAW(LPCVOID szPath, INT nIndex, BOOL bSimulateDoc)
Index: dlls/shell32/shell32_main.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shell32_main.c,v
retrieving revision 1.149
diff -u -r1.149 shell32_main.c
--- dlls/shell32/shell32_main.c	12 May 2005 09:56:48 -0000	1.149
+++ dlls/shell32/shell32_main.c	13 May 2005 07:05:42 -0000
@@ -506,7 +506,7 @@
             lstrcpynW(sTemp, szFullPath, MAX_PATH);
 
             if (dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
-                psfi->iIcon = SIC_GetIconIndex(swShell32Name, -IDI_SHELL_FOLDER);
+                psfi->iIcon = SIC_GetIconIndex(swShell32Name, -IDI_SHELL_FOLDER, 0);
             else
             {
                 static const WCHAR p1W[] = {'%','1',0};
@@ -522,7 +522,7 @@
 
                     if (flags & SHGFI_SYSICONINDEX) 
                     {
-                        psfi->iIcon = SIC_GetIconIndex(sTemp,dwNr);
+                        psfi->iIcon = SIC_GetIconIndex(sTemp,dwNr,0);
                         if (psfi->iIcon == -1)
                             psfi->iIcon = 0;
                     }
Index: dlls/shell32/shell32_main.h
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shell32_main.h,v
retrieving revision 1.95
diff -u -r1.95 shell32_main.h
--- dlls/shell32/shell32_main.h	19 Mar 2005 17:08:52 -0000	1.95
+++ dlls/shell32/shell32_main.h	13 May 2005 07:05:43 -0000
@@ -53,7 +53,7 @@
 BOOL SIC_Initialize(void);
 void SIC_Destroy(void);
 BOOL PidlToSicIndex (IShellFolder * sh, LPCITEMIDLIST pidl, BOOL bBigIcon, UINT uFlags, int * pIndex);
-INT SIC_GetIconIndex (LPCWSTR sSourceFile, INT dwSourceIndex );
+INT SIC_GetIconIndex (LPCWSTR sSourceFile, INT dwSourceIndex, DWORD dwFlags );
 
 /* Classes Root */
 BOOL HCR_MapTypeToValueW(LPCWSTR szExtension, LPWSTR szFileType, DWORD len, BOOL bPrependDot);
Index: dlls/shell32/shres.rc
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shres.rc,v
retrieving revision 1.39
diff -u -r1.39 shres.rc
--- dlls/shell32/shres.rc	9 May 2005 09:25:28 -0000	1.39
+++ dlls/shell32/shres.rc	13 May 2005 07:05:49 -0000
@@ -10053,6 +10053,171 @@
  '00 00 FF FF 00 00'
 } */
 
+/* BINRES shortcut.ico */
+IDI_SHELL_SHORTCUT ICON shortcut.ico
+/* {
+ '00 00 01 00 02 00 20 20 00 00 00 00 00 00 A8 08'
+ '00 00 26 00 00 00 10 10 10 00 00 00 00 00 28 01'
+ '00 00 CE 08 00 00 28 00 00 00 20 00 00 00 40 00'
+ '00 00 01 00 08 00 00 00 00 00 00 04 00 00 00 00'
+ '00 00 00 00 00 00 00 01 00 00 00 01 00 00 00 00'
+ '00 00 00 00 80 00 00 80 00 00 00 80 80 00 80 00'
+ '00 00 80 00 80 00 80 80 00 00 C0 C0 C0 00 C0 DC'
+ 'C0 00 F0 CA A6 00 04 04 04 00 08 08 08 00 0C 0C'
+ '0C 00 11 11 11 00 16 16 16 00 1C 1C 1C 00 22 22'
+ '22 00 29 29 29 00 55 55 55 00 4D 4D 4D 00 42 42'
+ '42 00 39 39 39 00 80 7C FF 00 50 50 FF 00 93 00'
+ 'D6 00 FF EC CC 00 C6 D6 EF 00 D6 E7 E7 00 90 A9'
+ 'AD 00 00 00 33 00 00 00 66 00 00 00 99 00 00 00'
+ 'CC 00 00 33 00 00 00 33 33 00 00 33 66 00 00 33'
+ '99 00 00 33 CC 00 00 33 FF 00 00 66 00 00 00 66'
+ '33 00 00 66 66 00 00 66 99 00 00 66 CC 00 00 66'
+ 'FF 00 00 99 00 00 00 99 33 00 00 99 66 00 00 99'
+ '99 00 00 99 CC 00 00 99 FF 00 00 CC 00 00 00 CC'
+ '33 00 00 CC 66 00 00 CC 99 00 00 CC CC 00 00 CC'
+ 'FF 00 00 FF 66 00 00 FF 99 00 00 FF CC 00 33 00'
+ '00 00 33 00 33 00 33 00 66 00 33 00 99 00 33 00'
+ 'CC 00 33 00 FF 00 33 33 00 00 33 33 33 00 33 33'
+ '66 00 33 33 99 00 33 33 CC 00 33 33 FF 00 33 66'
+ '00 00 33 66 33 00 33 66 66 00 33 66 99 00 33 66'
+ 'CC 00 33 66 FF 00 33 99 00 00 33 99 33 00 33 99'
+ '66 00 33 99 99 00 33 99 CC 00 33 99 FF 00 33 CC'
+ '00 00 33 CC 33 00 33 CC 66 00 33 CC 99 00 33 CC'
+ 'CC 00 33 CC FF 00 33 FF 33 00 33 FF 66 00 33 FF'
+ '99 00 33 FF CC 00 33 FF FF 00 66 00 00 00 66 00'
+ '33 00 66 00 66 00 66 00 99 00 66 00 CC 00 66 00'
+ 'FF 00 66 33 00 00 66 33 33 00 66 33 66 00 66 33'
+ '99 00 66 33 CC 00 66 33 FF 00 66 66 00 00 66 66'
+ '33 00 66 66 66 00 66 66 99 00 66 66 CC 00 66 99'
+ '00 00 66 99 33 00 66 99 66 00 66 99 99 00 66 99'
+ 'CC 00 66 99 FF 00 66 CC 00 00 66 CC 33 00 66 CC'
+ '99 00 66 CC CC 00 66 CC FF 00 66 FF 00 00 66 FF'
+ '33 00 66 FF 99 00 66 FF CC 00 CC 00 FF 00 FF 00'
+ 'CC 00 99 99 00 00 99 33 99 00 99 00 99 00 99 00'
+ 'CC 00 99 00 00 00 99 33 33 00 99 00 66 00 99 33'
+ 'CC 00 99 00 FF 00 99 66 00 00 99 66 33 00 99 33'
+ '66 00 99 66 99 00 99 66 CC 00 99 33 FF 00 99 99'
+ '33 00 99 99 66 00 99 99 99 00 99 99 CC 00 99 99'
+ 'FF 00 99 CC 00 00 99 CC 33 00 66 CC 66 00 99 CC'
+ '99 00 99 CC CC 00 99 CC FF 00 99 FF 00 00 99 FF'
+ '33 00 99 CC 66 00 99 FF 99 00 99 FF CC 00 99 FF'
+ 'FF 00 CC 00 00 00 99 00 33 00 CC 00 66 00 CC 00'
+ '99 00 CC 00 CC 00 99 33 00 00 CC 33 33 00 CC 33'
+ '66 00 CC 33 99 00 CC 33 CC 00 CC 33 FF 00 CC 66'
+ '00 00 CC 66 33 00 99 66 66 00 CC 66 99 00 CC 66'
+ 'CC 00 99 66 FF 00 CC 99 00 00 CC 99 33 00 CC 99'
+ '66 00 CC 99 99 00 CC 99 CC 00 CC 99 FF 00 CC CC'
+ '00 00 CC CC 33 00 CC CC 66 00 CC CC 99 00 CC CC'
+ 'CC 00 CC CC FF 00 CC FF 00 00 CC FF 33 00 99 FF'
+ '66 00 CC FF 99 00 CC FF CC 00 CC FF FF 00 CC 00'
+ '33 00 FF 00 66 00 FF 00 99 00 CC 33 00 00 FF 33'
+ '33 00 FF 33 66 00 FF 33 99 00 FF 33 CC 00 FF 33'
+ 'FF 00 FF 66 00 00 FF 66 33 00 CC 66 66 00 FF 66'
+ '99 00 FF 66 CC 00 CC 66 FF 00 FF 99 00 00 FF 99'
+ '33 00 FF 99 66 00 FF 99 99 00 FF 99 CC 00 FF 99'
+ 'FF 00 FF CC 00 00 FF CC 33 00 FF CC 66 00 FF CC'
+ '99 00 FF CC CC 00 FF CC FF 00 FF FF 33 00 CC FF'
+ '66 00 FF FF 99 00 FF FF CC 00 66 66 FF 00 66 FF'
+ '66 00 66 FF FF 00 FF 66 66 00 FF 66 FF 00 FF FF'
+ '66 00 21 00 A5 00 5F 5F 5F 00 77 77 77 00 86 86'
+ '86 00 96 96 96 00 CB CB CB 00 B2 B2 B2 00 D7 D7'
+ 'D7 00 DD DD DD 00 E3 E3 E3 00 EA EA EA 00 F1 F1'
+ 'F1 00 F8 F8 F8 00 F0 FB FF 00 A4 A0 A0 00 80 80'
+ '80 00 00 00 FF 00 00 FF 00 00 00 FF FF 00 FF 00'
+ '00 00 FF 00 FF 00 FF FF 00 00 FF FF FF 00 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 07 FF'
+ 'FF FF FF FF FF FF FF FF 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 07 FF'
+ '0A FF FF FF FF FF FF FF 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 07 FF'
+ '0A 0A FF FF FF FF FF FF 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 07 FF'
+ 'FF 0A 0A FF FF FF FF FF 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 07 FF'
+ 'FF 0A 0A 0A FF 0A FF FF 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 07 FF'
+ 'FF FF 0A 0A 0A 0A FF FF 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 07 FF'
+ 'FF FF FF 0A 0A 0A FF FF 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 07 FF'
+ 'FF FF 0A 0A 0A 0A FF FF 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 07 FF'
+ 'FF FF FF FF FF FF FF FF 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 07 07'
+ '07 07 07 07 07 07 07 07 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A'
+ '0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 00 1F'
+ 'FF FF 00 1F FF FF 00 1F FF FF 00 1F FF FF 00 1F'
+ 'FF FF 00 1F FF FF 00 1F FF FF 00 1F FF FF 00 1F'
+ 'FF FF 00 1F FF FF 00 1F FF FF FF FF FF FF FF FF'
+ 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF'
+ 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF'
+ 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF'
+ 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF'
+ 'FF FF FF FF FF FF FF FF FF FF FF FF FF FF 28 00'
+ '00 00 10 00 00 00 20 00 00 00 01 00 04 00 00 00'
+ '00 00 C0 00 00 00 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 80'
+ '00 00 00 80 80 00 80 00 00 00 80 00 80 00 80 80'
+ '00 00 C0 C0 C0 00 80 80 80 00 00 00 FF 00 00 FF'
+ '00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF'
+ '00 00 FF FF FF 00 00 00 00 00 00 00 00 00 7F FF'
+ 'FF 00 00 00 00 00 70 FF FF 00 00 00 00 00 7F 00'
+ 'FF 00 00 00 00 00 7F 00 FF 00 00 00 00 00 7F FF'
+ 'FF 00 00 00 00 00 77 77 77 00 00 00 00 00 00 00'
+ '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
+ '00 00 00 00 00 00 01 FF 00 00 01 FF 00 00 01 FF'
+ '00 00 01 FF 00 00 01 FF 00 00 01 FF 00 00 01 FF'
+ '00 00 FF FF 00 00 FF FF 00 00 FF FF 00 00 FF FF'
+ '00 00 FF FF 00 00 FF FF 00 00 FF FF 00 00 FF FF'
+ '00 00 FF FF 00 00'
+} */
+
 /* BINRES desktop.ico */
 IDI_SHELL_DESKTOP ICON desktop.ico
 /* {
@@ -10125,8 +10290,6 @@
  '00 07 E0 00 00 07 E0 00 00 07 FF FF FF FF FF FF'
  'FF FF FF FF FF FF'
 } */
-
-
 
 
 /*--------------------- END FIXME ------------------------*/
Index: dlls/shell32/shresdef.h
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shresdef.h,v
retrieving revision 1.16
diff -u -r1.16 shresdef.h
--- dlls/shell32/shresdef.h	25 Apr 2005 10:56:29 -0000	1.16
+++ dlls/shell32/shresdef.h	13 May 2005 07:05:49 -0000
@@ -110,6 +110,7 @@
 #define IDI_SHELL_COMPUTERS_NEAR_ME 19
 #define IDI_SHELL_SEARCH            23
 #define IDI_SHELL_HELP              24
+#define IDI_SHELL_SHORTCUT          30
 #define IDI_SHELL_EMPTY_RECYCLE_BIN 32
 #define IDI_SHELL_FULL_RECYCLE_BIN  33
 #define IDI_SHELL_DESKTOP           35



More information about the wine-patches mailing list