Damjan Jovanovic : winemenubuilder: Distinguish menu icons from association icons.

Alexandre Julliard julliard at winehq.org
Wed Jul 1 09:28:11 CDT 2009


Module: wine
Branch: master
Commit: fe8d913358633b4c1b44b335f517b4a5995392df
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=fe8d913358633b4c1b44b335f517b4a5995392df

Author: Damjan Jovanovic <damjan.jov at gmail.com>
Date:   Tue Jun 30 21:04:32 2009 +0200

winemenubuilder: Distinguish menu icons from association icons.

---

 programs/winemenubuilder/winemenubuilder.c |   55 ++++++++++++++++------------
 1 files changed, 31 insertions(+), 24 deletions(-)

diff --git a/programs/winemenubuilder/winemenubuilder.c b/programs/winemenubuilder/winemenubuilder.c
index 200cd0f..d9d7852 100644
--- a/programs/winemenubuilder/winemenubuilder.c
+++ b/programs/winemenubuilder/winemenubuilder.c
@@ -739,7 +739,7 @@ static BOOL create_directories(char *directory)
 }
 
 /* extract an icon from an exe or icon file; helper for IPersistFile_fnSave */
-static char *extract_icon( LPCWSTR path, int index, BOOL bWait )
+static char *extract_icon( LPCWSTR path, int index, const char *destFilename, BOOL bWait )
 {
     unsigned short crc;
     char *iconsdir = NULL, *ico_path = NULL, *ico_name, *xpm_path = NULL;
@@ -785,18 +785,35 @@ static char *extract_icon( LPCWSTR path, int index, BOOL bWait )
     crc=crc16(ico_path);
 
     /* Try to treat the source file as an exe */
-    xpm_path=HeapAlloc(GetProcessHeap(), 0, strlen(iconsdir)+1+4+1+strlen(ico_name)+1+12+1+3);
-    sprintf(xpm_path,"%s/%04x_%s.%d.png",iconsdir,crc,ico_name,index);
+    if (destFilename)
+        xpm_path=HeapAlloc(GetProcessHeap(),0,strlen(iconsdir)+1+strlen(destFilename)+1+3);
+    else
+        xpm_path=HeapAlloc(GetProcessHeap(), 0, strlen(iconsdir)+1+4+1+strlen(ico_name)+1+12+1+3);
+    if (xpm_path == NULL)
+    {
+        WINE_ERR("could not extract icon %s, out of memory\n", wine_dbgstr_a(ico_name));
+        return NULL;
+    }
+    if (destFilename)
+        sprintf(xpm_path,"%s/%s.png",iconsdir,destFilename);
+    else
+        sprintf(xpm_path,"%s/%04x_%s.%d.png",iconsdir,crc,ico_name,index);
     if (ExtractFromEXEDLL( path, index, xpm_path ))
         goto end;
 
     /* Must be something else, ignore the index in that case */
-    sprintf(xpm_path,"%s/%04x_%s.png",iconsdir,crc,ico_name);
+    if (destFilename)
+        sprintf(xpm_path,"%s/%s.png",iconsdir,destFilename);
+    else
+        sprintf(xpm_path,"%s/%04x_%s.png",iconsdir,crc,ico_name);
     if (ExtractFromICO( path, xpm_path))
         goto end;
     if (!bWait)
     {
-        sprintf(xpm_path,"%s/%04x_%s.xpm",iconsdir,crc,ico_name);
+        if (destFilename)
+            sprintf(xpm_path,"%s/%s.xpm",iconsdir,destFilename);
+        else
+            sprintf(xpm_path,"%s/%04x_%s.xpm",iconsdir,crc,ico_name);
         if (create_default_icon( xpm_path, ico_path ))
             goto end;
     }
@@ -1907,17 +1924,6 @@ static BOOL generate_associations(const char *xdg_data_home, const char *package
             }
 
             iconW = assoc_query(ASSOCSTR_DEFAULTICON, extensionW, NULL);
-            if (iconW)
-            {
-                WCHAR *comma = strrchrW(iconW, ',');
-                int index = 0;
-                if (comma)
-                {
-                    *comma = 0;
-                    index = atoiW(comma + 1);
-                }
-                iconA = extract_icon(iconW, index, FALSE);
-            }
 
             contentTypeW = assoc_query(ASSOCSTR_CONTENTTYPE, extensionW, NULL);
 
@@ -1936,18 +1942,19 @@ static BOOL generate_associations(const char *xdg_data_home, const char *package
                     /* Gnome seems to ignore the <icon> tag in MIME packages,
                      * and the default name is more intuitive anyway.
                      */
-                    if (iconA)
+                    if (iconW)
                     {
                         char *flattened_mime = slashes_to_minuses(mimeTypeA);
                         if (flattened_mime)
                         {
-                            char *dstIconPath = heap_printf("%s/icons/%s%s", xdg_data_dir,
-                                                            flattened_mime, strrchr(iconA, '.'));
-                            if (dstIconPath)
+                            int index = 0;
+                            WCHAR *comma = strrchrW(iconW, ',');
+                            if (comma)
                             {
-                                rename(iconA, dstIconPath);
-                                HeapFree(GetProcessHeap(), 0, dstIconPath);
+                                *comma = 0;
+                                index = atoiW(comma + 1);
                             }
+                            iconA = extract_icon(iconW, index, flattened_mime, FALSE);
                             HeapFree(GetProcessHeap(), 0, flattened_mime);
                         }
                     }
@@ -2098,9 +2105,9 @@ static BOOL InvokeShellLinker( IShellLinkW *sl, LPCWSTR link, BOOL bWait )
 
     /* extract the icon */
     if( szIconPath[0] )
-        icon_name = extract_icon( szIconPath , iIconId, bWait );
+        icon_name = extract_icon( szIconPath , iIconId, NULL, bWait );
     else
-        icon_name = extract_icon( szPath, iIconId, bWait );
+        icon_name = extract_icon( szPath, iIconId, NULL, bWait );
 
     /* fail - try once again after parent process exit */
     if( !icon_name )




More information about the wine-cvs mailing list