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